QQ登录

只需要一步,快速开始

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

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

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-16 18:46 |只看该作者 |正序浏览
|招呼Ta 关注Ta
1.Scipy:; a. ~0 M% d5 g( F
简介: Scipy 是一个开源的 Python 科学计算库,提供了丰富的数学、科学和工程计算功能。它建立在 NumPy 的基础之上,并扩展了其功能,使得科学计算更加便利。Scipy 包含了许多专门的子模块,涵盖了统计、优化、插值、积分、信号处理、图像处理、常微分方程求解等领域。7 f, O8 Q7 z% q# ], {4 A8 ]# X
功能特点:
0 w; @) x9 t$ H8 m/ m提供了丰富的数学函数和常用的科学计算工具。
* Q6 {8 B$ ]% I* a) w9 Z包含了多种数值优化算法和方程求解方法。+ E" `) b+ @3 t8 W) [, c  S
提供了各种插值、积分、微分方程求解等功能。  D" b. d6 Y* I5 k; n
内置了统计分析、概率分布等统计工具。& z+ `5 T. y# B/ p
支持信号处理、图像处理、稀疏矩阵处理等功能。
4 O0 m, H3 z1 C, y; kSymPy:. W3 G, S& `* `3 v7 e5 V7 ?- X
简介: SymPy 是一个符号计算库,用于进行符号数学计算。它能够执行符号计算,包括代数运算、微积分、离散数学等,而不仅仅是数值计算。SymPy 提供了一个 Python 环境中的完整符号数学系统,可以用于解决各种数学问题,从基本的代数问题到复杂的微积分和微分方程。6 s5 ~: _  @3 K3 H5 r7 n+ b# ~
功能特点:
$ x4 y. |5 V- u7 m0 i提供了符号计算的基本功能,包括代数运算、方程求解、微积分、离散数学等。
0 _1 n' U6 x3 s' X; q支持符号表达式的构建和操作,可以进行符号运算,推导和化简。9 C2 \- h7 ]9 v  A' G; ?- x
可以用于数学符号推导、证明和解决问题。6 R( ]7 }% H; A' e* M
可以生成 LaTeX 代码以用于文档和演示。
8 [" c% v* ?3 N  v5 c, F* L( b
. v& A- }& D# S$ w  y总的来说,Scipy 适用于进行数值计算和科学工程计算,而 SymPy 更适用于符号计算和数学推导。你可以根据自己的需求选择使用其中之一或两者结合起来使用。
2 q4 |" z& e% j2 X1.导入模块:7 U" {% b/ W4 C; M4 f+ {7 i3 b8 S
" O$ y8 s5 M$ q- z$ K9 r
   import numpy as np; R3 t& j1 A, z9 |0 l2 o* n
   from scipy.integrate import odeint; w; d6 Q/ x" E
   from sympy import *9 W% Z' B" Q) `5 y: J

