数学建模社区-数学中国

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

作者: 2744557306    时间: 2024-3-16 18:46
标题: 使用 scipy、sympy 求微分方程的数值解、解析解
1.Scipy:
: q) {; j7 [2 W1 W: X; o简介: Scipy 是一个开源的 Python 科学计算库,提供了丰富的数学、科学和工程计算功能。它建立在 NumPy 的基础之上,并扩展了其功能,使得科学计算更加便利。Scipy 包含了许多专门的子模块,涵盖了统计、优化、插值、积分、信号处理、图像处理、常微分方程求解等领域。) l* r& X0 b( T8 g6 `. ~
功能特点:
, g% P6 }$ B  I5 C提供了丰富的数学函数和常用的科学计算工具。; Q' F+ |; Z  ?& J( B5 d( S
包含了多种数值优化算法和方程求解方法。# b* O# [4 [& F) \
提供了各种插值、积分、微分方程求解等功能。6 j& y. t8 Y$ |
内置了统计分析、概率分布等统计工具。! K. _; `. q5 k* p/ c* _4 a
支持信号处理、图像处理、稀疏矩阵处理等功能。
  r$ A; m* Q/ [( F6 nSymPy:
% r7 U, H( G' v3 _. O  n6 z' ]; J简介: SymPy 是一个符号计算库,用于进行符号数学计算。它能够执行符号计算,包括代数运算、微积分、离散数学等,而不仅仅是数值计算。SymPy 提供了一个 Python 环境中的完整符号数学系统,可以用于解决各种数学问题,从基本的代数问题到复杂的微积分和微分方程。
  |) ^( Y6 j6 ]功能特点:+ k4 Y3 O( i3 O
提供了符号计算的基本功能,包括代数运算、方程求解、微积分、离散数学等。8 s! f  h% A3 t0 W) g
支持符号表达式的构建和操作,可以进行符号运算,推导和化简。1 a# r1 g% p: P7 G: m3 a4 D  c
可以用于数学符号推导、证明和解决问题。1 T+ G" X. {: y
可以生成 LaTeX 代码以用于文档和演示。1 L, p4 O& P: L4 a
4 J  {; y6 ]& ]" d5 s
总的来说,Scipy 适用于进行数值计算和科学工程计算,而 SymPy 更适用于符号计算和数学推导。你可以根据自己的需求选择使用其中之一或两者结合起来使用。: d+ F1 E; c1 \+ f9 N: O. x
1.导入模块:* i) s; U( e7 R& O
& C# m( Y( G8 |- w4 J& j; P, P
   import numpy as np
9 O3 ~- P) b" b4 X- [( v8 e& c( }   from scipy.integrate import odeint
5 p1 O6 D+ U+ l   from sympy import *
$ L# V! N7 I8 U, M6 W, X
! g$ S9 l" t; W4 k
/ o' f- J8 a! g2.numpy 是 Python 中用于科学计算的基本库,提供了大量的数学函数和支持多维数组的对象。1 C. G9 m9 A$ ~. w2 _
3.scipy.integrate 模块包含了用于积分和解微分方程的函数。
  C* B5 v+ q7 b# m9 K4.sympy 是一个符号计算库,用于进行符号数学计算。
* L' p; A5 C0 e. s% M& M2 N+ L3 \. C' E2 e
+ ?; @- `) [0 I# r/ [1 r# ?( Y) |
5.微分方程和数值范围:
; o" i/ Y. K4 W, B4 X( `- v) n9 y! v9 P2 b
   dy = lambda y,x:-2*y + x**2 + 2*x
: o7 R: N' B7 G) t# Z. y" A   x1 = np.linspace(1,10,20); ^* T# f" W+ Z- K

