QQ登录

只需要一步,快速开始

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

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

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-16 18:46 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
1.Scipy:7 V* a) f# ?+ I4 x
简介: Scipy 是一个开源的 Python 科学计算库,提供了丰富的数学、科学和工程计算功能。它建立在 NumPy 的基础之上,并扩展了其功能,使得科学计算更加便利。Scipy 包含了许多专门的子模块,涵盖了统计、优化、插值、积分、信号处理、图像处理、常微分方程求解等领域。; Y4 U$ u7 |6 P1 R0 t! S5 t9 V
功能特点:
9 O( {; O: V, N2 n提供了丰富的数学函数和常用的科学计算工具。: v/ s1 e0 ^/ ^8 \# C! N! {
包含了多种数值优化算法和方程求解方法。' N. b! ?) n8 f, u# x+ k
提供了各种插值、积分、微分方程求解等功能。
3 }4 R4 W  u( Q2 c5 ?内置了统计分析、概率分布等统计工具。
+ C# q' T0 W( i0 W支持信号处理、图像处理、稀疏矩阵处理等功能。& Y% _6 o' T* P+ F1 c
SymPy:4 m5 |4 |! l5 K* x1 m  }1 s
简介: SymPy 是一个符号计算库,用于进行符号数学计算。它能够执行符号计算,包括代数运算、微积分、离散数学等,而不仅仅是数值计算。SymPy 提供了一个 Python 环境中的完整符号数学系统,可以用于解决各种数学问题,从基本的代数问题到复杂的微积分和微分方程。
' w5 A& Q5 `% G/ |功能特点:4 A8 I* i6 O, q" h+ Y1 a0 D4 m% \" Q
提供了符号计算的基本功能,包括代数运算、方程求解、微积分、离散数学等。, W. j: Q& B2 m* s; V' r' d2 y5 l) d6 x
支持符号表达式的构建和操作,可以进行符号运算,推导和化简。- A6 X+ I  V3 Z# J7 }& F' R" Q
可以用于数学符号推导、证明和解决问题。
) P, i; a9 @* [5 j, c" F可以生成 LaTeX 代码以用于文档和演示。
% V4 E' N* k9 z7 \1 g" P
" P% m" W+ P$ z+ s) T总的来说,Scipy 适用于进行数值计算和科学工程计算,而 SymPy 更适用于符号计算和数学推导。你可以根据自己的需求选择使用其中之一或两者结合起来使用。; @: g( W, z$ Q( g0 m
1.导入模块:
& l. o0 A3 N: v3 K& B6 |: r. W- g$ o
   import numpy as np
6 k' c8 S% W6 N1 T6 ?% F   from scipy.integrate import odeint
4 K( e* N- t; I( b   from sympy import *8 _4 U$ |' h% z8 ?/ N# w( }
+ ]. y6 o, A& e$ V3 @

/ ~% m5 G/ W4 V' _2.numpy 是 Python 中用于科学计算的基本库,提供了大量的数学函数和支持多维数组的对象。
9 g# \, T! M) {: I3 a8 P3.scipy.integrate 模块包含了用于积分和解微分方程的函数。* q8 _3 }# D( o: U- V! W1 o+ [: J
4.sympy 是一个符号计算库,用于进行符号数学计算。
: y$ ]  |" ?9 L
2 d8 N) Q) J' ?+ |. E
+ v" l7 |; B6 ^; o* {+ Y! L5.微分方程和数值范围:
+ w2 N  C- b$ k* y- i1 H$ g) ?. J/ d! P1 K. Z' U
   dy = lambda y,x:-2*y + x**2 + 2*x' H" v" s: B, V$ x% u/ Z+ {: @! z
   x1 = np.linspace(1,10,20)
