求解高阶微分方程的数值解

题目

        使用odeint求解这个方程的数值解: 

y'' - 20(1-y^2)y' + y = 0, \quad y(0) = 0, \quad y'(0) = 2

思路: 分解为方程组进行计算. 也就是带入u(x)=y'(x), 化简为下面的方程: 

\left\{\begin{matrix} u=y'\\ u'-20(1-y^2)u+y=0\\ y(0)=0\\ u(0)=2 \end{matrix}\right.

 代码实现

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

# 定义微分方程组
# 输入两个function以及自变量, 输出两个function的导数
def dydx(y, x):
    y, u = y
    dydx = [u, 20 * (1 - y**2) * u - y]
    return dydx

"""else
def fvdp(y,t):
    # 也可以不解包参数, 直接使用list, 其中y[0]=y,y[1]=u
    dy1 = y[1]
    dy2 = 20*(1-y[0]**2) * y[1] - y[0]
    return [dy1, dy2] 

"""

# 初始条件
# y(0) = 0, u(0)=y'(0) = 2
y0 = [0, 2]

# 自变量范围
x = np.arange(0, 0.25, 0.01)

# 求解微分方程
# 使用ode_integration, 输入微分方程组&初始值(与x的初始值对应)&自变量
sol = odeint(dydx, y0, x)

# 提取解 第一列是y,第二列是u
y = sol[:, 0]
u = sol[:, 1]

# 打印结果
print("x={}\n对应的数值解y={}".format(x, y))

# 绘制结果
# plot函数, 输入自变量, 因变量. label给出标签
plt.plot(x, y, label="y(x)")
plt.plot(x, u, label="y'(x)")
plt.xlabel("x")
plt.ylabel("y, y'")
plt.legend()
plt.show()

 结果: 

x=[0.   0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1  0.11 0.12 0.13
 0.14 0.15 0.16 0.17 0.18 0.19 0.2  0.21 0.22 0.23 0.24]
对应的数值解y=[0.         0.02213973 0.04917542 0.08217383 0.12241129 0.17139008
 0.23083061 0.30261249 0.38862014 0.49043034 0.6087762  0.7427756
 0.8890802  1.041387   1.19095297 1.32843735 1.44644047 1.54133536
 1.61342302 1.6657038  1.70228635 1.72720565 1.74383888 1.7547616
 1.76182797]

进程已结束,退出代码为 0

参考结果: 

参考

马马老师文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值