1 _) D3 S0 h! I" B总的来说,Scipy 适用于进行数值计算和科学工程计算,而 SymPy 更适用于符号计算和数学推导。你可以根据自己的需求选择使用其中之一或两者结合起来使用。: p; V0 f/ H3 E# R- x
1.导入模块: ) h5 d8 v! \' v o8 f" ~9 |5 F2 j+ e import numpy as np 5 P8 O* O; w% z- {: T" q6 Z from scipy.integrate import odeint ; y" K t* g# V6 S from sympy import * $ r, ]1 g) x. N" Y$ ~5 f% F1 V* v# O# K
- H1 U6 Y+ l* `# W! y# ^2 C2.numpy 是 Python 中用于科学计算的基本库,提供了大量的数学函数和支持多维数组的对象。 5 m, c5 G6 m9 E0 L! j0 i" ~+ F3.scipy.integrate 模块包含了用于积分和解微分方程的函数。* M/ a) M- J8 b# e' ]! Y
4.sympy 是一个符号计算库,用于进行符号数学计算。; _7 @; W @ P" M1 d' Q8 R
C1 X" H6 k& s6 a q0 J6 ^( V) }
/ }! ^ R3 R8 W( |
5.微分方程和数值范围:& x* I% F4 ]7 e1 F4 h
R1 A1 C7 y1 ?9 [/ K5 K! t0 C dy = lambda y,x:-2*y + x**2 + 2*x* F+ ]9 b& J1 r9 x
x1 = np.linspace(1,10,20)9 E; b# x O# b6 G
0 T. g: r K+ d# x% v6 i0 X
: d1 a; p9 X4 E f3 s
6.定义了微分方程 dy,这是一个函数,表示了微分方程 $y' = -2y + x^2 + 2x$。 , G4 n r: {' W7.定义了一个包含 20 个点的线性空间 x1,用于数值解的计算。 * i5 W: [ B2 |5 f/ c; s6 Y& N' K' S' g
/ o5 W9 @/ W" d$ G! _0 m/ p
8.使用 SciPy 进行数值解: V; W9 ~. Y# H) |/ f
4 W7 W( ^) r+ L. h! e$ b y1 = odeint(dy, 2, x1)) e2 c. F; v: F9 n. w0 W( _
+ h" [) B2 g5 F7 K! j3 T, l) e9 X& \: ^7 `/ ?: N o4 J
9.调用 odeint 函数对微分方程进行数值求解。 5 k, E9 L8 F$ v% S$ y6 ?( N7 ]10.参数 dy 是微分方程的函数表达式,2 是初始条件 y(1)=2,x1 是自变量范围。 : M3 D/ Y3 G) N- p2 _5 q& Q6 y h) f11.数值解存储在 y1 中。 5 n( [8 O1 u, D2 h& S9 ~ * r2 d) S7 V. {+ u; T 7 h" z |6 D3 B& t1 X) f! O12.使用 SymPy 进行解析解:% y5 F! Z. M# \5 }4 n; ^3 B# b7 L
, Q( I# z1 X9 }( |
eq = y(x).diff(x) + 2*y(x) - x**2 - 2*x * T" p' H( j4 k$ l; b* G( x con = {y(1): 2} 3 r3 b; f3 P# K9 C( c" W5 d* n f = simplify(dsolve(eq, ics=con)) 2 e8 S! y& S& w' e2 K ! O' g* L# t9 G1 S7 a% E( v* T1 G! k( B
13.定义了符号微分方程 eq,并指定了初始条件 y(1)=2。+ B: C: C7 A) I, A# P
14.使用 dsolve 函数对微分方程进行解析求解,得到了解析解 f。5 O! ~- H: E+ m' Y! k' @; t
5 o- E. N9 L# ?& V8 u
% G7 }6 [* i1 d/ u& R: S6 ~+ e. @15.代入值并求解: ; \5 U1 ^1 I4 E 9 {5 Q' a" v7 D- T x2 = np.linspace(1,10,100) 4 O, \8 t6 H( M ~+ u y2 = [] , u6 r, `" e% e. {+ m" T for each in x2:6 a3 _1 C( b' [8 E. _1 N3 x1 U
y2.append(list(sorted(f.subs(x,each).evalf().atoms()))[1])& h5 V( w& o4 W+ e$ Q( m4 T
, n0 R, A$ P' } 0 I! N6 @; ^0 ~4 t- g$ n, N16.创建了一个更密集的自变量范围 x2,用于绘制解析解的曲线。+ r0 B! `& x' }9 o3 F
17.遍历 x2 中的每个值,将其代入解析解中,并将结果存储在 y2 中。' \8 g( x* r( j( I2 g. u
' M% b% C0 {. ]' ^+ g% _ % W* c. H$ A$ j7 |# p+ w* H; t18.绘制图形: ! k9 L+ {; k+ D# ^: R: o ) i1 l. L: w b. v {7 i* B6 a0 R plt.scatter(x1,y1, label='x1', color='coral') % m) \( Y7 D6 t3 o! c) x plt.plot(x2,y2, label='x2')4 G; P9 @+ v- l7 r! q
plt.legend() 9 A* {9 I. N @! V; T, _9 Y T3 p- l2 d1 V7 d# R" p
7 Z0 H/ A# g8 {* d( T6 C19.使用 Matplotlib 绘制了数值解和解析解的图形。+ q/ v G5 W. {7 G8 I' g2 `/ V Q! |
20.使用 plt.scatter 绘制了数值解的离散点,并用 coral 颜色表示。 9 ]; \, k% d5 n2 X& E' |% p21.使用 plt.plot 绘制了解析解的连续曲线。- @' W; |5 l. ]2 U, k; ~
22.添加了图例。 S; \ O8 E/ ^" y. C8 t : [! R! x) H4 ^2 S- c这样,整个代码就完成了对微分方程的数值和解析解求解,并将结果可视化的过程。. _$ j% N' s0 _+ p