我试图用solve_ivp
解一个大的微分方程组
from scipy import integrate
sol = integrate.solve_ivp(func_system, (0,100), initial_value_array, t_eval)
func_system
是一个微分方程系统,必须从CSV文件中推断,其示例如下:
From,To,Rate
Blood,Other_3,3.0000E+02
Blood,Blood_5,7.0000E+02
Blood_5,Liver_1,4.6200E-01
Blood_5,C-bone-S,8.7780E-02
Blood_5,C-bone-V,4.6200E-03
Blood_5,T-bone-S,1.2474E-01
Blood_5,T-bone-V,1.3860E-02
Blood_5,UB-cont,1.5400E-02
Blood_5,Kidneys_1,7.7000E-03
Blood_5,Kidneys_2,3.8500E-04
Blood_5,RC-cont,1.1550E-02
Blood_5,Testes,2.6950E-04
Blood_5,Ovaries,8.4700E-05
Blood_5,Other_4,1.8511E-02
Blood_5,Other_5,2.3100E-02
Other_3,Blood_5,9.9000E-02
Blood_4,UB-cont,3.5000E+00
Blood_4,Blood_5,6.7550E+01
Blood_4,Other_3,2.8950E+01
Kidneys_1,UB-cont,1.7329E-02
Kidneys_2,Blood_4,1.2660E-04
Other_4,Blood_4,1.3860E-03
Other_5,Blood_4,1.2660E-04
Liver_1,SI-cont,9.2420E-04
Liver_1,Liver_2,4.5286E-02
[...]
微分方程,例如隔室Liver_1
,应为:
dLiver_1/dt = 0.462*Blood_5 - 0.000924*Liver_1 - 0.045286*Liver_1
它必须写在func_system
内,如下所示
dLiver_1_dt = 0.462*Blood_5 - 0.000924*Liver_1 - 0.045286*Liver_1
其中,0.462是从Blood_5
到Liver_1
的速率,0.000924和0.045286是远离Liver_1
的速率
有没有一种方法可以创建所有这些方程(我总共有150多个),而不必实际编写它们? 我可以使用矩阵方法,但我还需要添加另一个非线性微分方程组
我不知道.solve_ivp()是如何工作的,但是如果你只想得到方程的字符串表示形式,我会做以下工作
输出
另外,如果你想一次得到所有的方程式
这给了我们输出
我认为这足以让你走,这样你就可以找到它,但它可能不完全是你想要的,因为奇怪的线条,如:
这对我来说似乎没什么意义
我编写了一个名为JiTCODE的模块,它允许您以符号形式指定微分方程。这对您来说很方便,因为它主要负责将您的方程转换为函数。此外,在实际积分过程中,函数求值将非常有效,因为它是用C硬编码的。如果你有150个方程,这可能很重要
针对您的具体问题,我会这样做:
一些注意事项:
包括不同的非线性组件应该很简单
我在这里打印输出,但您可以用不同的方式存储和处理输出
您还可以使用^{} 使用您的标识符作为字典访问解决方案(通过
dynvars
)。这样,您就不需要直接处理动态变量的编号基本的简化如
将由SymEngine(象征性主干)在引擎盖下动态完成
JiTCODE在引擎盖下使用
scipy.integrate.ode
或solve_ivp
相关问题 更多 >
编程相关推荐