数值积分法求解常微分方程
求解 微分方程
2023-06-13 09:15:27 时间
Scipy 的 integrate 模块的 odeint 函数可以用来以数值积分法求解常微分方程。
import numpy as np
from math import sqrt
import sympy
import scipy
from scipy import integrate
from matplotlib import pyplot as plt
# 上篇的向量场绘图函数
def plot_directtion_field(x, y_x, f_xy, x_lim=(-1,1), y_lim=(-1,1), n=50, color='b', lw=0.5, ax=None):
f_np = sympy.lambdify((x,y_x), f_xy, 'numpy')
x_vec = np.linspace(x_lim[0], x_lim[1], n)
y_vec = np.linspace(y_lim[0], y_lim[1], n)
dx = x_vec[1] - x_vec[0]
dy = y_vec[1] - y_vec[0]
if ax is None:
_, ax = plt.subplots(figsiz=(4,4))
for xx in x_vec:
for yy in y_vec:
Dy = f_np(xx,yy) * dx
ds = sqrt(dx*dx + Dy*Dy)
Dx = 0.8 * dx * dx/ds
Dy = 0.8 * Dy * dy/ds
ax.plot([xx - Dx/2.0, xx + Dx/2.0], [yy - Dy/2, yy + Dy/2], color=color, lw=lw)
ax.axis('tight')
ax.set_title(r"$%s$" % (sympy.latex(sympy.Eq(y(x).diff(x), f_xy))),fontsize=16)
return ax
if __name__ == '__main__':
x = sympy.symbols('x')
y = sympy.Function('y')
f = y(x)**2 + x
f_np = sympy.lambdify((y(x), x), f)
x0, y0 = 0, -0.2
xn = np.linspace(x0, x0-5, 100) # 初值处向x轴负方向延伸
xp = np.linspace(x0, x0+2, 100) # 初值处向x轴正方向延伸
yn = integrate.odeint(f_np, y0, xn) # 数值积分法求解常微分方程,负方向积分
yp = integrate.odeint(f_np, y0, xp) # 数值积分法求解常微分方程,正方向积分
fig, ax = plt.subplots(1, 1, figsize=(24, 20))
# 绘出向量场以作对比
plot_directtion_field(x, y(x), f, x_lim=(-5,5), y_lim=(-2,10), n=80, ax=ax) # 向量场图
ax.plot(xn,yn,"r")
ax.plot(xp,yp,"r") # 两段拼一起
plt.show()
相关文章
- 考研竞赛每日一练 day 2 一道有理函数积分的求解
- 考研竞赛每日一练 day 37 利用等式关系构造微分方程求解一道偏导数问题
- 什么是正则化_lo正则化求解方式
- 简单0-1背包问题求解
- 数学求解器Lingo软件最新激活版,Lingo软件2023安装教程下载
- 【组合数学】递推方程 ( 递推方程求解过程总结 | 齐次 | 重根 | 非齐次 | 特征根为 1 | 指数形式 | 底为特征根的指数形式 ) ★★
- 迁移学习「求解」偏微分方程,条件偏移下PDE的深度迁移算子学习
- 7 Papers & Radios | AI求解薛定谔方程;陶大程等深度学习理论进展综述
- 【数字信号处理】线性常系数差分方程 ( 使用 matlab 求解 “ 线性常系数差分方程 “ 示例 | A 向量分析 | B 向量分析 | 输入序列分析 | matlab 代码 )
- Lingo优化求解器软件V18激活版电脑下载安装,Lingo软件下载激活
- Python编程学习,高效求解素数程序实例详解编程语言
- SQL Server求解平均数计算及应用(sqlserver平均数)
- Oracle中求解下月同一天(oracle中求下月同日)
- Oracle 中两数相除快速求解你要的结果(oracle 中两数相除)
- 用贪心法求解背包问题的解决方法
- C++实现第K顺序统计量的求解方法