QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2664|回复: 0
打印 上一主题 下一主题

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

[复制链接]
字体大小: 正常 放大

1186

主题

4

听众

2923

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-16 18:46 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
1.Scipy:% }$ T3 m9 H" l
简介: Scipy 是一个开源的 Python 科学计算库,提供了丰富的数学、科学和工程计算功能。它建立在 NumPy 的基础之上,并扩展了其功能,使得科学计算更加便利。Scipy 包含了许多专门的子模块,涵盖了统计、优化、插值、积分、信号处理、图像处理、常微分方程求解等领域。
! Z1 ]. Z6 K: r. R8 a功能特点:# K( A2 O* K0 z0 E, R. v: R" [% ]( i
提供了丰富的数学函数和常用的科学计算工具。( |/ `3 ]7 p0 a) u' C
包含了多种数值优化算法和方程求解方法。3 w  v2 D# _- \; f
提供了各种插值、积分、微分方程求解等功能。' b, ]; ~  i$ |% }* v
内置了统计分析、概率分布等统计工具。& P1 R% }+ A. s& @2 u
支持信号处理、图像处理、稀疏矩阵处理等功能。0 M5 d9 h4 f# D; ?6 _
SymPy:2 a+ r, ~8 _! j: @& f- g
简介: SymPy 是一个符号计算库,用于进行符号数学计算。它能够执行符号计算,包括代数运算、微积分、离散数学等,而不仅仅是数值计算。SymPy 提供了一个 Python 环境中的完整符号数学系统,可以用于解决各种数学问题,从基本的代数问题到复杂的微积分和微分方程。
2 y9 Y2 D" N# `8 y, T功能特点:% o) Y' {( q+ R
提供了符号计算的基本功能,包括代数运算、方程求解、微积分、离散数学等。
/ p1 q6 {3 D$ `支持符号表达式的构建和操作,可以进行符号运算,推导和化简。1 l- N% K. n' l; X5 l" o
可以用于数学符号推导、证明和解决问题。
2 X) ~  h  J  \! s7 q7 d7 D, r6 f9 O可以生成 LaTeX 代码以用于文档和演示。8 a" y' M# j/ |9 a

5 G4 s1 d$ R' h! U# O) |) W总的来说,Scipy 适用于进行数值计算和科学工程计算,而 SymPy 更适用于符号计算和数学推导。你可以根据自己的需求选择使用其中之一或两者结合起来使用。
) ~; }/ W" M8 {1.导入模块:1 g+ a0 U/ Y) i' n: U

( i8 V" f; K1 J( r: E   import numpy as np! E2 r+ h2 n9 j
   from scipy.integrate import odeint: y* z1 P6 _- R+ y8 u& r
   from sympy import *
( O' O* v( A$ G# K9 q7 ]! E; p. Y% V% m' r# p% W: s3 b- I1 @
- k9 u7 q" u( H" c1 a
2.numpy 是 Python 中用于科学计算的基本库,提供了大量的数学函数和支持多维数组的对象。5 s' I& p* ?) `- g, A" s, ^8 H
3.scipy.integrate 模块包含了用于积分和解微分方程的函数。
; V1 v- E1 x! N& [, t8 j1 y4.sympy 是一个符号计算库,用于进行符号数学计算。. F  J% ?" b* [

+ ^3 x0 Y6 F) f3 f( d+ P8 |
3 n9 Q! k- x, L! K, |5.微分方程和数值范围:
8 ~" `3 {# ]: p( ^  J" z
; V5 J+ d: J; _" N" f* w6 w   dy = lambda y,x:-2*y + x**2 + 2*x
+ N+ M" [% A1 H! i& }$ X' `   x1 = np.linspace(1,10,20); J5 b4 ^8 x1 B6 A
3 k; i! ?, C3 q  @4 Y  i, @9 {2 T
# H$ s) ?6 ^, r6 o
6.定义了微分方程 dy,这是一个函数,表示了微分方程 $y' = -2y + x^2 + 2x$。; T% }8 ?+ v  N$ s/ d0 \
7.定义了一个包含 20 个点的线性空间 x1,用于数值解的计算。- z6 j& Z6 Q+ k% X
6 S% c6 j$ _" H! M" U3 u) O

$ g3 P3 W- w- k" X8.使用 SciPy 进行数值解:6 u& @' g5 y, {3 B
/ `$ r3 ]. i& ~  `6 ~' x3 g
   y1 = odeint(dy, 2, x1)% V" l! K2 z  C& G7 Y: E/ ^) Y
+ `" U; f: w( B1 d( U1 Q
" y5 c! ~7 M: z% Y/ Z
9.调用 odeint 函数对微分方程进行数值求解。
1 j( l2 S  O" E10.参数 dy 是微分方程的函数表达式,2 是初始条件 y(1)=2,x1 是自变量范围。
/ g( n) z$ z* ^! S% p$ O11.数值解存储在 y1 中。
9 S, n& p' C5 v! h' K6 I: q. [8 `. }% W5 k- a
" e6 `: v2 e4 u8 V3 y' I
12.使用 SymPy 进行解析解:. _# D3 Z; N# V3 j5 O7 c1 R

9 l2 K2 j. o. V7 D7 D% G   eq = y(x).diff(x) + 2*y(x) - x**2 - 2*x
9 D& m' k3 H& J. m   con = {y(1): 2}. U$ L. _" X, `9 L. |" X# `" `
   f = simplify(dsolve(eq, ics=con))" `8 L4 }8 W# N
: {6 w* u& A- e! \! W# p
- m; C/ h  Z- m) p
13.定义了符号微分方程 eq,并指定了初始条件 y(1)=2。
, _9 z; P3 p7 [: U9 V1 N2 {8 Y14.使用 dsolve 函数对微分方程进行解析求解,得到了解析解 f。$ V( p7 S  t& y. B

6 w( h4 [! A8 d3 ^# B7 g1 {! r- q4 j1 ?+ T
15.代入值并求解:* P8 w( \! v7 [$ q6 G7 `( a' Q4 U# b
! ]- b! `# u5 L) f/ N
   x2 = np.linspace(1,10,100)
" T; |* L0 I/ G   y2 = []& C! ]: I* e! r4 `4 j4 O
   for each in x2:
; P, F0 S$ G1 D' @0 I       y2.append(list(sorted(f.subs(x,each).evalf().atoms()))[1])& h' R$ C* M9 T/ d1 j9 d
2 Q/ h1 ], n, b; q: g9 E

4 f9 ]% U& x$ c' @16.创建了一个更密集的自变量范围 x2,用于绘制解析解的曲线。
5 O# F; E: Z- Y% }0 N% k9 `1 O17.遍历 x2 中的每个值,将其代入解析解中,并将结果存储在 y2 中。9 u/ U2 k1 j  A3 q# N" P
4 ^% N* ~$ z0 q8 ]- ~
3 T* Y  f0 a# E1 f3 e; g4 s. y
18.绘制图形:% ]1 t4 w5 ?8 J6 [& i/ |7 T
1 q( r- ~1 k  t8 Y1 x
   plt.scatter(x1,y1, label='x1', color='coral')0 R& U8 L& c+ u# h( |2 J
   plt.plot(x2,y2, label='x2')4 ?8 X; ?0 _0 F4 l* ~) V& C: ?
   plt.legend()
% N% r1 ?; I. X. {( m/ S, @) y0 l! E- v& f* B
7 D: \5 R3 U) }# |: q2 q4 {( Q
19.使用 Matplotlib 绘制了数值解和解析解的图形。" l7 |* \0 O( \3 N6 t$ t9 C# Z
20.使用 plt.scatter 绘制了数值解的离散点,并用 coral 颜色表示。
1 c' g$ a! O! I$ G% S+ g# i21.使用 plt.plot 绘制了解析解的连续曲线。* h- q$ L! I- w. N) M; n+ d. @
22.添加了图例。" m2 X% A8 P. A4 S- i) G
0 f8 r% R+ U! C& V
这样,整个代码就完成了对微分方程的数值和解析解求解,并将结果可视化的过程。
/ y4 T) t+ u1 l/ u
# @7 P5 a+ m9 n5 w# O0 Z- q+ @3 y8 x6 Y9 |* \

13.differential_equation.py

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

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

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-4-21 04:20 , Processed in 0.482253 second(s), 55 queries .

回顶部