求解 Python 中的递归微分方程组
Solve system of recursive differential equation in Python
所以我正在尝试求解 Python 中的以下微分方程组。
System of differential equations
如您所见,对于 {0,1,2,3,...} 中的每个 n,系统都依赖于先前系统的解决方案。
我已经尝试求解 n=0 的系统,并找到了一个解决方案 R(0|t),我可以将其插入 R(1|t) 并且 Python 可以毫无问题地求解系统。我已经将解决方案 R(0|t) 定义为 r0(t) 并实现了 n=1 的解决方案,如下所示:
def model(z,t):
dxdt = -3.273*z[0] + 3.2*z[1] + r0(t)
dydt = 3.041*z[0] - 3.041*z[1]
dzdt = [dxdt, dydt]
return dzdt
z0 = [0,0]
t = np.linspace(0,90, 90)
z1 = odeint(model, z0, t)
但是我想通过在求解 n 时调用 n-1 的系统解决方案来推广此解决方案。由于微分方程只有矩阵右上角的项不为零,我们只需要从前面的解中得到 z1 的解。我试过了
def model0(z,t):
dxdt = -3.273*z[0] + 3.2*z[1]
dydt = 3.041*z[0] - 3.041*z[1]
dzdt = [dxdt, dydt]
return dzdt
z0 = [1,1]
t = np.linspace(0,90)
def model1(z,t):
dxdt = -3.273*z[0] + 3.2*z[1] + 0.071*odeint(model0, z0, t)[t,1]
dydt = 3.041*z[0] - 3.041*z[1]
dzdt = [dxdt, dydt]
return dzdt
z1 = [0,0]
z = odeint(model1, z1, t)
运气不好。在 Python 中有没有人有解决这些递归系统的经验?
提前致谢。
更新了 6x6 矩阵和 6 函数的代码:
A = np.array([[h1h1, h1h2, h1h3, h1a1, h1a2, h1a3],
[h2h1, h2h2, h2h3, h2a1, h2a2, h2a3],
[h3h1, h2h3, h3h3, h3a1, h3a2, h3a3],
[a1h1, a1h2, a1h3, a1a1, a1a2, a1a3],
[a2h1, a2h2, a2h3, a2a1, a2a2, a2a3],
[a3h1, a3h2, a3h3, a3a1, a3a2, a3a3]
])
B = np.array([[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, h3a0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
])
def model0n(u,t):
Ra = u.reshape([-1,6])
n = len(Ra) - 1
dRa = np.zeros(Ra.shape)
dRa[0] = A @ Ra[0]
for i in range(1,n+1):
dRa[i] = A @ Ra[i] + B @ Ra[i-1]
return dRa.flatten()
u0 = [1,1,1,1,1,1,0,0,0,0,0,0]
t = np.linspace(0,90,90+1)
u = odeint(model0n,u0,t)
上面的结果是 u[:,0] 的下图:
Plot for u[:,0] which is supposed to be probabilities
对于 n=0,它提供矩阵乘积的结果 'manualy':
def modeln0manually(z,t):
d1dt = h1h1*z[0] + h1h2 * z[1] + h1h3*z[2] + h1a1*z[3] + h1a2*z[4] + h1a3*z[5]
d2dt = h2h1*z[0] + h2h2 * z[1] + h2h3*z[2] + h2a1*z[3] + h2a2*z[4] + h2a3*z[5]
d3dt = h3h1*z[0] + h3h2 * z[1] + h3h3*z[2] + h3a1*z[3] + h3a2*z[4] + h3a3*z[5]
d4dt = a1h1*z[0] + a1h2 * z[1] + a1h3*z[2] + a1a1*z[3] + a1a2*z[4] + a1a3*z[5]
d5dt = a2h1*z[0] + a2h2 * z[1] + a2h3*z[2] + a2a1*z[3] + a2a2*z[4] + a2a3*z[5]
d6dt = a3h1*z[0] + a3h2 * z[1] + a3h3*z[2] + a3a1*z[3] + a3a2*z[4] + a3a3*z[5]
drdt = [d1dt, d2dt, d3dt, d4dt, d5dt, d6dt]
return drdt
u0 = [1,1,1,1,1,1]
t = np.linspace(0,90)
z = odeint(modeln0manually, u0, t)
导致 u[:,0] 的绘图:
Plot of u[:,0] as it is supposed to be
你的系统是耦合的,即使是三角耦合。所以最紧凑的方式就是将其作为耦合系统求解
A = np.array([[-3.273, 3.2], [3.041, -3.041]])
B = np.array([[0, 0.071], [0, 0]])
def model0n(u,t):
Ra = u.reshape([-1,2])
n = len(Ra) - 1
dRa = np.zeros(Ra.shape)
dRa[0] = A @ Ra[0]
for i in range(1,n+1):
dRa[i] = A @ Ra[i] + B @ Ra[i-1]
return dRa.flatten()
u0 = [1,1,0,0]
t = np.linspace(0,90,90+1)
u = odeint(model0n,u0,t)
所以我正在尝试求解 Python 中的以下微分方程组。
System of differential equations
如您所见,对于 {0,1,2,3,...} 中的每个 n,系统都依赖于先前系统的解决方案。
我已经尝试求解 n=0 的系统,并找到了一个解决方案 R(0|t),我可以将其插入 R(1|t) 并且 Python 可以毫无问题地求解系统。我已经将解决方案 R(0|t) 定义为 r0(t) 并实现了 n=1 的解决方案,如下所示:
def model(z,t):
dxdt = -3.273*z[0] + 3.2*z[1] + r0(t)
dydt = 3.041*z[0] - 3.041*z[1]
dzdt = [dxdt, dydt]
return dzdt
z0 = [0,0]
t = np.linspace(0,90, 90)
z1 = odeint(model, z0, t)
但是我想通过在求解 n 时调用 n-1 的系统解决方案来推广此解决方案。由于微分方程只有矩阵右上角的项不为零,我们只需要从前面的解中得到 z1 的解。我试过了
def model0(z,t):
dxdt = -3.273*z[0] + 3.2*z[1]
dydt = 3.041*z[0] - 3.041*z[1]
dzdt = [dxdt, dydt]
return dzdt
z0 = [1,1]
t = np.linspace(0,90)
def model1(z,t):
dxdt = -3.273*z[0] + 3.2*z[1] + 0.071*odeint(model0, z0, t)[t,1]
dydt = 3.041*z[0] - 3.041*z[1]
dzdt = [dxdt, dydt]
return dzdt
z1 = [0,0]
z = odeint(model1, z1, t)
运气不好。在 Python 中有没有人有解决这些递归系统的经验?
提前致谢。
更新了 6x6 矩阵和 6 函数的代码:
A = np.array([[h1h1, h1h2, h1h3, h1a1, h1a2, h1a3],
[h2h1, h2h2, h2h3, h2a1, h2a2, h2a3],
[h3h1, h2h3, h3h3, h3a1, h3a2, h3a3],
[a1h1, a1h2, a1h3, a1a1, a1a2, a1a3],
[a2h1, a2h2, a2h3, a2a1, a2a2, a2a3],
[a3h1, a3h2, a3h3, a3a1, a3a2, a3a3]
])
B = np.array([[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, h3a0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
])
def model0n(u,t):
Ra = u.reshape([-1,6])
n = len(Ra) - 1
dRa = np.zeros(Ra.shape)
dRa[0] = A @ Ra[0]
for i in range(1,n+1):
dRa[i] = A @ Ra[i] + B @ Ra[i-1]
return dRa.flatten()
u0 = [1,1,1,1,1,1,0,0,0,0,0,0]
t = np.linspace(0,90,90+1)
u = odeint(model0n,u0,t)
上面的结果是 u[:,0] 的下图: Plot for u[:,0] which is supposed to be probabilities
对于 n=0,它提供矩阵乘积的结果 'manualy':
def modeln0manually(z,t):
d1dt = h1h1*z[0] + h1h2 * z[1] + h1h3*z[2] + h1a1*z[3] + h1a2*z[4] + h1a3*z[5]
d2dt = h2h1*z[0] + h2h2 * z[1] + h2h3*z[2] + h2a1*z[3] + h2a2*z[4] + h2a3*z[5]
d3dt = h3h1*z[0] + h3h2 * z[1] + h3h3*z[2] + h3a1*z[3] + h3a2*z[4] + h3a3*z[5]
d4dt = a1h1*z[0] + a1h2 * z[1] + a1h3*z[2] + a1a1*z[3] + a1a2*z[4] + a1a3*z[5]
d5dt = a2h1*z[0] + a2h2 * z[1] + a2h3*z[2] + a2a1*z[3] + a2a2*z[4] + a2a3*z[5]
d6dt = a3h1*z[0] + a3h2 * z[1] + a3h3*z[2] + a3a1*z[3] + a3a2*z[4] + a3a3*z[5]
drdt = [d1dt, d2dt, d3dt, d4dt, d5dt, d6dt]
return drdt
u0 = [1,1,1,1,1,1]
t = np.linspace(0,90)
z = odeint(modeln0manually, u0, t)
导致 u[:,0] 的绘图: Plot of u[:,0] as it is supposed to be
你的系统是耦合的,即使是三角耦合。所以最紧凑的方式就是将其作为耦合系统求解
A = np.array([[-3.273, 3.2], [3.041, -3.041]])
B = np.array([[0, 0.071], [0, 0]])
def model0n(u,t):
Ra = u.reshape([-1,2])
n = len(Ra) - 1
dRa = np.zeros(Ra.shape)
dRa[0] = A @ Ra[0]
for i in range(1,n+1):
dRa[i] = A @ Ra[i] + B @ Ra[i-1]
return dRa.flatten()
u0 = [1,1,0,0]
t = np.linspace(0,90,90+1)
u = odeint(model0n,u0,t)