python:解微分方程的初始条件

时间:2018-04-22 10:01:45

标签: python

我想解决这个微分方程: 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

  4. 它的代码是:

    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);
    

    我该如何实现它?

2 个答案:

答案 0 :(得分:8)

您的初始条件不是,因为它们在两个不同的点给出值。这些都是边界条件。

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求解器来解决这些边值问题。

在第一种情况下,您可以使用射击方法制作自己的求解器

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生成的解决方案,节点是积分间隔的自动生成的细分,它们的密度表明ODE在该区域中的位置“不平坦”。 enter image description here

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]的解轨迹。

enter image description here

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)

答案 1 :(得分:0)

您可以使用scipy.integrate.ode函数,这类似于scipy.integrate.odeint,但允许使用jac参数df / dy或者在给定ODE df / dx的情况下