scipy.ode.integrate求解器中的数值问题

时间:2016-07-14 06:35:16

标签: python numpy scipy ode

我正在使用ode求解器来解决僵硬的问题(因为odeint函数无法解决它)。但通过这种方式我也有一些警告,我的情节在某些时候变得饱和。这是图像enter image description here我该怎么办?以下是警告列表:

DVODE--  Warning..internal T (=R1) and H (=R2) are
       such that in the machine, T + H = T on the next step  
       (H = step size). solver will continue anyway
      In above,  R1 =  0.3667661010318D+00   R2 =  0.1426374862242D-16
 DVODE--  Warning..internal T (=R1) and H (=R2) are
       such that in the machine, T + H = T on the next step  
       (H = step size). solver will continue anyway
      In above,  R1 =  0.3667661010318D+00   R2 =  0.1426374862242D-16
 DVODE--  Above warning has been issued I1 times.  
       it will not be issued again for this problem
      In above message,  I1 =         2
 DVODE--  At current T (=R1), MXSTEP (=I1) steps   
       taken on this call before reaching TOUT     
      In above message,  I1 =       500
      In above message,  R1 =  0.3667661010318D+00

我的代码:

import numpy as np
import matplotlib.pyplot as plt
import scipy.integrate as si
def func():
    #arguments:::
    w = 1./3.
    xi = 2.86
    phi1 = 1.645
    phi2 = 2.* 1.202
    gt = 10.**(-60)
    Lt = (1.202*gt)/np.pi
    Lin = 10.**-5
    Lf = 0.49
    dt = 0.0001
    gin = gt*Lt/Lin
    xin = (-np.log((3. - (xi**2)*Lin)/(3. - (xi**2)*Lt)) + np.log(Lin/Lt))/4.0
    uin = -(np.log(Lin/Lt))/2.  
    state0 = [gin,xin,uin]
    print state0
    def eq(L, state):
        g = state[0]
        x = state[1]
        u = state[2]
        N = (-2.*g/(6.*np.pi + 5.*g))*(18./(1. - 2.*L) + 5.*np.log(1.- 2.*L) - phi1 + 6. )
        B = (-(2. - N)*L) - ((g/np.pi)* (5.*np.log(1.-2.*L) - phi2 + (5.*N/40.)))
        Eqs = np.zeros((3))
        gdl = Eqs[0] = ((2.+N)*g)/B
        xdl = Eqs[1] = -(2./(3.*(1.+w)))* (1./(1.-(xi**2)*L/3.))*(1./B)
        udl = Eqs[2]= 1./B
        return Eqs
    ode =  si.ode(eq)
    # BDF method suited to stiff systems of ODEs
    ode.set_integrator('vode',nsteps=500,method='bdf')
    ode.set_initial_value(state0,Lin)       
    L = []
    G = []
    while ode.successful() and ode.t < Lf:
        ode.integrate(ode.t + dt)
        L.append(ode.t)
        G.append(ode.y)
    lam = np.vstack(L)
    g,x,u = np.vstack(G).T
    return g,x,u,lam
r= func()
L = r[3]
g = r[0]
lng = np.log10(g) 
x = r[1]
u = r[2]
w = 1./3.
xi = 2.86
O_A = np.zeros(len(L))
q = np.zeros(len(L))
for i in np.arange(len(L)):
    O_A[i] = xi**2*L[i]/3.
    alpha = 2./ ((3.+3.*w) * (1.- (L[i]*xi**2)/3.)  )
    q[i] = 1./alpha - 1.
n = np.zeros(len(L)) #eta(n)
b = np.zeros(len(L))
for j in np.arange(len(L)):
    n[j] =(-2.*g[j]/(6.*np.pi + 5.*g[j]))*(18./(1. - 2.*L[j]) + 5.*np.log(1.- 2.*L[j]) - 1.645 + 6. )
    b[j]= (-(2. - n[j])*L[j]) - ((g[j]/np.pi)* (5.*np.log(1.-2.*L[j]) - 2.* 1.202 + ((5.*n[j])/4.)))    
P = np.zeros(len(x))
for k in np.arange(len(x)):
        C = (((3. - (xi**2)*L[k])/g[k])**(3./4.)) * (((2.*L[k] + (u[k]*b[k]))*xi**2) + (n[k] * (3.- L[k]*xi**2)) )
        P[k] = (np.exp(3.*x[k])) * (np.exp(4.*u[k])) * C
plt.figure()
plt.plot(L,P)
plt.xlabel('Lambda ---->')
plt.ylabel('P ----->')
plt.title('lambda Vs P')        
plt.show()                                       

0 个答案:

没有答案