QQ登录

只需要一步,快速开始

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

比较通过符号计算得到的导数和通过数值差分方法计算得到的导数的结果

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

1192

主题

4

听众

2946

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-9-26 17:21 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
h=0.05; x=0:h:pi; syms x1; y=sin(x1)/(x1^2+4*x1+3);# `- N! }+ c" A# `" i- L
yy1=diff(y); f1=subs(yy1,x1,x);   % 求各阶导数的解析解与对照数据* ?+ C2 _! y8 q. G
yy2=diff(yy1); f2=subs(yy2,x1,x); yy3=diff(yy2); f3=subs(yy3,x1,x);
9 a3 M: q9 I9 A& g" O& d6 cyy4=diff(yy3); f4=subs(yy4,x1,x);2 }- j+ o  v. ?8 x$ k4 ^

6 {+ [. M- `3 P5 h, [6 N& D& ay=sin(x)./(x.^2+4*x+3);   % 生成已知数据点
4 {) l2 s; M7 X9 [: M5 V; y[y1,dx1]=diff_ctr(y,h,1); subplot(221),plot(x,f1,dx1,y1,':');1 T2 O# `  v4 O4 a' ~! O
[y2,dx2]=diff_ctr(y,h,2); subplot(222),plot(x,f2,dx2,y2,':')- y2 U9 H2 c* j' C
[y3,dx3]=diff_ctr(y,h,3); subplot(223),plot(x,f3,dx3,y3,':');# t" g4 y/ Y+ b! o
[y4,dx4]=diff_ctr(y,h,4); subplot(224),plot(x,f4,dx4,y4,':')
, T" i! ^" R. e: u" b! {' r2 _/ Y9 u) G5 E: [. }& b
norm((y4-f4(4:60))./f4(4:60))
3 z9 r9 y) l' P0 p8 O; A这段MATLAB代码旨在比较通过符号计算得到的导数和通过数值差分方法计算得到的导数的结果。以下是对代码的逐步解析:
  c% O4 f+ x  X. h+ ?/ ]" Q/ P$ [
; S2 ]/ D3 X4 J

  J5 ?7 c# y1 G### 1. 定义和设置" w! O4 g% t' J# R5 P, |
