用python解决ode得到错误的解决方案

时间:2018-02-02 02:40:01

标签: python numpy scipy ode differential-equations

我想解决以下颂歌

  

K T + C T'= Q

给出示例数据是我的代码

import numpy as np
import scipy as sp
# Solve the following ODE
# K*T + C*T' = Q
# T' = C^-1 ( Q - K * T )
T_start=sp.array([ 151.26,  132.18,  131.64,  146.55,  147.87,  137.87])

K = sp.array([[-0.01761969,  0.02704873,  0.00572222,  0.        ,  0.        ,
         0.        ],
       [ 0.02704873, -0.03546941,  0.        ,  0.        ,  0.00513177,
         0.        ],
       [ 0.00572222,  0.        ,  0.03001858, -0.04752982,  0.        ,
         0.02030505],
       [ 0.        ,  0.        , -0.04752982,  0.0444405 ,  0.00308932,
         0.        ],
       [ 0.        ,  0.00513177,  0.        ,  0.00308932,  0.02629577,
        -0.01793915],
       [ 0.        ,  0.        ,  0.02030505,  0.        , -0.01793915,
         0.00084506]])
Q = sp.array([ 1.66342077,  0.16187956,  0.65115035, 0.71274755,2.54614269,  0.13680399])

C_invers = sp.array([[ 3.44827586,  0.        ,  0.        ,  0.        ,  0.        ,
        -0.        ],
       [ 0.        ,  1.5625    ,  0.        ,  0.        ,  0.        ,
        -0.        ],
       [ 0.        ,  0.        ,  2.63157895,  0.        ,  0.        ,
        -0.        ],
       [ 0.        ,  0.        ,  0.        ,  2.17391304,  0.        ,
        -0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.        ,  1.63934426,
        -0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
         2.38095238]])

time = np.linspace(0, 20, 10000)

#T_real = sp.array([[ 151.26,  132.18,  131.64,  146.55,  147.87,  137.87]])

def deriv(T, t):
    return sp.dot( C_invers,  Q - np.dot(K, T) )

T_sol = sp.integrate.odeint(deriv, T_start, time)

我知道结果是

sp.array([ 151.26,  132.18,  131.64,  146.55,  147.87,  137.87])

当且仅当我将其用作T_start条件时,解决方案才是“稳定的” enter image description here

但如果我将我的开始条件改为例如

T_start=sp.array([ 0,  0,  0,  0,  0,  0])

它不会收敛我得到以下结果: enter image description here

我的错在哪里?负值对我的系统毫无意义:/你能帮助我吗?谢谢;)

1 个答案:

答案 0 :(得分:4)

数组

SELECT
    p.CODE,
    p.REFERENCE,
    p.TAXCAT,
    p.DISPLAY,
    p.NAME,
    p.PRICEBUY,
    p.PRICESELL,
    s.UNITS AS UNIT,
    c.NAME AS CATEGORY
FROM PRODUCTS p
INNER JOIN STOCKCURRENT s
    ON s.PRODUCT = p.ID
INNER JOIN CATEGORIES c
    ON p.CATEGORY = c.ID;

是你的系统的平衡(大约)。您可以通过将方程组的右侧设置为0来找到这一点,这将导致array([ 151.26, 132.18, 131.64, 146.55, 147.87, 137.87])

Teq = inv(K)*Q

这就是为什么当您使用这些值作为起点时,您的解决方案似乎是稳定的。解决方案非常接近均衡,所以它的变化不大。

然而,从长期来看,解决方案最终将偏离Teq,因为该平衡点不稳定。您的系统In [9]: Teq = np.linalg.solve(K, Q) In [10]: Teq Out[10]: array([ 151.25960795, 132.17972469, 131.6402527 , 146.55025359, 147.87025015, 137.87029892]) T' = inv(C)*(Q - K*T)中是线性的,因此您可以通过计算T的系数矩阵的特征值来确定稳定性。也就是说,写TT = inv(C)*Q - inv(C)*K*T的系数矩阵为T。以下是如何找到该矩阵的特征值:

-inv(C)*K

系数矩阵A具有三个正特征值。这些对应于将在时间上呈指数增长的模式。也就是说,均衡是不稳定的,所以你看到的增长是可以预期的。