2744557306 发表于 2024-3-16 18:46

使用 scipy、sympy 求微分方程的数值解、解析解

1.Scipy:
简介: Scipy 是一个开源的 Python 科学计算库,提供了丰富的数学、科学和工程计算功能。它建立在 NumPy 的基础之上,并扩展了其功能,使得科学计算更加便利。Scipy 包含了许多专门的子模块,涵盖了统计、优化、插值、积分、信号处理、图像处理、常微分方程求解等领域。
功能特点:
提供了丰富的数学函数和常用的科学计算工具。
包含了多种数值优化算法和方程求解方法。
提供了各种插值、积分、微分方程求解等功能。
内置了统计分析、概率分布等统计工具。
支持信号处理、图像处理、稀疏矩阵处理等功能。
SymPy:
简介: SymPy 是一个符号计算库,用于进行符号数学计算。它能够执行符号计算,包括代数运算、微积分、离散数学等,而不仅仅是数值计算。SymPy 提供了一个 Python 环境中的完整符号数学系统,可以用于解决各种数学问题,从基本的代数问题到复杂的微积分和微分方程。
功能特点:
提供了符号计算的基本功能,包括代数运算、方程求解、微积分、离散数学等。
支持符号表达式的构建和操作,可以进行符号运算,推导和化简。
可以用于数学符号推导、证明和解决问题。
可以生成 LaTeX 代码以用于文档和演示。

总的来说,Scipy 适用于进行数值计算和科学工程计算,而 SymPy 更适用于符号计算和数学推导。你可以根据自己的需求选择使用其中之一或两者结合起来使用。
1.导入模块:

   import numpy as np
   from scipy.integrate import odeint
   from sympy import *


2.numpy 是 Python 中用于科学计算的基本库,提供了大量的数学函数和支持多维数组的对象。
3.scipy.integrate 模块包含了用于积分和解微分方程的函数。
4.sympy 是一个符号计算库,用于进行符号数学计算。


5.微分方程和数值范围:

   dy = lambda y,x:-2*y + x**2 + 2*x
   x1 = np.linspace(1,10,20)


6.定义了微分方程 dy,这是一个函数,表示了微分方程 $y' = -2y + x^2 + 2x$。
7.定义了一个包含 20 个点的线性空间 x1,用于数值解的计算。


8.使用 SciPy 进行数值解:

   y1 = odeint(dy, 2, x1)


9.调用 odeint 函数对微分方程进行数值求解。
10.参数 dy 是微分方程的函数表达式,2 是初始条件 y(1)=2,x1 是自变量范围。
11.数值解存储在 y1 中。


12.使用 SymPy 进行解析解:

   eq = y(x).diff(x) + 2*y(x) - x**2 - 2*x
   con = {y(1): 2}
   f = simplify(dsolve(eq, ics=con))


13.定义了符号微分方程 eq,并指定了初始条件 y(1)=2。
14.使用 dsolve 函数对微分方程进行解析求解,得到了解析解 f。


15.代入值并求解:

   x2 = np.linspace(1,10,100)
   y2 = []
   for each in x2:
       y2.append(list(sorted(f.subs(x,each).evalf().atoms())))


16.创建了一个更密集的自变量范围 x2,用于绘制解析解的曲线。
17.遍历 x2 中的每个值,将其代入解析解中,并将结果存储在 y2 中。


18.绘制图形:

   plt.scatter(x1,y1, label='x1', color='coral')
   plt.plot(x2,y2, label='x2')
   plt.legend()


19.使用 Matplotlib 绘制了数值解和解析解的图形。
20.使用 plt.scatter 绘制了数值解的离散点,并用 coral 颜色表示。
21.使用 plt.plot 绘制了解析解的连续曲线。
22.添加了图例。

这样,整个代码就完成了对微分方程的数值和解析解求解,并将结果可视化的过程。


页: [1]
查看完整版本: 使用 scipy、sympy 求微分方程的数值解、解析解