数学建模社区-数学中国
标题:
用 Euler 法、Heun 法和改进的 Euler 法求解常微分方程
[打印本页]
作者:
2744557306
时间:
2023-12-31 15:58
标题:
用 Euler 法、Heun 法和改进的 Euler 法求解常微分方程
这是一个 MATLAB 函数,用 Euler 法、Heun 法和改进的 Euler 法求解常微分方程,并比较它们的结果。以下是对你的代码的主要部分的解释:
8 @9 g. S9 |9 q
function y = Euler1(a, b, N, af)
8 w8 J) t% q' _) s1 q
h = (b - a) / N;
% `0 q: R# d0 I% m- s. U: Z
x(1) = a;
) n) ?4 \& \% U6 R4 w/ x2 b
y(1) = af;
0 M& p2 G N( B& J7 E# I3 k7 m2 U- F6 ^
yg(1) = af;
+ Q" C- `! a4 a
yh(1) = af;
5 ]* R7 t+ `+ K5 o9 U9 i
jqj(1) = af;
# i% D4 C" f& ~' p; m. B* y' v
' F- `% u; z& e! k
% 迭代计算
0 M, v# G6 d8 \2 {
for i = 2:N+1
2 `, j* t2 W% e' k7 E/ W3 u
% Euler 法
: n Z# C$ |0 W1 K
y(i) = y(i-1) + h * f(x(i-1), y(i-1));
$ {2 I! @4 a0 z, Q. N0 q( Z; c
9 |2 Q/ L7 {" p4 u9 F- |0 Z. Z0 Q
% Heun 法
$ Z0 D# J% B. u& l( _1 a
yh(i) = yh(i-1) + (h/4) * (f(x(i-1), yh(i-1)) + 3 * f(x(i-1) + 2 * h/3, yh(i-1) + 2 * h * f(x(i-1), yh(i-1)) / 3));
$ K, X9 H5 \. C) M! J6 p( [& d
1 u0 B8 P% q8 C- J, L
% 改进 Euler 法
0 s! _ \$ u* E/ k" x
yg(i) = yg(i-1) + h * (f(x(i-1), y(i-1)) + f(x(i), y(i) + h * f(x(i-1), y(i-1)))) / 2;
* [6 S! N9 }' j" S$ ?3 }% ~
' L( `& z4 v- V
x(i) = a + (i-1) * h;
, ~ [: _& {8 ]
jqj(i) = x(i) + exp(-x(i));
, H) O6 J" c5 [+ K3 n
end
! t1 L+ e$ H& {. e6 G9 M. c W) l% W) U) B
! y" X: l* }1 ]$ |# }9 b4 B
% 计算误差
% m% k) M7 x1 D' y" O4 O( R
er = sum((y - jqj).^2); % Euler 法误差
/ f+ z/ ?9 q4 K, a/ [9 q
erg = sum((yg - jqj).^2); % 改进 Euler 法误差
7 D9 s ~7 P3 C; N9 A) L( i8 g# b
erh = sum((yh - jqj).^2); % Heun 法误差
1 t7 \/ S: p% B1 [3 q' v
4 S v9 H, b+ s! {
% 输出结果和误差
, M6 I; Z. R* F
[x', y', yg', yh', jqj']
9 W0 b9 e7 V) C7 N$ ?
disp(['Euler法误差: ', num2str(er)]);
, e. v1 f6 |/ u
disp(['改进Euler法误差: ', num2str(erg)]);
; N% S, u1 L- R7 I
disp(['Heun法误差: ', num2str(erh)]);
' d* S/ |5 x4 ^+ P8 c
! c4 B8 P" Y/ i4 X" B C8 o7 o
% 绘制结果
# C9 t# k: x+ b' C8 M. D, ~
plot(x, y, 'r', x, yg, 'b', x, yh, 'k', x, jqj, 'g');
7 E O3 X% P3 e; n- A" T
legend('Euler法', '改进Euler法', 'Heun法', '精确解');
* h# f6 e6 ]- i
end
0 b+ K1 M6 e8 ?1 f0 V' @
) T+ V' ]; g" X$ ]
% 待解的常微分方程的右侧函数
# F9 I' f) H @$ a1 D# y. M1 r
function result = f(x, y)
; T( v$ J7 k4 e, s* m
result = -y - exp(-x);
' {0 n' `# j' n; ]
end
" i+ J Z/ G3 N5 \4 C& N1 k/ w. a8 j4 w
0 N* u2 Q* f! L$ D1 a* ?
这个函数接受四个参数:
7 L# p4 k2 n( y0 Y
- {: | x) r7 d
1.a 和 b:求解ODE的时间范围。
- i8 b; v, D1 Z9 l) z9 O5 u
2.N:迭代步数。
2 j$ k" o2 [3 x6 }
3.af:初始条件。
- L- L, w' y3 J: G+ ?- R$ i: A9 G
: p! z6 K' b J+ o
在函数内部,它使用 Euler 法、Heun 法和改进的 Euler 法分别计算解,并计算了它们与精确解的误差。最后,它输出结果矩阵、误差,并通过 plot 函数将结果绘制出来。
$ q# R0 ~1 Z- X( g
你可以通过调用这个函数并提供合适的参数来运行它,例如:
' T/ C# T ~% n9 V- X* [
Euler1(0, 1, 10, 1);
" q' g. Q) c3 H! G* N6 Q
: G, H& x7 b: R3 m% D [: S
这将演示在给定的时间范围内使用三种不同的数值方法求解简单的常微分方程,并比较它们的结果。
/ g; n' V7 j( |2 a
* f% V$ h7 I2 D U! f* x$ G( t
% N- l, {* `3 b& H- H6 K
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5