ODEi​​ntWarning:检测到非法输入(内部错误)?

时间:2017-08-23 17:57:11

标签: python python-3.x ode

我想在python中解决这样的ODE: enter image description here

这是我的代码:

import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt

def cde(y,t,r1,r2,l1,l2,m,c):
    #define the vecter of dependent variables
    i1,i2,uc = y
    #define the system of first order equations
    dy_dt = [(r2*i2*m/l2 + r1*i1 - uc) / (m**2/l2 - l1),\
             (r1*i1 + l1*r2*i2/m - uc) / (m - l1*l2/m),\
             i1/c]
    return dy_dt

def main():

    #initialize the vecter of dependent variables
    y0 = [0,0,3000]

    #initialize the other variables
    r1 = 10 ** (-3)
    r2 = 10 ** (-3)
    l1 = 20 * 10 ** (-6)
    l2 = 80 * 10 ** (-6)
    m = 0.9 * (l1 * l2) ** (1/2)
    c = 1000 * 10 ** (-6)    
    t = np.linspace(0, 0.1, 101)

    #build the model
    sol = odeint(cde, y0, t, args=(r1,r2,l1,l2,m,c))

    #plot the figure of solution
    plt.plot(t, sol[:, 0], 'b', label='i1')
    plt.legend(loc='best')
    plt.xlabel('t')
    plt.grid()
    plt.show()
    plt.close()

    plt.plot(t, sol[:, 1], 'g', label='i2')
    plt.legend(loc='best')
    plt.xlabel('t')
    plt.grid()
    plt.show()
    plt.close()

    plt.plot(t, sol[:, 1], 'r', label='uc')
    plt.legend(loc='best')
    plt.xlabel('t')
    plt.grid()
    plt.show()
    plt.close()

main()

我得到了一个完全不正确的结果 - 模型的解决方案表明它没有收敛 为什么我会得到这样的ODEintWarning? 我怎样才能得到正确的解决方案?

1 个答案:

答案 0 :(得分:0)

计算该线性系统的特征值

dy1=cde([1,0,0],0,r1,r2,l1,l2,m,c)
dy2=cde([0,1,0],0,r1,r2,l1,l2,m,c)
dy3=cde([0,0,1],0,r1,r2,l1,l2,m,c)

np.linalg.eig([dy1,dy2,dy3])

给出结果

(array([ -1.63811579e+04,   1.60647105e+04,  -1.24999684e+01]),
 array([[ -6.19266551e-02,  -6.11336770e-02,  -4.10359481e-01],
        [ -4.49479256e-04,   4.48809049e-04,   9.11909417e-01],
        [  9.98080602e-01,  -9.98129487e-01,   5.12941642e-03]]))

以便有一个组件增长为exp(1.606e+04*t),其值10**n有时会t=0.00014333*n,这可以解释观察到的快速增长。