0 [2 ]0 p$ V" R% Z; P$ Q- ~+ |" u' ~& d- s' r% C& D
6.定义了微分方程 dy,这是一个函数,表示了微分方程 $y' = -2y + x^2 + 2x$。
2 L' {) O8 R3 ~; w' y7.定义了一个包含 20 个点的线性空间 x1,用于数值解的计算。
+ s9 A! S4 t4 _6 y7 P9 @' t: f: k7 f" a1 c
# d: f0 A+ S: ?; B! a
8.使用 SciPy 进行数值解:3 S( P0 K9 S' ~. p
* w  U! i. |: J/ d5 U
   y1 = odeint(dy, 2, x1); `+ b2 ~, O+ x) A' L: d. \4 {
# o" w2 M% P: R2 ?
( z4 \  s: H1 x" |
9.调用 odeint 函数对微分方程进行数值求解。
' I+ u! ^$ q, A5 k10.参数 dy 是微分方程的函数表达式,2 是初始条件 y(1)=2,x1 是自变量范围。) T$ z) S2 B& {* C( y, a& ]) |, b
11.数值解存储在 y1 中。/ d+ ?3 N/ I/ D0 R4 q' o4 t7 H

7 i9 _( Y" g) P9 l* r1 b% J1 f* Q& R  s! R2 ^" Q2 S, z# G2 R
12.使用 SymPy 进行解析解:7 L, `+ `4 Z& P; U# a

' a& u9 l0 r* h# s& G6 b( N   eq = y(x).diff(x) + 2*y(x) - x**2 - 2*x: P8 v, f4 y# L
   con = {y(1): 2}
0 m# Q1 p6 M1 C+ z+ s2 v: ~1 L   f = simplify(dsolve(eq, ics=con)); z2 [) V' B& q$ D/ l

5 H$ ~! b6 f5 O" W7 W  X- M4 U
6 W- T5 _. @8 R: O13.定义了符号微分方程 eq,并指定了初始条件 y(1)=2。  A9 S7 K. N6 g+ m7 f
14.使用 dsolve 函数对微分方程进行解析求解,得到了解析解 f。
4 s7 R5 x) i# h8 B! q; B
5 P0 }% J! F2 R' \- G! s
0 L: g$ E7 V) g, Q7 {15.代入值并求解:. L% H. ]$ k& J/ Q5 B& a
- c3 ]/ D# v  N' Z
   x2 = np.linspace(1,10,100)
7 Q/ l* E* f+ q) B" c% X+ n   y2 = []5 A' }0 Z# a4 S( H, R
   for each in x2:: W8 G- a* `* |9 W) i/ `' T2 T
       y2.append(list(sorted(f.subs(x,each).evalf().atoms()))[1]); K8 |. n1 ~7 Q4 f
" o4 j3 {* U/ Z

8 Y6 B4 R9 t" s- ]8 K16.创建了一个更密集的自变量范围 x2,用于绘制解析解的曲线。0 J/ z1 T2 E" {5 D
17.遍历 x2 中的每个值,将其代入解析解中,并将结果存储在 y2 中。
1 |0 D: H% A) d4 ?; B% I, ~* }
( D9 i* P) D8 Z
) L2 q+ }8 `9 T0 h% {# W) A18.绘制图形:8 s. ]# |9 e9 H  c7 u# K

# E/ ?7 f8 o( R" y9 X   plt.scatter(x1,y1, label='x1', color='coral'); z6 [; `( u- k6 P9 V7 b% t/ P
   plt.plot(x2,y2, label='x2')5 B/ d% V1 \8 r4 h  H) G# ]
   plt.legend()
  r& A9 k: |- o9 N6 k9 B/ b
3 c* p- ^$ n: o# \$ J% w, m
* {( ?- k! s4 J0 r% S, I$ o" h# w7 i19.使用 Matplotlib 绘制了数值解和解析解的图形。! n; J, `3 V, Q- B7 ?# u6 h& c
20.使用 plt.scatter 绘制了数值解的离散点,并用 coral 颜色表示。
" G6 r8 ^# [/ ?( h5 c" R8 ]21.使用 plt.plot 绘制了解析解的连续曲线。" I, J7 w; _, u8 k. ~
22.添加了图例。! [. Z" h4 t* ~( H  l

0 U9 }# O: t4 O- a, `这样,整个代码就完成了对微分方程的数值和解析解求解,并将结果可视化的过程。
! [' q) ?5 ?1 |+ q, w+ E/ M, c: N4 E0 M' M# u9 W0 F
3 i6 H$ |( g! h* O1 Q; P

13.differential_equation.py

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

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






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