在带有 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]

如果您的任务真的很庞大,请使用编译过的编程语言来快速处理大量数字。