如何解决如何使用solve_ivp求解复杂的矩阵微分方程?
我想解一个复矩阵微分方程 y' = Ay。
import numpy as np
from scipy.integrate import solve_ivp
def deriv(y,t,A):
return np.dot(A,y)
A = np.array([[-0.25 + 0.14j,0.33 + 0.44j],[ 0.25 + 0.58j,-0.2 + 0.14j,0],[ 0,0.2 + 0.4j,-0.1 + 0.97j]])
time = np.linspace(0,25,101)
y0 = np.array([[2,3,4],[5,6,7],[9,34,78]])
result = solve_ivp(deriv,y0,time,args=(A,))
对于“odeint”似乎已经有了答案。 https://stackoverflow.com/a/45970853/7952027
https://stackoverflow.com/a/26320130/7952027
https://stackoverflow.com/a/26747232/7952027
https://stackoverflow.com/a/26582411/7952027
我很好奇是否可以使用 Scipy 的任何新 API 来完成?
解决方法
我已经更新了您的代码段,请看下面。您应该仔细检查 doc,因为我相信那里的所有内容都非常详细。
import numpy as np
from scipy.integrate import solve_ivp
def deriv_vec(t,y):
return A @ y
def deriv_mat(t,y):
return (A @ y.reshape(3,3)).flatten()
A = np.array([[-0.25 + 0.14j,0.33 + 0.44j],[0.25 + 0.58j,-0.2 + 0.14j,0],[0,0.2 + 0.4j,-0.1 + 0.97j]])
result = solve_ivp(deriv_vec,25],np.array([10 + 0j,20 + 0j,30 + 0j]),t_eval=np.linspace(0,25,101))
print(result.y[:,0])
# [10.+0.j 20.+0.j 30.+0.j]
print(result.y[:,-1])
# [18.46+45.25j 10.01+36.23j -4.98+80.07j]
y0 = np.array([[2 + 0j,3 + 0j,4 + 0j],[5 + 0j,6 + 0j,7 + 0j],[9 + 0j,34 + 0j,78 + 0j]])
result = solve_ivp(deriv_mat,y0.flatten(),0].reshape(3,3))
# [[ 2.+0.j 3.+0.j 4.+0.j]
# [ 5.+0.j 6.+0.j 7.+0.j]
# [ 9.+0.j 34.+0.j 78.+0.j]]
print(result.y[:,-1].reshape(3,3))
# [[ 5.67+12.07j 17.28+31.03j 37.83+63.25j]
# [ 3.39+11.82j 21.32+44.88j 53.17+103.80j]
# [ -2.26+22.19j -15.12+70.191j -38.34+153.29j]]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。