Python 如何使用solve_ivp求解复杂矩阵微分方程?
我想解一个复矩阵微分方程y'=AyPython 如何使用solve_ivp求解复杂矩阵微分方程?,python,scipy,Python,Scipy,我想解一个复矩阵微分方程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, 0.33 + 0.44j], [ 0.25 + 0.58j, -0.2 + 0.14j, 0], [ 0,
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, 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”,似乎已经有了答案。
我很好奇是否可以用Scipy的任何新API来实现这一点?我已经更新了您的代码片段,请看下面。你应该仔细检查,因为我相信,那里的一切都很详细
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, 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, [0, 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, [0, 25], y0.flatten(),
t_eval=np.linspace(0, 25, 101))
print(result.y[:, 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]]
实际上,我想知道新API是否可以处理复杂矩阵微分方程,这里您已经对复杂向量y进行了处理。
y
必须是一个向量,但您可以始终在函数中处理矩阵,然后在返回调用中展平结果,最后在solve\u ivp
完成后重塑解决方案。还是我遗漏了什么?只要您在原始调用和函数的返回调用中都使用向量提供solve\u ivp
,您就会做得很好。你可以在函数中做任何重塑来执行矩阵运算。我不确定你是否理解我的观点。我已经更新了这个片段。请让我知道现在是否更清楚。根据我的经验,我一直受益于@Lutz Lehmann和@Warren Weckesser的评论和回答,所以我认为你应该听他们的。我的补充建议是让您阅读solve\u ivp
框架的源代码,我发现它非常直观,并且包含对已发表作品的引用。