前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数值积分法求解常微分方程

数值积分法求解常微分方程

作者头像
用户6021899
发布2023-03-03 09:07:39
4890
发布2023-03-03 09:07:39
举报
文章被收录于专栏:Python编程 pyqt matplotlib

Scipy 的 integrate 模块的 odeint 函数可以用来以数值积分法求解常微分方程。

代码语言:javascript
复制
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()
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-02-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python可视化编程机器学习OpenCV 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档