在另一个ODE中使用带有args的ODE会使代码非常复杂

2024-05-15 12:15:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我编写了以下代码。它是一个ODE,其中有一个参数作为另一个ODE。 我们可以看到M(m0,z,b,c)in在另一个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))

Tags: 代码importmodelreturndefargsmmode
1条回答
网友
1楼 · 发布于 2024-05-15 12:15:13

可以将耦合系统作为耦合系统求解

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))

在修改代码时,它会快速返回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

返回类似的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]

如果您的任务非常繁重,请使用编译的编程语言进行快速的大规模数字运算

相关问题 更多 >