【问题标题】:How to solve complex matrix differential equations using solve_ivp?如何使用solve_ivp求解复杂的矩阵微分方程?
【发布时间】:2021-04-23 20:50:39
【问题描述】:

我想解一个复矩阵微分方程 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,  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 来完成?

【问题讨论】:

    标签: python scipy


    【解决方案1】:

    我已经更新了你的 sn-p,请看下面。您应该仔细检查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, 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_ivp 完成后重新调整解决方案。还是我错过了什么?
    • 只要在原始调用和函数的返回调用中都为solve_ivp 提供向量,就可以了。您可以在函数内进行任何整形以执行矩阵运算。
    • 我不确定你是否理解我的意思。我已经更新了sn-p。如果现在更清楚,请告诉我。
    • 根据我的经验,@Lutz Lehmann 和 @Warren Weckesser 的 cmets 和答案一直让我受益匪浅,所以我认为您应该听听他们的意见。我的额外建议是让您阅读solve_ivp 框架的源代码,我发现它非常直观,并且包含对已发布作品的引用。
    猜你喜欢
    • 2018-02-08
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 2018-10-28
    • 2021-04-22
    • 2021-06-19
    • 2019-09-17
    相关资源
    最近更新 更多