数学建模社区-数学中国

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

作者: 2744557306    时间: 2024-3-16 18:46
标题: 使用 scipy、sympy 求微分方程的数值解、解析解
1.Scipy:) A6 k& C% A! H4 `
简介: Scipy 是一个开源的 Python 科学计算库,提供了丰富的数学、科学和工程计算功能。它建立在 NumPy 的基础之上,并扩展了其功能,使得科学计算更加便利。Scipy 包含了许多专门的子模块,涵盖了统计、优化、插值、积分、信号处理、图像处理、常微分方程求解等领域。/ d* u8 B! }7 p) h7 R
功能特点:
. d9 A" k0 {  v- V6 v- c提供了丰富的数学函数和常用的科学计算工具。
+ U! d& n& s6 ~- C% z* j( _8 W包含了多种数值优化算法和方程求解方法。
. C" `# x% b) y/ o' v( X提供了各种插值、积分、微分方程求解等功能。! P/ s$ p' q: D7 X3 S
内置了统计分析、概率分布等统计工具。
7 l; g0 a, X2 Q/ b支持信号处理、图像处理、稀疏矩阵处理等功能。
" o& G9 F* @3 Y, ~1 VSymPy:
4 V# p0 i! x7 ]- N1 P简介: SymPy 是一个符号计算库,用于进行符号数学计算。它能够执行符号计算,包括代数运算、微积分、离散数学等,而不仅仅是数值计算。SymPy 提供了一个 Python 环境中的完整符号数学系统,可以用于解决各种数学问题,从基本的代数问题到复杂的微积分和微分方程。
" @! z! i. Q0 [" u8 s功能特点:
4 J3 U/ d! L5 s; Z提供了符号计算的基本功能,包括代数运算、方程求解、微积分、离散数学等。( Q2 D0 L! n3 I7 R- d
支持符号表达式的构建和操作,可以进行符号运算,推导和化简。
: s! ^+ V6 }4 g! |# _, j2 K# d# C可以用于数学符号推导、证明和解决问题。& m$ V0 q' G0 m- \4 T( c, ^/ V2 l
可以生成 LaTeX 代码以用于文档和演示。
+ v4 v2 d5 Z1 q1 P, S
4 z( R; x" `# L1 f总的来说,Scipy 适用于进行数值计算和科学工程计算,而 SymPy 更适用于符号计算和数学推导。你可以根据自己的需求选择使用其中之一或两者结合起来使用。9 g- A$ X8 ?8 {' W, t
1.导入模块:7 `% @# }! {3 J

* l  |/ B" f4 O( P, U! I   import numpy as np1 G( {+ t; i' M9 r; \
   from scipy.integrate import odeint
, `% `4 _$ @1 i/ c   from sympy import *4 {( w) |, x3 G, y, u
; V4 v8 n$ E* l
1 Y2 V0 f7 v7 X: ]7 H) \
2.numpy 是 Python 中用于科学计算的基本库,提供了大量的数学函数和支持多维数组的对象。
5 x( ?0 m$ M: T5 x- o3.scipy.integrate 模块包含了用于积分和解微分方程的函数。
6 c1 v$ [1 e9 P* I( }0 j! j1 ?4.sympy 是一个符号计算库,用于进行符号数学计算。' F2 v# E; k& Q3 R& [. R% N
! R! ~/ o7 j1 E
* N* k3 ^9 D/ w
5.微分方程和数值范围:
( J! M& v. M! N  i1 _; N
! i) h0 [+ d. j4 v  Z* w   dy = lambda y,x:-2*y + x**2 + 2*x
" L) h& T5 H1 ]( x   x1 = np.linspace(1,10,20)
* D% @9 l% v8 V% p  r
/ r& y/ q3 N$ q1 L- G6 H% O% X2 _. K
6.定义了微分方程 dy,这是一个函数,表示了微分方程 $y' = -2y + x^2 + 2x$。
2 g. {" G2 F6 Q: b/ a: H7.定义了一个包含 20 个点的线性空间 x1,用于数值解的计算。! m$ M: j7 l: b6 \
  s0 t0 Q8 \+ s0 R$ o+ q' \

1 V0 k0 F2 ]/ q2 q) M8.使用 SciPy 进行数值解:
/ X# v, k2 R3 |% d- s4 {, X0 Z/ R- W- h6 |4 k4 ]) |" l
   y1 = odeint(dy, 2, x1)
/ Y  ]. r- g( _: z
4 k4 T5 T2 G- G" O! \+ C
% h, ^5 i9 f5 S: l9.调用 odeint 函数对微分方程进行数值求解。
7 l1 e* D0 l0 N; S10.参数 dy 是微分方程的函数表达式,2 是初始条件 y(1)=2,x1 是自变量范围。
, Y- X$ @) _: Q, u+ m11.数值解存储在 y1 中。6 l8 K; P" ?$ p: [6 Z

$ O( h- E4 D! v
% k' w- x: {* c" \: v12.使用 SymPy 进行解析解:
# R# m: y% l: O7 W7 C: X; i# g, k9 ^: b! [
   eq = y(x).diff(x) + 2*y(x) - x**2 - 2*x! `1 W' a6 m* m6 ^6 v
   con = {y(1): 2}
6 L1 G3 g- b+ e4 F$ }& @   f = simplify(dsolve(eq, ics=con)): K" g5 C7 o3 B  b
# e# H+ M/ X2 Z7 g- t
7 l3 t" z  ?, G8 v. |2 `
13.定义了符号微分方程 eq,并指定了初始条件 y(1)=2。! [+ K9 N1 g% d
14.使用 dsolve 函数对微分方程进行解析求解,得到了解析解 f。
+ y. C& R1 r2 ^8 j% b9 c0 K9 o* k: u1 J' c% Y; G

- N  ?$ o. K: Z: b/ u15.代入值并求解:
" |! o5 l7 k" h, e( g3 H4 R" G" V. X. S- W" |' {4 ]
   x2 = np.linspace(1,10,100)" Y" U! I0 ^( r' I' m/ ?
   y2 = []
) A9 c/ w* b7 [0 k, ~& k" y: m1 H   for each in x2:  i/ z# m* [) Z
       y2.append(list(sorted(f.subs(x,each).evalf().atoms()))[1])7 P/ w: f8 e5 Y; S  c9 ?# Y. s# P

9 s. e1 u' [+ \$ h6 g3 ]" P! c( }. ^4 a' _: X" I" S- l" x
16.创建了一个更密集的自变量范围 x2,用于绘制解析解的曲线。
* T1 n4 L  z  f7 K17.遍历 x2 中的每个值,将其代入解析解中,并将结果存储在 y2 中。! h/ a2 ^5 Z8 X$ ~0 y% N
" [1 M3 F. J9 V
/ U) f) F# ]  Y% o! C% P" {+ E
18.绘制图形:! R, n+ O% n: h9 H! I7 n' X( i
. M( A2 P6 f3 ]; Q4 a2 e6 m
   plt.scatter(x1,y1, label='x1', color='coral')
+ w* D3 k, ]- M8 X3 L; A4 X( C   plt.plot(x2,y2, label='x2')1 ~  a( T# d& ]$ w& Z$ g! U+ `7 |5 U. ]
   plt.legend()1 O5 g4 |; X* b+ x# G- a* H
$ Z/ j. V! C3 N9 Y
- |9 k; k4 ?2 _
19.使用 Matplotlib 绘制了数值解和解析解的图形。
$ x. Q$ \4 q  u: B# x8 @20.使用 plt.scatter 绘制了数值解的离散点,并用 coral 颜色表示。6 Y8 P. o) c7 A4 h0 }' n4 W
21.使用 plt.plot 绘制了解析解的连续曲线。
7 z8 M' {! P. P$ u) S! k22.添加了图例。( d1 b+ m! S- P- t  A. A: [" W
* O+ T3 q: [, M
这样,整个代码就完成了对微分方程的数值和解析解求解,并将结果可视化的过程。
8 I% i+ I0 d( c% S. X- P& L: A/ R6 ], a  G, K& |2 J7 w

: h) u  L  e* G7 ]1 a: R5 y+ c

13.differential_equation.py

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

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






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