8 A. y! p( [% r, ]" s, y
) s7 b9 w( [2 [, @  q7 a2 ~: k; z5 \
4 k8 B( w2 w, J; T" k& }3 R6.定义了微分方程 dy,这是一个函数,表示了微分方程 $y' = -2y + x^2 + 2x$。( v: n. D/ a: H5 ~& t1 M
7.定义了一个包含 20 个点的线性空间 x1,用于数值解的计算。* K  O/ ~4 ]0 F

4 z) O7 Z) h+ V. [2 \$ Z1 n  T* D
8.使用 SciPy 进行数值解:
( G5 z: O  E( `: L" j
: d0 Y6 [3 y. [   y1 = odeint(dy, 2, x1)7 c/ I1 b4 F; y7 W
! z6 \$ }; r% H4 R

+ J* k$ K5 W7 z; R4 U- w: E9.调用 odeint 函数对微分方程进行数值求解。
+ T' e: n+ J+ e1 u! H10.参数 dy 是微分方程的函数表达式,2 是初始条件 y(1)=2,x1 是自变量范围。, Q* m! @7 y+ B0 M5 ^+ o
11.数值解存储在 y1 中。7 p4 Q% ~) p9 m& C, d  O' h7 u( ]

) k. B  a  [  L2 c2 t: ?$ _8 `" }5 k: r5 W) v. G! N. i
12.使用 SymPy 进行解析解:; j% X8 H9 f9 x$ I& i
# {% ~* S! \& T/ K# A: ?
   eq = y(x).diff(x) + 2*y(x) - x**2 - 2*x
8 @8 K3 D' ^0 u* H   con = {y(1): 2}1 n9 P* z, H: J3 ?% p
   f = simplify(dsolve(eq, ics=con))
. F: Q2 G4 p# S9 x/ g
7 H' X5 B' n. H" ]" F* l" n) `
6 y+ {/ A, T- v4 M4 ?13.定义了符号微分方程 eq,并指定了初始条件 y(1)=2。* G+ S: i9 }0 ]: E* b( L1 A: N
14.使用 dsolve 函数对微分方程进行解析求解,得到了解析解 f。; l# `$ p; }9 N

+ ~4 s* @1 B1 O" b" }
+ Y) ?1 x& K/ r/ B: e8 P15.代入值并求解:; W9 V2 U1 C$ a$ E& W8 S7 `

! o# E* J! @+ E* a4 O, {" p4 N, e   x2 = np.linspace(1,10,100)
: H9 K' ~6 K+ I" Y   y2 = []
, g, ^' j. Z; o) Z0 g   for each in x2:& e& H8 ?4 y' d# g
       y2.append(list(sorted(f.subs(x,each).evalf().atoms()))[1])
3 J" t$ i, L4 X  }, q0 Y) t1 R& F3 m
* G* s3 F1 }" T
( z+ ^; S# S2 b( a# u) F16.创建了一个更密集的自变量范围 x2,用于绘制解析解的曲线。- E' U4 L; p, R* \/ i
17.遍历 x2 中的每个值,将其代入解析解中,并将结果存储在 y2 中。
# Y& @2 v$ S6 p- z# i' p: }- s- O4 I9 o: U" x* h
0 g& p/ V  Q( L8 ?
18.绘制图形:
) s4 N* {- b1 E- m0 I" `+ A: {+ o
   plt.scatter(x1,y1, label='x1', color='coral')$ e+ s; N( N" u. n
   plt.plot(x2,y2, label='x2')
* c8 q: ^8 H! G, d  O   plt.legend()
, M& d; u) B* c/ n) g" N& g" B

) o; S5 V# R- J: T# ?. B19.使用 Matplotlib 绘制了数值解和解析解的图形。
3 [: A& Y0 T! q7 }& X20.使用 plt.scatter 绘制了数值解的离散点,并用 coral 颜色表示。4 t$ m, Y- j: `2 {
21.使用 plt.plot 绘制了解析解的连续曲线。
, Z# D2 }+ g& K# ~' r# H22.添加了图例。' g2 G3 t' w% _( V% \& d( h: g

. Z2 `5 z3 m8 k; f' {+ Q% A" b这样,整个代码就完成了对微分方程的数值和解析解求解,并将结果可视化的过程。$ K! U' y) L: P) k5 v" u+ r$ O) ]

5 K# m, W$ R0 l0 S' o7 {" ^* Y- r& Z1 Q; E  ~2 b$ W

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-8-8 03:41 , Processed in 0.406864 second(s), 55 queries .

回顶部