在带有 args 的另一个 ODE 中使用一个 ODE 会使代码非常非常慢
Using a ODE in another ODE with args make the code very very slow
我写了下面的代码。它是一个 ODE
,其中有一个参数作为另一个 ODE。
正如我们所看到的 M(m0,z,b,c)
在另一个 ODE
中的使用,它本身就是一个 ODE
函数。代码很慢,谁能给我建议如何改进它?
import numpy as np
from scipy.integrate import odeint
def model(m,z,c,b):
dmdt = ((c**2-m)/(1+z))*(6-9*(m/c**2)+3*b*(m+(m**2)))
return dmdt
def M(m0,z,c,b):
m = odeint(model,m0,[0,z], args= (c, b))
mm=m[-1,0]
return mm
def model1(H ,z,m0,c,b):
c = 0.6
b=0.035
dHdt = (H/(1+z))*(6-9*(M(m0,z,c,b)/c**2)+3*b*(M(m0,z,c,b)+(M(m0,z,c,b)**2)))
return dHdt
def model2(H0,z,m0,c,b):
H = odeint(model1,H0,[0,z], args=(m0,c,b))
HH=H[-1,0]
return HH
print(model2(70,1,0.75,0.69,0.035))
您可以将耦合系统作为耦合系统求解。
def model(U,z,c,b):
M, H = U
dMdt = ((c**2-M)/(1+z))*(6-9*(M/c**2)+3*b*(M+M**2))
dHdt = (H /(1+z))*(6-9*(M/c**2)+3*b*(M+M**2))
return [dMdt, dHdt]
def solution(H0,z,m0,c,b):
U = odeint(model,[m0,H0],[0,z], args=(c,b))[-1]
M, H = U
return H
print(solution(70,1,0.75,0.69,0.035))
迅速 returns 0.107569653042
而您的代码经过修改
def model1(H, z, m0, c, b):
mm = M(m0,z,c,b)
dHdt = (H/(1+z))*(6-9*(mm/c**2)+3*b*(mm+(mm)**2)))
return dHdt
returns 类似0.107569746892
稍微慢一点。这6位重合数字符合默认容错度1e-6
.
要获得更准确的结果,请设置误差容限的控制参数 atol, rtol
。
如需进一步减少操作,请执行
def model(U,z,c,b):
M, H = U
factor = (6-9*M/c**2+3*b*(M+M**2))/(1+z)
return [(c**2-M)*factor, H*factor]
如果您的任务真的很庞大,请使用编译过的编程语言来快速处理大量数字。
我写了下面的代码。它是一个 ODE
,其中有一个参数作为另一个 ODE。
正如我们所看到的 M(m0,z,b,c)
在另一个 ODE
中的使用,它本身就是一个 ODE
函数。代码很慢,谁能给我建议如何改进它?
import numpy as np
from scipy.integrate import odeint
def model(m,z,c,b):
dmdt = ((c**2-m)/(1+z))*(6-9*(m/c**2)+3*b*(m+(m**2)))
return dmdt
def M(m0,z,c,b):
m = odeint(model,m0,[0,z], args= (c, b))
mm=m[-1,0]
return mm
def model1(H ,z,m0,c,b):
c = 0.6
b=0.035
dHdt = (H/(1+z))*(6-9*(M(m0,z,c,b)/c**2)+3*b*(M(m0,z,c,b)+(M(m0,z,c,b)**2)))
return dHdt
def model2(H0,z,m0,c,b):
H = odeint(model1,H0,[0,z], args=(m0,c,b))
HH=H[-1,0]
return HH
print(model2(70,1,0.75,0.69,0.035))
您可以将耦合系统作为耦合系统求解。
def model(U,z,c,b):
M, H = U
dMdt = ((c**2-M)/(1+z))*(6-9*(M/c**2)+3*b*(M+M**2))
dHdt = (H /(1+z))*(6-9*(M/c**2)+3*b*(M+M**2))
return [dMdt, dHdt]
def solution(H0,z,m0,c,b):
U = odeint(model,[m0,H0],[0,z], args=(c,b))[-1]
M, H = U
return H
print(solution(70,1,0.75,0.69,0.035))
迅速 returns 0.107569653042
而您的代码经过修改
def model1(H, z, m0, c, b):
mm = M(m0,z,c,b)
dHdt = (H/(1+z))*(6-9*(mm/c**2)+3*b*(mm+(mm)**2)))
return dHdt
returns 类似0.107569746892
稍微慢一点。这6位重合数字符合默认容错度1e-6
.
要获得更准确的结果,请设置误差容限的控制参数 atol, rtol
。
如需进一步减少操作,请执行
def model(U,z,c,b):
M, H = U
factor = (6-9*M/c**2+3*b*(M+M**2))/(1+z)
return [(c**2-M)*factor, H*factor]
如果您的任务真的很庞大,请使用编译过的编程语言来快速处理大量数字。