; T1 E8 d R, O, U m0 N! b* q* C import numpy as np 2 T4 `% N. [4 S5 _, ?0 e K6 w# }7 ` from scipy.integrate import odeint0 T; r1 |1 i+ @9 Q- N2 {
from sympy import *+ E+ ^+ e$ o$ q2 ]3 }7 v" q
. x5 d7 e* h' q- w2 N% q8 W E# x$ _* q
2.numpy 是 Python 中用于科学计算的基本库,提供了大量的数学函数和支持多维数组的对象。" d7 r1 ]+ m! w. A$ ^3 u
3.scipy.integrate 模块包含了用于积分和解微分方程的函数。 f; h. A: N( O! a4.sympy 是一个符号计算库,用于进行符号数学计算。 ) N! A* [! M# S7 [ K) a @% a/ V, k5 Z+ W- P
7 e" W4 Z" c. q9 F# c2 B5.微分方程和数值范围:3 f2 G& u* Q+ Q/ M2 D
6 U) r7 e! p& ^: h% O# }9 N3 c
dy = lambda y,x:-2*y + x**2 + 2*x : v7 r% p5 h% ]$ {% ?; d# o: | x1 = np.linspace(1,10,20)3 `/ |2 H3 U, Q/ d5 O
& \2 C5 W- O4 ?8 h$ U0 l0 |1 w. r0 e, v
- ]# l& m! V; `; I9 i$ h1 t6.定义了微分方程 dy,这是一个函数,表示了微分方程 $y' = -2y + x^2 + 2x$。 ! P, X/ W" C- ?, U4 z; g' _7.定义了一个包含 20 个点的线性空间 x1,用于数值解的计算。 8 A5 ~6 P: s* {' o& O/ D! d4 l' B% H/ A+ u
& S- \' w' D0 |1 U. R
8.使用 SciPy 进行数值解: & Q; a! E5 P& F4 U% k. T/ k9 }' P* ]/ a
y1 = odeint(dy, 2, x1) % Z' E$ H" k5 z2 r Q( J8 I* R& G8 p$ x8 A
: q: j* c- T$ b: x
9.调用 odeint 函数对微分方程进行数值求解。8 |# U$ \- j& n: C/ s J
10.参数 dy 是微分方程的函数表达式,2 是初始条件 y(1)=2,x1 是自变量范围。 ) L m& Z3 \: v9 h) [/ W: c11.数值解存储在 y1 中。+ G! B8 T) m+ k7 i) p+ g$ e! _& x% R
8 c8 e8 b, E4 }; e) Q6 x
! D1 b# V+ @9 C6 e
12.使用 SymPy 进行解析解: 9 g/ e% m4 E8 k$ U/ \1 w . |6 l" g' s- [+ d# K' M eq = y(x).diff(x) + 2*y(x) - x**2 - 2*x$ D6 I) b6 l2 O# t% `1 Q5 u& r
con = {y(1): 2} + d( Q' q! {9 @4 U' h9 ?! ]/ d f = simplify(dsolve(eq, ics=con))/ Q7 O8 u% s$ P% `) m) F# g
" T$ W0 d( N7 j- I X 5 |7 d6 v. z6 O13.定义了符号微分方程 eq,并指定了初始条件 y(1)=2。6 c2 U1 s8 Y# [0 y& K
14.使用 dsolve 函数对微分方程进行解析求解,得到了解析解 f。8 y, j# a* c4 y
0 X* e" q- {3 G9 F( d6 m 3 O: f. Z3 z) {& g5 ]15.代入值并求解:' J5 M* u: J! Y, Y4 W1 Y
* X3 p# Y8 Z; R6 I. l0 g9 P1 y9 k
x2 = np.linspace(1,10,100)7 v6 } K+ `# b
y2 = []9 J0 d. ~' z9 J) v' K
for each in x2: 2 L4 Z% l4 h2 z2 k+ P y2.append(list(sorted(f.subs(x,each).evalf().atoms()))[1]); g7 b& S$ K m" h
2 k8 k$ L, {2 ? G, C( N9 Q; H* m; g
16.创建了一个更密集的自变量范围 x2,用于绘制解析解的曲线。: s$ W1 s* \6 c4 Z& @' f: Z
17.遍历 x2 中的每个值,将其代入解析解中,并将结果存储在 y2 中。5 ]. w- G/ D6 \! h
0 m: L% ?: i" s6 I" [$ o: W/ U2 R' J* V( \0 y7 D% G
18.绘制图形:9 x# x8 D+ m$ y8 O% u$ D0 Y$ A
: M4 k, F+ b0 h; o plt.scatter(x1,y1, label='x1', color='coral')3 R+ b3 k3 @: ~" T7 m, C
plt.plot(x2,y2, label='x2') 8 @7 I9 r9 k9 [ plt.legend() 7 S) {9 _) b' F2 [( e7 U$ e/ C) N8 J$ {( Z% j1 k C
8 s0 g/ c9 {0 U0 Q& L
19.使用 Matplotlib 绘制了数值解和解析解的图形。& w, R$ d% ?( m) P8 {
20.使用 plt.scatter 绘制了数值解的离散点,并用 coral 颜色表示。4 K% d$ S; y# [: A! H
21.使用 plt.plot 绘制了解析解的连续曲线。, E) M u5 g3 s5 H4 m! R" D5 z
22.添加了图例。2 x' X: m% \" y# n' a, `' I