找回密码
 注册
关于网站域名变更的通知
查看: 626|回复: 1
打印 上一主题 下一主题

MATLAB求解方程之trapz函数

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-2-19 18:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
6 y. o% ~' O+ D9 \' Q
trapz 是基于梯形法则的离散点积分函数。 调用形式:0 E' U! A/ q( Q
I = trapz(x,y)' U: k3 `) g) F; X
其中 x 和 y 分别是自变量和对应函数值,以 sin(x) 在 [0,pi] 积分为例:2 X. Q' P- \) B: N
x = linspace(0,pi,1e3);     %生成 [0,pi] 内的一系列离散点* i8 f$ T6 s' a0 f- n1 i6 X# E
y = sin(x);" J6 |3 N! G! N* e' j
I = trapz(x,y)
. Q+ r* Q2 h1 g" I! N$ w8 g" u; n& V( t8 U' Z" t
浮点数误差
# ~3 m) F6 ^; v0 o0 ~/ e, q由于计算机中都是以二进制形式存储数据,当用十进制数进行计算时,就会存在十进制数二进制数的转换。但是某些十进制数转化为二进制数是一个无限位的小数,这时必须对该无限位小数进行截断计算机才能存储,那么此时就会产生误差,即浮点数误差。 # L% o$ B, W2 O; |7 w) c' `
例如十进制的0.9,在转化为二进制时是无限循环小数0.1110011001100110011...。此时须对该无限位小数进行截断才能保存在内存当中,截断后再转换回十进制时,0.9就变成了0.90000000000000002,这就是浮点数误差的产生过程。 1 j% c4 O' ^) f
由于浮点数误差的存在,当进行数值计算时就会出现一些不可避免的问题,最常见的就是判断两数相等时得到与预期相反的结果。 ( T  |3 o6 M( E( ?9 U$ o% i4 G$ T) q
例:令 a = 0.1+0.2, b = 0.3, 判断 a==b 时,MATLAB 会返回0, 当执行 a-b 时,会发现结果不是精确等于0,而是一个非常小的数5.5511e-17。
* T$ L/ F3 w8 ?! R或者在矩阵中寻找数的位置(也相当于是判断两数相等)。& s+ T1 s6 c/ e  |
%例
' t2 ~+ v- F. B" ]9 h8 e>> a = 0.1:0.1:0.5
0 }" F% z3 h$ l) |. G0 v0 Y+ ~1 {7 I  I9 T
a =4 n7 y- M! D  K

5 a; y5 G4 A$ x. Y    0.1000    0.2000    0.3000    0.4000    0.50004 U  m% _* o& T  X1 ~( C

% a% V9 R( Y: s% s>> find(a==0.3)4 E* O4 V7 ?; ^! v9 X

5 r. h3 |2 x+ `6 \  w+ o, d) Zans =
1 b( H+ ?  H: f( g/ N" h
& q% m2 m( j7 U0 l   Empty matrix: 1-by-0; G" K: ~: b; H) G* o
由于 a 向量中的 0.3 是由 0.1+0.1+0.1 计算得到,在计算过程中就产生了浮点数误差,这也导致在判断 a==0.3 时结果为false,所以 find(a==0.3) 返回一个空矩阵。
- K+ B, s3 y$ u, }+ s% J在进行数值计算判断两数相等时,最好不要直接判断,而是设立一个容差值,当两个浮点数的差的绝对值小于给定的容差值时,我们就认为这两个浮点数相等。 % W3 X, C0 H) `0 F& f
比如对于上面的例子:
+ l- u' K0 r2 o- g& v8 h>> a=0.1:0.1:0.5# S, |; i/ }$ x+ Y0 n
0 K& p& ?% _5 J# j6 q  Q& I
a =
  H# {9 P, s3 C9 j6 M, N4 W+ ^' B3 A# _6 p
  0.1000   0.2000   0.3000   0.4000   0.50002 d- \3 q$ f7 V8 S% M1 ]! M

9 N% L4 t: N& g( }>> tol=eps(0.3)*10   %设立容差值,一般比这个点的浮点数误差高一到两个数量级即可。eps函数能够求得该点的浮点数误差值。
+ ~' U4 _' X1 i+ L/ R) n
' p) m; z5 D! T& [- P/ mtol =
" m- g& q  h( b% l5 u- p& Z( t0 b8 [
  5.5511e-154 D6 g) N$ U% z" B3 f: |
3 j' c& G* x  o% x, l$ O
>> find(abs(a-0.3)$ ?0 _3 z7 D% }
ans =   H7 c2 A. |% j  A1 Q( J# H
. H/ G1 F! |3 p
  3" i. V' W  J8 w. o
! R  r% I% m7 |5 Y0 j1 y
5 q8 b4 s# @* ?% h: `4 D
生成一系列有规律名变量) A. p/ e* b8 `2 a$ \. U
当循环迭代需要把每次迭代结果进行保存时,如果每次迭代的结果是尺寸不同的矩阵,无法用矩阵进行存储,那么可以利用 eval 和 num2str 这两个函数可以生成一系列例如 a1、a2、a3… 变量对结果进行保存(不推荐这种方法,原因是 eval 这个函数有很多缺点)。 1 T9 u$ j/ b0 w1 G  c
eval::将括号内的字符串视为语句并运行。+ o: o$ I: d' |* N. `
num2str: 将数值转换为字符串。
. \( K+ T0 \1 b; C%例
& I/ K( Q8 X  \1 @1 a. Ifor ii=1:10
! X% S: t& d8 r6 C  I    str=['a',num2str(ii),'=1:',num2str(ii)];$ @& y) a( M2 W
    eval(str)* m* U) ^7 K; y# o8 `$ @6 p
end
' _; n& l3 I" v  a1 p, r这样可以生成一系列变量 a1、a2…a10 对循环结果进行保存。 / R. O$ J  }, I7 }
不推荐使用 eval 函数的原因,帮助文档有详细的解释。  B* ^* P8 Z8 ], ], u
MATLAB® compiles code the first time you run it to enhance peRFormance for future runs. However, because code in an eval statement can change at run time, it is not compiled.
5 H0 M+ `. k( Q3 Q6 NCode within an eval statement can unexpectedly create or assign to a variable already in the current workspace, overwriting existing data." E9 p+ h6 V* f: p. [3 `9 S+ U
Concatenating strings within an eval statement is often difficult to read. Other language constructs can simplify the syntax in your code.
+ C6 l+ {+ D# W) j1 _MATLAB 对于这类问题有更好的解决办法,利用元胞数组对结果进行存储。元胞数组是 MATLAB 中的特色数据类型,它的元素可以是任意类型的变量,包括不同尺寸或不同维度的矩阵。 对于上面的例子,利用元胞数组:
( p- W/ @0 L  F# J0 W. |! g3 [0 ffor ii=1:10
' ~& U1 ]$ ?" b    a{ii}=1:ii;% W0 @6 A9 [5 |) f# t( K& `$ ?
end4 B3 R+ [7 R0 _9 a$ G8 H
即生成一系列元胞存储循环结果。这样无论是程序的可读性、运行效率还是后续程序对保存结果调用的方便程度,都远胜于 eval 函数。
, G+ w) {; \6 I0 o- k0 f3 x除此之外,在处理符号变量时如果需要生成一系列有规律名符号变量,例如生成一个多项式:: j) u6 s% R! j' N6 ~# \
y = x1+2*x2+3*x3+…+100*x100
# Q% [. H8 ~* }4 S+ Q9 l& Neval+num2str 能够实现,但更简便的方法还是利用矩阵:3 g5 `! h+ T/ \1 E4 j7 w! @
x=sym('x',[1,100]);/ d5 ]+ B; e- V4 c
w=(1:100).*x;( N# q/ L8 H6 y4 B' V
y=sum(w)) Z% e  P& i6 K0 w. Q) U$ ?* e

0 B% \/ L/ ]& s' c) w2 _7 V
: E( z( b' j5 ]; c4 _

该用户从未签到

2#
发表于 2021-2-19 18:42 | 只看该作者
MATLAB求解方程之trapz函数
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-13 17:33 , Processed in 0.109375 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表