数学建模社区-数学中国

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

作者: 2744557306    时间: 2024-3-16 18:46
标题: 使用 scipy、sympy 求微分方程的数值解、解析解
1.Scipy:
) c' n9 p: w% q. s简介: Scipy 是一个开源的 Python 科学计算库,提供了丰富的数学、科学和工程计算功能。它建立在 NumPy 的基础之上,并扩展了其功能,使得科学计算更加便利。Scipy 包含了许多专门的子模块,涵盖了统计、优化、插值、积分、信号处理、图像处理、常微分方程求解等领域。
% T; T* v4 K0 n1 X  R功能特点:
( I2 {2 ~* t+ e  C提供了丰富的数学函数和常用的科学计算工具。0 e8 j' `1 K& f9 e. m
包含了多种数值优化算法和方程求解方法。# c) z1 C) }4 l, |! ?+ i
提供了各种插值、积分、微分方程求解等功能。6 f  U8 J. u. h# E6 {
内置了统计分析、概率分布等统计工具。! T+ e, ~+ `+ t. o% @/ O/ N" r
支持信号处理、图像处理、稀疏矩阵处理等功能。7 N, W0 ]: b: ]+ s$ S
SymPy:) ]) D& {; u( t1 E2 H
简介: SymPy 是一个符号计算库,用于进行符号数学计算。它能够执行符号计算,包括代数运算、微积分、离散数学等,而不仅仅是数值计算。SymPy 提供了一个 Python 环境中的完整符号数学系统,可以用于解决各种数学问题,从基本的代数问题到复杂的微积分和微分方程。1 u0 _) m; U' k2 r" w9 H7 y! F
功能特点:
# G2 {4 s3 T: v( G" X. g! S% r3 u, R- z提供了符号计算的基本功能,包括代数运算、方程求解、微积分、离散数学等。
4 x6 G5 b8 B! r( q  m0 @( x7 {支持符号表达式的构建和操作,可以进行符号运算,推导和化简。' T9 r1 z) q* Q4 z& p+ t
可以用于数学符号推导、证明和解决问题。% O) F  z$ I3 H% [' I2 j7 W$ F5 W, Y/ Q
可以生成 LaTeX 代码以用于文档和演示。
# f: G- I% d2 N; k
5 `8 Z7 q! M0 X2 ]' \  {+ p' \总的来说,Scipy 适用于进行数值计算和科学工程计算,而 SymPy 更适用于符号计算和数学推导。你可以根据自己的需求选择使用其中之一或两者结合起来使用。2 z/ ?& _8 t- B3 n6 I
1.导入模块:& t; l8 i. T0 W
* N$ N& h/ L: k6 y% E" d
   import numpy as np9 Y" C$ A2 l, C+ f
   from scipy.integrate import odeint
- v+ T* A# d- x# d% C4 u( P8 M   from sympy import *
; b( H/ e& k  J7 V0 H4 N4 a# t1 }' N0 Y9 j! j

* S5 [6 M) d2 A6 P# ?9 i2.numpy 是 Python 中用于科学计算的基本库,提供了大量的数学函数和支持多维数组的对象。
: `! H; m$ ~4 P; v6 n4 |3.scipy.integrate 模块包含了用于积分和解微分方程的函数。
. z+ e" c" u" m3 _( N& G2 W6 F4.sympy 是一个符号计算库,用于进行符号数学计算。
4 E" b4 v- }; b$ S# z1 i) F8 |' }$ V" ^* c% U/ ^3 K) [

: x4 Q% _# A! A0 ^( X0 n5.微分方程和数值范围:) w; w0 D' i8 v  ^( u: q+ v
& d* f4 y- e( a" r
   dy = lambda y,x:-2*y + x**2 + 2*x' b6 E) \0 _4 t
   x1 = np.linspace(1,10,20)
- ]* M8 m0 z9 w( q3 |4 M+ E5 @) _0 u: q2 a1 H, y
1 P5 E) O) k: _: J$ V) M
6.定义了微分方程 dy,这是一个函数,表示了微分方程 $y' = -2y + x^2 + 2x$。
6 \- y3 |$ P4 }. E7.定义了一个包含 20 个点的线性空间 x1,用于数值解的计算。
, O- a, q7 m/ ~$ l$ q3 \: ^7 R9 i' U, O  R* o. Q

! p3 F, |% |! h. ~& |+ N' B* X8.使用 SciPy 进行数值解:/ I( c2 x# F# i8 Y5 I' k) T
  U! W: A$ s. e  ], B1 e: k, O! P
   y1 = odeint(dy, 2, x1)+ X( l' C# l/ a2 H2 C

3 }" T, `4 C5 }9 `: @$ M. P
' H7 o% L+ W% ~) g9 @  q2 e9.调用 odeint 函数对微分方程进行数值求解。
0 Y# X3 @' W& J0 F10.参数 dy 是微分方程的函数表达式,2 是初始条件 y(1)=2,x1 是自变量范围。
3 N5 f0 ^7 N; N' S11.数值解存储在 y1 中。
+ F3 h( J* F+ t# T
1 M( R6 g- a. h: Q$ l+ G; j$ m8 V/ k$ O9 T- V, J4 r# y
12.使用 SymPy 进行解析解:9 I: K, K4 r- r

( x: P' @! N3 d; R7 Z! H( H$ D9 }+ U   eq = y(x).diff(x) + 2*y(x) - x**2 - 2*x" b5 m, o" R- C3 b* V% o9 k
   con = {y(1): 2}
9 H- j0 v, n# U8 D$ S$ d& C6 O% \   f = simplify(dsolve(eq, ics=con))
5 W/ D1 k( T5 A! ?7 I9 a- V
' B! C3 d, X6 ?3 A* t% [5 K' ^( O2 H, B3 z' M) h- h0 ^0 |- q
13.定义了符号微分方程 eq,并指定了初始条件 y(1)=2。0 W+ }+ F; l! Y  S
14.使用 dsolve 函数对微分方程进行解析求解,得到了解析解 f。( O5 W6 A0 W- K" R, I) p
7 B) y, g/ o1 [5 C/ w7 h8 [5 e
( ?5 t1 ]) T% b9 W- g
15.代入值并求解:
7 C& n- s+ a$ a" q. C5 R
! t4 f# e: p; ?   x2 = np.linspace(1,10,100)( b5 h. R4 z; a, I. V# u& G
   y2 = []) A& b( E/ r! S3 U8 K# S
   for each in x2:8 J/ b+ V* K: g* {
       y2.append(list(sorted(f.subs(x,each).evalf().atoms()))[1])  {. K, \5 b9 _  S& k/ F
0 \# [; W. m* [& T* a

5 c; V* C6 |* L4 O' \% d9 {16.创建了一个更密集的自变量范围 x2,用于绘制解析解的曲线。
. G- d+ Q; q) K( P17.遍历 x2 中的每个值,将其代入解析解中,并将结果存储在 y2 中。( Z* d2 W: Z5 t8 `
# N/ d/ F' T* E" E# j) d# [0 b7 B
' B% |. q6 x# C( n, v) H) D0 B
18.绘制图形:, m8 g* G+ a5 {- ~. |: i$ p

7 u3 O5 Z8 c$ p4 J& b- O! J: |4 K   plt.scatter(x1,y1, label='x1', color='coral')
7 V) m8 t( E) |+ X6 U; j   plt.plot(x2,y2, label='x2')6 p# G8 y+ m* v% G
   plt.legend()
( K4 J. e7 \9 T6 P* b! K5 s
+ b* O5 _* D" b) R. a0 M# P2 O7 `. u; B' H: g; a& C
19.使用 Matplotlib 绘制了数值解和解析解的图形。
6 U: l9 j8 U# b/ E: S" N20.使用 plt.scatter 绘制了数值解的离散点,并用 coral 颜色表示。
' b1 }  K7 y: F) s4 P; N21.使用 plt.plot 绘制了解析解的连续曲线。
+ A( z5 M" \- k+ Z22.添加了图例。
7 I/ B6 d9 u' {- u) |- q
# S6 @4 {& D  [! W: I这样,整个代码就完成了对微分方程的数值和解析解求解,并将结果可视化的过程。
/ e+ G& r9 h7 v; I
: L* b3 w% f' q* h4 ?( k
; e/ c7 {& r3 t" Z- ~

13.differential_equation.py

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

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






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