我正在尝试应用欧拉方法来求解以下微分方程:
dA/dt=-k/2*Ca*Cc;
dB/dt=-k*Ca*Cc;
dD/dt=k*Ca*Cc
我想得到[[t0,t2,…],[[A0,B0,D0],[A1,B1,D1],…]]其中A0、B0和C0是在时间t0(与A1、B1、D1相同,但与t1…相同(的每个产物的浓度
但我总是遇到这样的错误:
Traceback (most recent call last):
File "<ipython-input-58-7025b89a5cfb>", line 1, in <module>
runfile('C:/Users/catas/OneDrive/Desktop/ER_trab/simulator2_letshopethisworks.py', wdir='C:/Users/catas/OneDrive/Desktop/ER_trab')
File "C:UserscatasAnaconda3libsite-packagesspyder_kernelscustomizespydercustomize.py", line 827, in runfile
execfile(filename, namespace)
File "C:UserscatasAnaconda3libsite-packagesspyder_kernelscustomizespydercustomize.py", line 110, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "C:/Users/catas/OneDrive/Desktop/ER_trab/simulator2_letshopethisworks.py", line 70, in <module>
print(euler(react,0,C0,60,60))
File "C:/Users/catas/OneDrive/Desktop/ER_trab/simulator2_letshopethisworks.py", line 60, in euler
C0[0] += h * f(t0, C0[0]) #calculos das aproximacoes y
File "C:/Users/catas/OneDrive/Desktop/ER_trab/simulator2_letshopethisworks.py", line 44, in react
dAdt=-k/2*C0[1:][0]*C0[1:][2] #velocidade de consumo de A
IndexError: list index out of range
这是我的代码:
from math import e
initCa=9
initCb=9
initCc=3
initCd=0
C0=[initCa,initCb,initCd]
def react(t,C): #are t and T optional???
k=k0*e**(-Ea/(R*T))
dAdt=-k/2*C0[1:][0]*C0[1:][2] #velocidade de consumo de A
dBdt=-k*C0[1:][0]*C0[1:][2]#velocidade de consumo de B
dDdt=k*C0[1:][0]*C0[1:][2] #velocidade de formacao de D
return [dAdt,dBdt,dDdt]
def euler(f,t, C, tn, n):
t0=0
listat=[t0] #lista t inicial
listay=[C0] #lista y inicial
h = (tn - t0) / float(n) #step
for i in range(n):
C0[0] += h * f(t0, C0[0]) #y
C0[1] += h * f(t0, C0[1])
C0[2] += h * f(t0, C0[2])
t0 += h #calculo dos tempos
listat.append(format(t0,".14E")) #times list
listay[i].append(C0) #aproximations list
return [format(h,".14E"),C0,[listat,listay]]
print(euler(react,0,C0,60,60))
我不明白怎么解决这个问题?
谢谢!
此处:
C0[0] += h * f(t0, C0[0])
获取C0
的单个元素,并将其传递给步骤函数(react
(。显然,这些项目是整数。
然而,在该功能范围内:
Ca=C[0]
您显然希望接收整个C0
列表,以便从中提取Ca
等。C
是作为整数传递的,因此C[0]
失败,如错误消息所述。
您需要更清楚地思考您的程序逻辑,以及流程的哪些步骤将在哪里发生。