用Python求解一阶和二阶微分方程组

我需要解决以下微分方程组:

$\frac{dx_1}{dt} = -k_1x_1+k_2x_2-(K_R)x_1y_1$
$\frac{dx_2}{dt} =  k_1x_1-k_2x_2-k_3x_2-(K_R)x_2y_2$
$\frac{dx_3}{dt} =  k_3x_3$
$\frac{dy_1}{dt} = -k_1y_1+k_2y_2-(K_R)x_1y_1$
$\frac{dy_2}{dt} =  k_1y_1-k_2y_2-k_3y_2-(K_R)x_2y_2$
$\frac{dy_3}{dt} =  k_3y_3$
$\frac{dz_1}{dt} = -k_1z_1+k_2z_2+(K_R)x_1y_1$
$\frac{dz_2}{dt} =  k_1z_1-k_2z_2-k_3z_2+(K_R)x_2y_2$
$\frac{dz_3}{dt} =  k_3z_3$

t = 0时的初始条件是x2 =1。在t = 1时,在y2隔室中引入化合物y,y2 =10。KR的值为1e-3。


我已经解决了使用矩阵求幂的简单得多的系统,并且想知道是否可以使用类似的方法来解决上述系统。

我有一个隔间模型系统X,其简化版本如下:

用Python求解一阶和二阶微分方程组

那么微分方程组是:

用Python求解一阶和二阶微分方程组

我可以使用以下矩阵方法来求解该方程组。

首先,我编写速率矩阵[R]。通过从[R]中获得一个新的矩阵[A],方法是先将[R]的每个对角线元素替换为每个行元素之和的负数,然后对其进行转置:

用Python求解一阶和二阶微分方程组

我可以通过执行以下操作来计算每个隔室中的量:

用Python求解一阶和二阶微分方程组

在python中:

RMatrix = model_matrix.as_matrix()
row,col = np.diag_indices_from(RMatrix)
RMatrix[row,col] = -(RMatrix.sum(axis=1)-RMatrix[row,col])
AMatrix = RMatrix.T

def content(t):
    cont = np.dot(linalg.expm(t*AMatrix),x0))

这种方法对我来说很好。


上面的模型(最初的问题)比系统X复杂一些。在该模型中,系统X和Y的第1和第2隔室中的反应物结合在一起,从而在系统Z中得到产物。

X + Y-> Z,反应常数为KR。

用Python求解一阶和二阶微分方程组

,相应的微分方程组将是:

用Python求解一阶和二阶微分方程组

我正在努力解决这种微分方程组(一阶和二阶)的方法,以便在给定初始条件KR和传输速率k1,k2, k3等...

对于一阶微分方程组,我可以使用上述矩阵方法求解吗?我在Python中还有哪些其他选择?

谢谢!

liran911 回答:用Python求解一阶和二阶微分方程组

正如评论中所指出的,您的(更复杂的)ODE是非线性的。因此,矩阵指数方法将不再起作用。

通常,有两种解决ODE的一般方法。首先,您可以尝试找到一种符号解决方案。在大多数情况下,您将根据有根据的猜测采取某种方法。已知几种ODE类型的符号解决方案。

但是,绝大多数ODE并非如此。因此,我们通常用一个数值解决方案来抗衡自己,本质上是基于右侧对ODE进行数值积分。

结果不是显式函数,而是某个点上函数值的近似值。在python中,您可以使用scipy来解决ODE问题。 基于您的右侧(除非出现我的任何错误),这看起来像这样:

import numpy as np

import scipy.integrate 

k_1 = 1
k_2 = 1
k_3 = 1
K_R = 1

def eval_f(v,t):
    [x,y,z] = np.split(v,[3,6])

    return np.array([-k_1*x[0] +k_2*x[1] - (K_R)*x[0]*y[0],k_1*x[0] - k_2*x[1] - k_3*x[1] - (K_R)*x[1]*y[1],k_3*x[2],- k_1*y[0] + k_2*y[1] - (K_R)*x[0]*y[0],k_1*y[0] - k_2*y[1] - k_3*y[1] - (K_R)*x[1]*y[1],k_3*y[2],- k_1*z[0] + k_2*z[1] + (K_R)*x[0]*y[0],k_1*z[0] - k_2*z[1] - k_3*z[1] + (K_R)*x[1]*y[1],k_3*z[2]])

initial = np.array([1,2,3,4,5,6,7,8,9])

t = np.linspace(0,1,10)

values = scipy.integrate.odeint(eval_f,initial,t)

# variable x[0]
print(values[:,0])

这将产生以下x1值:

[1.         0.70643591 0.49587121 0.35045691 0.25034256 0.1809533
 0.13237994 0.09800056 0.07338967 0.05557138]

基于网格点

[0.         0.11111111 0.22222222 0.33333333 0.44444444 0.55555556
 0.66666667 0.77777778 0.88888889 1.        ]

如果您想查看函数的行为,积分器可能就足够了。否则,我建议您在教科书中阅读有关ODE的符号方法...

本文链接:https://www.f2er.com/2548058.html

大家都在问