数学建模社区-数学中国

标题: 使用 scipy、sympy 求微分方程的数值解、解析解 [打印本页]

作者: 2744557306    时间: 2024-3-16 18:46
标题: 使用 scipy、sympy 求微分方程的数值解、解析解
1.Scipy:
( E. ^: p) d+ R* s- m- n* L6 {简介: Scipy 是一个开源的 Python 科学计算库,提供了丰富的数学、科学和工程计算功能。它建立在 NumPy 的基础之上,并扩展了其功能,使得科学计算更加便利。Scipy 包含了许多专门的子模块,涵盖了统计、优化、插值、积分、信号处理、图像处理、常微分方程求解等领域。
0 V7 A% r  B; g) z5 F- e6 E1 X功能特点:) l5 r! H: q% t1 q. \
提供了丰富的数学函数和常用的科学计算工具。$ z+ Y  \; b( k( V8 T
包含了多种数值优化算法和方程求解方法。
3 u. J# w- H4 |9 m9 ?, h提供了各种插值、积分、微分方程求解等功能。
  Q4 Y& H2 Z/ x$ |内置了统计分析、概率分布等统计工具。0 v* V: E+ x1 {# @. R; g
支持信号处理、图像处理、稀疏矩阵处理等功能。
* N  _! w' ^3 C: d7 [" C% K1 hSymPy:
8 r2 e- v* [* _' V简介: SymPy 是一个符号计算库,用于进行符号数学计算。它能够执行符号计算,包括代数运算、微积分、离散数学等,而不仅仅是数值计算。SymPy 提供了一个 Python 环境中的完整符号数学系统,可以用于解决各种数学问题,从基本的代数问题到复杂的微积分和微分方程。0 g0 i* T! c; L/ C3 b
功能特点:0 C- X- v; Z% l, |" C
提供了符号计算的基本功能,包括代数运算、方程求解、微积分、离散数学等。. `( y9 I5 l, ?# `/ f6 |
支持符号表达式的构建和操作,可以进行符号运算,推导和化简。
* |2 j. \7 R: D5 R8 q- _可以用于数学符号推导、证明和解决问题。: Z0 o# B7 t# H* ?# U( X* S3 h
可以生成 LaTeX 代码以用于文档和演示。  b- |) ^6 F% y4 |% ?4 W7 |

! C# p% E" r. g& q9 T总的来说,Scipy 适用于进行数值计算和科学工程计算,而 SymPy 更适用于符号计算和数学推导。你可以根据自己的需求选择使用其中之一或两者结合起来使用。$ X; V$ u& ~) n  D; d" m; [
1.导入模块:
  o* ]1 n, g, E: [' f! S( O6 y$ r+ A) _6 t
   import numpy as np+ J( f& ^$ ^+ C; E
   from scipy.integrate import odeint$ N+ I! N& U8 C) [: u
   from sympy import *
& h- [+ C6 z' [& M" S  w/ f( k: A2 e9 Y

. C" }! t* w/ [3 i- {+ @2.numpy 是 Python 中用于科学计算的基本库,提供了大量的数学函数和支持多维数组的对象。0 ~/ T$ Y+ Q: B6 {! A  }$ M$ u
3.scipy.integrate 模块包含了用于积分和解微分方程的函数。
& I6 E- K; H( Q7 O7 e8 d2 B4.sympy 是一个符号计算库,用于进行符号数学计算。
8 Q/ m7 e: o5 c; H% a2 M7 l9 j; v! @  {% ]
; |: B6 W) {2 n9 b# j' L
5.微分方程和数值范围:
1 q* f# m, t' U( o5 t$ N
7 `/ ~6 U' M; b" h/ I* \+ t   dy = lambda y,x:-2*y + x**2 + 2*x
. X5 A* n, ^% u! @0 V   x1 = np.linspace(1,10,20)
$ v& l6 g7 j* `$ a. d% m4 _; O" _: ?, ?$ [* c; y- G! ]$ L1 E. \

6 o1 p& P% s  _2 m& _6 E2 g6.定义了微分方程 dy,这是一个函数,表示了微分方程 $y' = -2y + x^2 + 2x$。9 ?7 c( L* ^' W' ~  s/ g
7.定义了一个包含 20 个点的线性空间 x1,用于数值解的计算。& P; v9 C4 B) v! [( j  m/ I
0 H0 y; u. k. q/ m! L$ j+ g/ ~4 I  |2 x3 _

+ p, Y4 c: A0 x/ I* o9 H3 _! O8.使用 SciPy 进行数值解:8 u; f; h+ e- N) N' Q2 N+ r

" G0 H/ r9 |6 J7 `$ D# _9 r+ G   y1 = odeint(dy, 2, x1)
/ R( B4 Z8 y& W- L. L# N* x) p, h. b4 ?5 U7 l9 s
6 o! P4 Q9 U% n0 Q% Q
9.调用 odeint 函数对微分方程进行数值求解。
/ L* |( y. I" R( f# U10.参数 dy 是微分方程的函数表达式,2 是初始条件 y(1)=2,x1 是自变量范围。
4 X* H' R' o& V/ D11.数值解存储在 y1 中。
  S% X3 Y6 ~) T& v/ c1 a- S9 z  a7 P' k+ q
0 j% B' J: z$ t4 W$ j5 P- l
12.使用 SymPy 进行解析解:( v' ^& e. }6 F; [- T' ]# j

& l, l1 v$ [- t; B* }% P* h) O# Q/ E   eq = y(x).diff(x) + 2*y(x) - x**2 - 2*x" y" i9 M& u4 q& |
   con = {y(1): 2}
) z$ N% f% M( t  A6 a+ }   f = simplify(dsolve(eq, ics=con))
" z/ c. n- h5 {0 l: M' M
& s) X1 B8 o6 l8 g3 r2 c# ^: o. s0 q' [
13.定义了符号微分方程 eq,并指定了初始条件 y(1)=2。
0 v3 `: g5 o6 T7 `14.使用 dsolve 函数对微分方程进行解析求解,得到了解析解 f。$ I/ _/ G: N( C' Y1 W& K- v$ \
7 h& k0 P- @% l* j9 r
& P: y, K9 s' p
15.代入值并求解:" X# K0 @8 R2 e- N8 C% I2 m
! z4 l, e- I- F' X+ Q, J
   x2 = np.linspace(1,10,100)- @7 B8 I$ {* L! }3 n) F6 i
   y2 = []
2 s3 |; {. J* |   for each in x2:
0 C6 f4 s- w/ `  M2 O( `       y2.append(list(sorted(f.subs(x,each).evalf().atoms()))[1])
6 R4 h) [; t) I5 \$ @6 `1 H1 @! z! V; c$ W

2 ^( K: F! L" O( Y9 r  o16.创建了一个更密集的自变量范围 x2,用于绘制解析解的曲线。
+ [( c3 E/ J& A# Q0 A% s8 X17.遍历 x2 中的每个值,将其代入解析解中,并将结果存储在 y2 中。
4 ^6 w$ y* I. J  X9 h, ?$ A: M4 A$ _7 P  |8 L

9 I+ p' `" A' Y& X$ Q8 v- t; I18.绘制图形:+ d# {" Q  W0 g+ h" U

7 K3 w) S, n2 |. ^   plt.scatter(x1,y1, label='x1', color='coral')
/ I9 O7 R4 F, @   plt.plot(x2,y2, label='x2')) R+ S% j9 k" j9 F% N2 _* S
   plt.legend()' {6 l( ~0 m" z. N6 s/ X
9 }8 P# x, O5 K- _' [2 q+ B' F
) k& \# h% k  ^9 h$ ^
19.使用 Matplotlib 绘制了数值解和解析解的图形。0 |* d1 l! p# K# T  N/ m; X
20.使用 plt.scatter 绘制了数值解的离散点,并用 coral 颜色表示。
+ \/ ?& i, @1 i$ K0 X' b21.使用 plt.plot 绘制了解析解的连续曲线。; K3 j- G/ d5 z5 ^  A- G
22.添加了图例。
: U  Q9 k/ C2 ^9 e
  D- ^2 h' b2 U* _* |- O0 P这样,整个代码就完成了对微分方程的数值和解析解求解,并将结果可视化的过程。
3 D3 C. S) R' y: ^; i" D: I: N9 X. _" u& [# n$ p- k
# j  l0 B- {9 N! R3 I

13.differential_equation.py

953 Bytes, 下载次数: 0, 下载积分: 体力 -2 点

售价: 2 点体力  [记录]  [购买]






欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5