```matlab
7 I: N! S) m: q6 |h = 0.05;
7 ~( }( }9 O8 h8 h# s; Dx = 0:h:pi; 4 x; f. W+ w. }5 R' E
syms x1;
2 T$ S4 u# f; q9 Z" jy = sin(x1) / (x1^2 + 4*x1 + 3);
0 p& n& ]7 I- ~! o; q! }- P```
5 }3 C% D/ g2 m7 B- `h = 0.05;` 定义了一个小步长 `h`,用于生成数据点。
! y/ I. p% o1 J- `x = 0:h:pi;` 生成从0到π的等间距点。
* K" v1 a" p! [/ w! Y- `syms x1;` 定义了一个符号变量 `x1`。; U" x  Z2 {7 Z; i3 j  d' n
- `y = sin(x1) / (x1^2 + 4*x1 + 3);` 定义了符号函数 `y`,这是一个关于 `x1` 的函数。( j  A( E7 C2 n  G$ T  G

- x. E0 a# P2 f: b+ ?
* j, l9 k  G7 D! a, R
### 2. 计算导数
& P6 A3 S7 J8 ?* ?+ |, r```matlab, y9 I9 B1 [9 S8 R
yy1 = diff(y); ; U2 \: D" E' I8 r( t! Z
f1 = subs(yy1, x1, x);+ D0 h% m, S% Z' V! E; s# F) I
```: V  ~4 r% X0 B! q
- `yy1 = diff(y);` 计算函数 `y` 的第一阶导数。; ~! T1 _: Y. H6 a) q4 E8 U9 b
- `f1 = subs(yy1, x1, x);` 使用 `subs` 将导数中的符号变量 `x1` 替换为具体的 `x` 值,得到导数的值,储存在 `f1` 中。3 ?6 u& k9 m+ q' V2 T

8 |( |7 T2 X; O

* y! Z/ ]+ U% U; G对后续导数的计算重复相同的操作:
7 t4 D1 m/ s9 I```matlab( C( J2 e. _: N1 f. A1 q' T
yy2 = diff(yy1);
) ]; \: l6 ~: bf2 = subs(yy2, x1, x);
6 ?6 ~, m/ P- D  zyy3 = diff(yy2); + P, n* j% O1 @# K$ {
f3 = subs(yy3, x1, x);
) I% S) h3 _/ s9 v0 A9 P9 y! Nyy4 = diff(yy3); . b6 q. H' O4 p. G* g" P
f4 = subs(yy4, x1, x);4 z; n% V7 P, d& ?4 N1 n
```# A' \/ i- p( t9 n
- 上述代码计算了 `y` 的第二、第三和第四阶导数,并相应地进行了替换得到了 `f2`、`f3` 和 `f4`。
5 p4 L& `1 ^  I7 n3 `' D8 j) z. L9 q. H. M1 h  [* I

- n- U7 f0 @# n9 h! Z1 h### 3. 生成已知数据点! S7 @8 H' s+ i/ e: H1 V& g) I" [
```matlab
; ]+ ]+ e% T7 ~5 k- i" @$ Oy = sin(x) ./ (x.^2 + 4*x + 3);
- T  d; G5 k$ V3 y```& B) T( q4 ]/ y" Q0 i
- 计算 `y` 的值,将 `x` 中的每个元素代入,生成已知数据点。$ T0 ~' I- C2 j. P' C+ M) Q# Q' A) {
& Z: U" B: }  [0 K1 A$ T& O
, a4 y, Z. Z+ a( D' o
### 4. 使用差分方法计算导数9 _  w2 _  I) x
以下是使用数值方法计算导数的步骤,假设 `diff_ctr` 函数已经定义并实现:5 P5 o2 }- x) z8 [9 T3 [& f
3 T7 U3 X4 @1 c9 t, [' b
' m0 W! v2 n. V) x8 I: Q2 k- G9 @
```matlab9 m* M1 c' m) e+ I  H; `+ x$ t' C
[y1, dx1] = diff_ctr(y, h, 1); 0 {+ t7 s5 Q0 p* h1 C1 A6 e; U! I
subplot(221), plot(x, f1, dx1, y1, ':');
! k( ?4 f, q5 }1 B[y2, dx2] = diff_ctr(y, h, 2); 0 ^1 }0 d9 Q% }. v7 E1 A% t
subplot(222), plot(x, f2, dx2, y2, ':');
4 K5 z7 K, i6 S; s[y3, dx3] = diff_ctr(y, h, 3);
; L  H, S5 O8 Isubplot(223), plot(x, f3, dx3, y3, ':');
5 i2 s, F' c, z" x. s[y4, dx4] = diff_ctr(y, h, 4);
/ s  |. m* u: F2 Y3 p3 nsubplot(224), plot(x, f4, dx4, y4, ':');
+ Q5 S0 O7 g9 C```# |1 i: g/ W" y. l; f/ |
- `diff_ctr(y, h, n)` 函数可能是一个自定义的函数,用来通过中心差分方法计算函数 `y` 的 `n` 阶导数。
  G. n% l* b& W" s' k# |- `subplot` 和 `plot` 用于可视化结果,将每个计算的导数和数值差分结果绘制在不同的子图中。
$ O5 J: b, ]5 Q* r" B4 Y; R  Y! V, U' n3 [+ a& R  @$ i

0 e& }+ j, d* x: [8 ?( J& n### 5. 计算误差的规范化
& }! Y' e! p( R! q3 z```matlab% V2 r2 j$ A8 F/ S" p& U  f% E
norm((y4 - f4(4:60)) ./ f4(4:60))
# Z8 V- E# d, \, u) q```
  d! h8 d# @$ A& O! H; }# V! j+ }- `norm(...)` 用于计算向量的范数,这里比较后处理的数值导数 `y4` 和符号计算的导数 `f4(4:60)`,以计算相对误差。: _, C+ G  u- |/ ^
- 通过这种方法,用户可以评估数值计算的精度。: E" L9 R9 a1 w) F' F

+ V0 F# t% W. y$ t7 v# V

- R9 O& t; ?% ]7 j; W### 总结) a/ q+ N. O; g& F2 z* O& A
这段代码的主要目标是通过符号计算和中心差分法计算函数的导数,并绘制出它们的比较图。最终的规范化误差提供了一种衡量数值方法精度的手段。这种方法对理解和验证数值微分的重要性以及与解析解的比较相当有用。. l+ y! b- F% l, p9 O, R

; r  M$ {# Y4 V+ m
$ q0 [' W( k8 P; ^
. x( z) {0 @1 E8 h6 o% ~* ]; z* ^& D( T2 K/ O  N. R
( c: ^1 a* z- \4 |# k! ?
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-25 09:25 , Processed in 1.032421 second(s), 50 queries .

回顶部