. {$ \' j  h9 B' J* t9 [
, c) X, R1 C+ X! }9 f* |2.numpy 是 Python 中用于科学计算的基本库,提供了大量的数学函数和支持多维数组的对象。7 r" f* X: R; k: Y- {: H
3.scipy.integrate 模块包含了用于积分和解微分方程的函数。
* ]9 E+ O3 j$ B9 ^4.sympy 是一个符号计算库,用于进行符号数学计算。$ h) {" F% Y! H1 H5 p
; ^  S0 ^' F- Q* g' b# ~  s' ?

( k: [: R4 o( p9 ~( W7 {/ t5.微分方程和数值范围:
# n6 l0 e# W- t) Z/ k7 j5 J" y) I/ o" T! H
   dy = lambda y,x:-2*y + x**2 + 2*x
; e% H3 j% \6 R, t9 l# H   x1 = np.linspace(1,10,20), A. ]& L  d- T! E5 h/ A6 y2 @9 p
- S) D% W5 b8 S
) T. z" e1 y  f+ O
6.定义了微分方程 dy,这是一个函数,表示了微分方程 $y' = -2y + x^2 + 2x$。
3 o; Q8 v( y8 ?& ^0 l4 N- [7.定义了一个包含 20 个点的线性空间 x1,用于数值解的计算。/ \+ I/ }2 ~1 s% q/ j/ O) ?- M. o

2 ]! e8 @1 f; U6 L6 E1 _8 s9 q7 ?8 m9 }+ P. q" H/ |; q: r
8.使用 SciPy 进行数值解:
( }# j( |/ ^$ t" q5 [1 N, Q8 }. s, u  q( i- e7 X1 H
   y1 = odeint(dy, 2, x1)- |; g" B7 i% n) w; Z& I9 Q

0 ^' A! O7 v4 F$ X
8 z3 L9 c! {, |' l5 Y  R3 t# D0 |9.调用 odeint 函数对微分方程进行数值求解。, |0 w8 N: |- E6 e7 i+ _; x
10.参数 dy 是微分方程的函数表达式,2 是初始条件 y(1)=2,x1 是自变量范围。3 ~& M5 u6 z# I! j
11.数值解存储在 y1 中。& b4 f; a- ?$ }; Y- C
2 a% Q8 ?" F4 n5 N8 G! I

8 b8 ]- J1 C4 ^% |- v12.使用 SymPy 进行解析解:
6 s; X7 K/ v' O! \- J& p
9 u9 |- ~3 l/ w. J3 F& k   eq = y(x).diff(x) + 2*y(x) - x**2 - 2*x/ \5 f& V" P/ d2 d5 \$ R
   con = {y(1): 2}
3 q. m  m8 m% c' l! o4 m3 ^   f = simplify(dsolve(eq, ics=con))
% L' I5 F' Q2 m
# D& M* |+ ?; y
5 d* t2 m! J) s! D) |' X! r13.定义了符号微分方程 eq,并指定了初始条件 y(1)=2。
- m/ B, b; L' z& u8 ^14.使用 dsolve 函数对微分方程进行解析求解,得到了解析解 f。6 Y2 ]! Z2 U. R

: I; N' Z  E& h0 h2 F: E6 ^- H4 b  q+ Z
15.代入值并求解:
* `2 v" e1 Q' v2 I: J) X2 ^) U3 c7 ?$ S
   x2 = np.linspace(1,10,100)0 ?3 c# Z) p  M; x
   y2 = []
9 ^  K; J! D- d$ [$ S! K   for each in x2:* x3 `) r* I5 A! {1 p4 f5 w( V) _
       y2.append(list(sorted(f.subs(x,each).evalf().atoms()))[1])" d7 c7 W6 b6 S0 ?5 y9 z3 g

6 P4 G6 m( y8 O; Y
* E" v. g4 ]8 X16.创建了一个更密集的自变量范围 x2,用于绘制解析解的曲线。
9 I) u( v  I* ]' D$ i17.遍历 x2 中的每个值,将其代入解析解中,并将结果存储在 y2 中。
# |0 t& D1 O- m  e; I+ o
% A' f, K* ^7 y2 g. e  b3 i; |# U, l0 f1 E
18.绘制图形:! Y! Y: z5 ^3 d( V, P

( ~* A- r% D! p6 s3 Y   plt.scatter(x1,y1, label='x1', color='coral')7 k$ L  T0 e+ W
   plt.plot(x2,y2, label='x2')
/ p3 |: B( K9 Z4 S7 A   plt.legend()
8 l( t: ]5 v) H) v0 u: {) f0 m+ f+ j& l- Q6 s$ G! i

' B' W) [6 a" H% t1 y8 d$ Y- l19.使用 Matplotlib 绘制了数值解和解析解的图形。
/ ?3 c0 s$ `# |; x! J2 n8 T6 d20.使用 plt.scatter 绘制了数值解的离散点,并用 coral 颜色表示。, O; ?/ U+ M5 b3 @
21.使用 plt.plot 绘制了解析解的连续曲线。
* `0 S8 m2 u  O# |9 T22.添加了图例。  O1 }( A: a/ C( ^; W1 T

/ x+ J* T1 c2 x! Z! S1 |这样,整个代码就完成了对微分方程的数值和解析解求解,并将结果可视化的过程。  x  N# I" ~+ n* [3 w
9 R; v5 {3 D& v2 ]$ z9 i1 Y5 c
  h2 b. E8 S- E2 B  r

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-6-21 02:09 , Processed in 0.394163 second(s), 56 queries .

回顶部