簡體   English   中英

python:求解微分方程的初始條件

[英]python: Initial condition in solving differential equation

我想用初始條件求解這個微分方程:y′′+2y′+2y=cos(2x):

  1. y(1)=2,y′(2)=0.5

  2. y'(1)=1,y'(2)=0.8

  3. y(1)=0,y(2)=1

它的代碼是:

import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
def dU_dx(U, x):
    return [U[1], -2*U[1] - 2*U[0] + np.cos(2*x)]
U0 = [1,0]
xs = np.linspace(0, 10, 200)
Us = odeint(dU_dx, U0, xs)
ys = Us[:,0]
plt.xlabel("x")
plt.ylabel("y")
plt.title("Damped harmonic oscillator")
plt.plot(xs,ys);

我怎樣才能實現它?

您的初始條件不是,因為它們在兩個不同的點給出值。 這些都是邊界條件。

def bc1(u1,u2): return [u1[0]-2.0,u2[1]-0.5]
def bc2(u1,u2): return [u1[1]-1.0,u2[1]-0.8]
def bc3(u1,u2): return [u1[0]-0.0,u2[0]-1.0]

您需要一個 BVP 求解器來解決這些邊界值問題。

您可以使用拍攝方法制作自己的求解器,在情況 1 為

def shoot(b): return odeint(dU_dx,[2,b],[1,2])[-1,1]-0.5

b = fsolve(shoot,0) 

T = linspace(1,2,N)
U = odeint(dU_dx,[2,b],T)

或者使用割線方法而不是scipy.optimize.fsolve ,因為問題是線性的,這應該收斂於 1,最多 2 步。

或者您可以使用scipy.integrate.solve_bvp求解器(這可能比問題更新?)。 您的任務類似於記錄的示例。 請注意,ODE 函數中的參數順序會在所有其他求解器中切​​換,即使在odeint您也可以提供選項tfirst=True

def dudx(x,u): return [u[1], np.cos(2*x)-2*(u[1]+u[0])]

使用solve_bvp生成的solve_bvp ,節點是積分區間的自動生成的細分,它們的密度表明 ODE 在該區域中的“非平坦”程度。 在此處輸入圖片說明

xplot=np.linspace(1,2,161)
for k,bc in enumerate([bc1,bc2,bc3]):
    res = solve_bvp(dudx, bc, [1.0,2.0], [[0,0],[0,0]], tol=1e-5)
    print res.message
    l,=plt.plot(res.x,res.y[0],'x')
    c = l.get_color()
    plt.plot(xplot, res.sol(xplot)[0],c=c, label="%d."%(k+1))

使用射擊方法生成的解使用x=0處的初始值作為未知參數,然后獲得區間[0,3]的解軌跡。

在此處輸入圖片說明

x = np.linspace(0,3,301)
for k,bc in enumerate([bc1,bc2,bc3]):
    def shoot(u0): u = odeint(dudx,u0,[0,1,2],tfirst=True); return bc(u[1],u[2])
    u0 = fsolve(shoot,[0,0])
    u = odeint(dudx,u0,x,tfirst=True);
    l, = plt.plot(x, u[:,0], label="%d."%(k+1))
    c = l.get_color()
    plt.plot(x[::100],u[::100,0],'x',c=c)

您可以使用scipy.integrate.ode函數,這類似於 scipy.integrate.odeint 但允許 jac 參數是 df/dy 或在您給定的 ODE df/dx 的情況下

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM