gpt4 book ai didi

python - 重构代码以便使用 3 个值来制作绘图和元组索引必须是整数,而不是 float

转载 作者:行者123 更新时间:2023-12-01 06:03:41 26 4
gpt4 key购买 nike

我有一个代码,其中对于 3 个不同的 D 值,我有 3 个不同的 dx 值,因此,3 个不同的图。

我想做一个将所有 3 个图合而为一的图。

...
D=(0.133e-4,0.243e-4,0.283e-4)

dx=sc.zeros(3)
for i in D:
dx[i]=sc.sqrt(D[i]*dt/M)

plt.ion()
while n<N:
Vw_n=Vw_n1
C_n=C_n1
R2=(Vw_n+B1)/(Vw_0+B1)
Cc=C_n1[0]/C0
F2_1=10000/3*Pw*A*(C0*Vw_0/Vw_n1-C_n[1])
dV=F2_1*dt
Vw_n1=Vw_n+dV
C_n1[0]=C0*Vw_0/Vw_n1
F_i_2=-D[i]/dx[i]*(C_n[1:7]-C_n[0:6])
C_n1[0:6]=C_n[0:6]-F_i_2*A*dt/(L/(V0/A)*V0/5)
n+=1
ttime=n*0.02*1000

#-----PLOT AREA---------------------------------#

mylabels=('T=273','T=293','T=298')
colors=('-b','or','+k')

if x==1:
plt.plot(ttime,R2,mylabels[i],colors[i])
elif x==2:
plt.plot(ttime,Cc,mylabels[i],colors[i])
plt.draw()
plt.show()

----------可运行--------------------------

import scipy as sc
import matplotlib.pyplot as plt


def graph(x):

A=1.67e-6
V0=88e-12
Vw_n1=71.7/100*V0
Pw=0.22
L=4e-4
B1=V0-Vw_n1

C7=0.447e-3



dt=0.2e-4
M=0.759e-1

C_n1=sc.zeros(7)
C_n1[0:6]=0.290e-3
C_n1[6]=0.447e-3


C0=C_n1[0]
Vw_0=Vw_n1

N=2000
n =1
D = ,0.243e-4
dx = sc.sqrt(D*dt/M)

plt.ion()
while n<N:
Vw_n=Vw_n1
C_n=C_n1
R2=(Vw_n+B1)/(Vw_0+B1)
Cc=C_n1[0]/C0
F2_1=10000/3*Pw*A*(C0*Vw_0/Vw_n1-C_n[1])
dV=F2_1*dt
Vw_n1=Vw_n+dV
C_n1[0]=C0*Vw_0/Vw_n1
F_i_2=-D/dx*(C_n[1:7]-C_n[0:6])
C_n1[0:6]=C_n[0:6]-F_i_2*A*dt/(L/(V0/A)*V0/5)
n+=1
ttime=n*0.02*1000

#-----PLOT AREA---------------------------------#


if x==1:
plt.plot(ttime,R2)
elif x==2:
plt.plot(ttime,Cc)
plt.draw()
plt.show()

我的问题是我想绘制(ttime,R2)和(ttime,Cc)。但我不知道如何为 D(和 dx)的 3 个不同值调用 R2 和 Cc。

另外,我犯了一个错误:元组索引必须是整数,而不是 float

在 dx[i]=sc.sqrt(D[i]*dt/M)。

谢谢!

最佳答案

考虑这些行:

D=(0.133e-4,0.243e-4,0.283e-4)
for i in D:
dx[i]=sc.sqrt(D[i]*dt/M)

i 是一个 float 。它不能用作元组D 的索引。(D[i] 没有意义。)

也许你的意思是

D=(0.133e-4,0.243e-4,0.283e-4)
for i, dval in enumerate(D):
dx[i] = sc.sqrt(dval*dt/M)

或者,简单地说

import scipy as sc
D = sc.array([0.133e-4,0.243e-4,0.283e-4])
dx = sc.sqrt(D*dt/M)
<小时/>
  • 不要为每个点调用一次plt.plot。这条路通向行为迟缓。相反,累积整条曲线的值(value)数据点,然后为整个曲线调用一次 plt.plot
  • 要在同一个图形上绘制 3 条曲线,只需调用 plt.plot 3 次即可。在调用 plt.show() 之前先执行此操作。
  • 当您为 x 输入 1 时,while not flag 循环并未结束,因为 if x==2 应该是 elif x==2
  • 要对 matplotlib 绘图进行动画处理,您仍应尽量避免多个调用plt.plot。相反,使用一次 plt.plot 来制作 Line2D对象,然后通过调用更新底层数据line.set_xdataline.set_ydata。请参阅Joe Kington's example这个例子来自 matplotlib docs .
<小时/>
import scipy as sc
import matplotlib.pyplot as plt

def graph(x):
plt.ion()
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
lines = []
D = (0.133e-4, 0.243e-4, 0.283e-4)
temperatures = ('T = 273','T = 293','T = 298')
N = 2000
linestyles = ('ob', '-r', '+m')
for dval, linestyle, temp in zip(D, linestyles, temperatures):
line, = ax.plot([], [], linestyle, label = temp)
lines.append(line)
plt.xlim((0, N*0.02*1000))
if x == 1:
plt.ylim((0.7, 1.0))
else:
plt.ylim((1.0, 1.6))
plt.legend(loc = 'best')
for dval, line in zip(D, lines):
A = 1.67e-6
V0 = 88e-12
Vw_n1 = 71.7/100*V0
Pw = 0.22
L = 4e-4
B1 = V0-Vw_n1
C7 = 0.447e-3
dt = 0.2e-4
M = 0.759e-1
C_n1 = sc.zeros(7)
C_n1[0:6] = 0.290e-3
C_n1[6] = 0.447e-3
C0 = C_n1[0]
Vw_0 = Vw_n1

tvals = []
yvals = []
dx = sc.sqrt(dval*dt/M)
for n in range(1, N+1, 1):
Vw_n = Vw_n1
C_n = C_n1
R2 = (Vw_n+B1)/(Vw_0+B1)
Cc = C_n1[0]/C0
F2_1 = 10000/3*Pw*A*(C0*Vw_0/Vw_n1-C_n[1])
dV = F2_1*dt
Vw_n1 = Vw_n+dV
C_n1[0] = C0*Vw_0/Vw_n1
F_i_2 = -dval/dx*(C_n[1:7]-C_n[0:6])
C_n1[0:6] = C_n[0:6]-F_i_2*A*dt/(L/(V0/A)*V0/5)
tvals.append(n*0.02*1000)
yvals.append(R2 if x == 1 else Cc)
if not len(yvals) % 50:
line.set_xdata(tvals)
line.set_ydata(yvals)
fig.canvas.draw()

if __name__ == "__main__":
flag = False
while not flag:
try:
x = int(raw_input("Give a choice 1 or 2 : "))
flag = True
if x == 1:
plt.title('Change in cell volume ratio as a function of time \n\
at various temperatures')
plt.xlabel('Time')
plt.ylabel('Ceil volume ratio (V/V0)')
graph(x)
elif x == 2:
plt.title('Increase of solute concentration at various temperatures')
plt.xlabel('Time')
plt.ylabel('Solute concentration in the Ceil (Cc)')
graph(x)
else:
flag = False
print("You must input 1 or 2")
except ValueError:
print("You must input 1 or 2")
raw_input('Press a key when done')

关于python - 重构代码以便使用 3 个值来制作绘图和元组索引必须是整数,而不是 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9083767/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com