2012-11-05 122 views
0

是否有可能使用scipy.integrate.odeint將任何常微分方程在時間上向後積分 ? 如果有可能,有人能告訴我什麼應該是'odeint'的爭論'時間'。使用scipy odeint向後積分時間

+0

我懷疑你需要諮詢一個數學家。從數學上講,許多類ODE的向後整合是*不適當的*,即不能保證存在解決方案 – talonmies

回答

1

odeint處理t參數的負值。不需要特殊處理。

下面是一個例子:

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


def mysys(z, t): 
    """A slightly damped oscillator.""" 
    return [z[1] - 0.02*z[0], -z[0]] 


if __name__ == "__main__": 
    # Note that t starts at 0 and goes "backwards" 
    t = np.linspace(0, -50, 501) 

    z0 = [1, 1] 
    sol = odeint(mysys, z0, t) 

    plt.plot(t, sol) 
    plt.xlabel('t') 
    plt.show() 

情節: Solve an ODE backward in time

0

您可以對變量s = t_0 - t進行更改,並將差分方程相對於s積分。 odeint不會爲你做這件事。

+0

非常感謝。但是,如何修改上面的代碼以在稍微阻尼的振盪器中引入時間延遲(比如time_delay = 1.5)?這正是我想要用我的系統做的事情。 – ADK

0

這是沒有必要作出變量的變化。這裏的一個例子:

import math 
import numpy 
import scipy 
import pylab as p 

from math import * 
from numpy import * 
from scipy.integrate import odeint 
from scipy.interpolate import splrep 
from scipy.interpolate import splev 

g1=0.01 
g2=0.01 
w1=1 
w2=1 
b1=1.0/20.0 
b2=1.0/20.0 
b=1.0/20.0 
c0=0 
c1=0.2 
wf=1 

def wtime(t): 
    f=1+c0+c1*cos(2*wf*t) 
    return f 

def dv(y,t): 
    return array([y[1], -(wtime(t)+g1*w1+g2*w2)*y[0]+w1*y[2]+w2*y[3], w1*y[2]-g1*w1*y[0], w2*y[3]-g2*w2*y[0]]) 

tv=linspace(100,0,1000) 
v1zero=array([1,0,0,0]) 
v2zero=array([0,1,0,0]) 
v1s=odeint(dv,v1zero,tv) 
v2s=odeint(dv,v2zero,tv) 

p.plot(tv,v1s[:,0]) 
p.show() 

我用Wolfram Mathematica檢查結果(該程序可以解決後向問題)。