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

MATLAB求解方程之trapz函数

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
; Y+ f, k* v" u
trapz 是基于梯形法则的离散点积分函数。 调用形式:
! f" O5 Z0 P8 f+ k$ E! W2 z9 PI = trapz(x,y)
( r4 k) s5 {! `' l4 ~/ F* l其中 x 和 y 分别是自变量和对应函数值,以 sin(x) 在 [0,pi] 积分为例:
; W/ j& i% K- W1 f5 H+ k$ m; Wx = linspace(0,pi,1e3);     %生成 [0,pi] 内的一系列离散点
1 T" T/ t! H$ by = sin(x);: m6 u3 T: ~+ m, r+ M. s
I = trapz(x,y)( ^5 E3 M, h6 [1 o
+ A8 w3 ]  n6 _
浮点数误差8 ?: [8 i) x. c
由于计算机中都是以二进制形式存储数据,当用十进制数进行计算时,就会存在十进制数二进制数的转换。但是某些十进制数转化为二进制数是一个无限位的小数,这时必须对该无限位小数进行截断计算机才能存储,那么此时就会产生误差,即浮点数误差。   [5 M6 I: n; B9 o9 a& y  B1 x- a
例如十进制的0.9,在转化为二进制时是无限循环小数0.1110011001100110011...。此时须对该无限位小数进行截断才能保存在内存当中,截断后再转换回十进制时,0.9就变成了0.90000000000000002,这就是浮点数误差的产生过程。 % w3 w8 q0 r/ l: _
由于浮点数误差的存在,当进行数值计算时就会出现一些不可避免的问题,最常见的就是判断两数相等时得到与预期相反的结果。 0 ~' E6 i" X; y: B6 B; r1 J
例:令 a = 0.1+0.2, b = 0.3, 判断 a==b 时,MATLAB 会返回0, 当执行 a-b 时,会发现结果不是精确等于0,而是一个非常小的数5.5511e-17。 ) t4 _) O) f0 K" Z# [2 M
或者在矩阵中寻找数的位置(也相当于是判断两数相等)。7 A9 Q, Y8 S) q1 t3 C' {
%例
% ]( h4 p" x' g# H>> a = 0.1:0.1:0.58 K- l8 o" G+ E  i

4 [- ~+ m% q9 k$ xa =: h' S- k3 o* z7 D/ X

8 K" [1 |+ I' \3 @- H6 G4 p    0.1000    0.2000    0.3000    0.4000    0.5000
' U/ @0 g( D- C5 L1 h# w  f8 w/ S/ X5 [$ f/ x" [  v
>> find(a==0.3)
. x( U8 G3 ~0 L: W- ~4 p( o
2 r: t7 M$ f  e3 }2 T  F$ \# gans =
  Z+ k( e: {# \! A
4 L8 g2 |+ a0 u2 o   Empty matrix: 1-by-0
- F" F% W* s3 k0 a/ d1 |由于 a 向量中的 0.3 是由 0.1+0.1+0.1 计算得到,在计算过程中就产生了浮点数误差,这也导致在判断 a==0.3 时结果为false,所以 find(a==0.3) 返回一个空矩阵。
! Y6 f0 a( `3 w' o% g在进行数值计算判断两数相等时,最好不要直接判断,而是设立一个容差值,当两个浮点数的差的绝对值小于给定的容差值时,我们就认为这两个浮点数相等。
' _( }2 S9 O( d1 w' A5 n2 y! j比如对于上面的例子:
* r/ O; P/ T) Q( Q>> a=0.1:0.1:0.5
- b& u! ?( s" T; `0 Q3 B
* ^7 s) e4 P& l( @) N+ b7 ]a =
; R+ Z  x1 `2 \8 s' k" o' G3 c  z, d$ X+ I, R- e" P5 V8 m
  0.1000   0.2000   0.3000   0.4000   0.5000* U( P; d5 Z, E( n
( y" f0 G0 a  F' j
>> tol=eps(0.3)*10   %设立容差值,一般比这个点的浮点数误差高一到两个数量级即可。eps函数能够求得该点的浮点数误差值。& I% p) c. ^  X" {8 N
  _% T) z7 k" `  W; V
tol =
" M; ?; Q: ?# N5 O3 X( y# R5 T; h( f" _$ X
  5.5511e-15
4 f, A( J9 L2 \6 z8 \* R/ c ; O! Y+ z$ l& N  [$ r
>> find(abs(a-0.3)
3 L; V' o0 z6 J" g- U7 Kans = ) m, _8 b" W  _
) ]+ j' a4 L# \7 [
  3
8 ^+ s1 |$ A* i+ Y
5 w: z3 r: w8 X. S  ]+ |; e) U0 w7 ?0 e4 O: M& E0 x
生成一系列有规律名变量  w' w, C* }$ B$ Z" [
当循环迭代需要把每次迭代结果进行保存时,如果每次迭代的结果是尺寸不同的矩阵,无法用矩阵进行存储,那么可以利用 eval 和 num2str 这两个函数可以生成一系列例如 a1、a2、a3… 变量对结果进行保存(不推荐这种方法,原因是 eval 这个函数有很多缺点)。
' D. I8 }- v* L0 g' N: C5 veval::将括号内的字符串视为语句并运行。
6 e9 o, j1 H1 M* y8 R* c, G1 F- |num2str: 将数值转换为字符串。
: x  \1 _8 y% f0 ~%例
, M+ M% F) e! g9 X3 jfor ii=1:10
+ p( k0 Q" ~6 N) J/ c    str=['a',num2str(ii),'=1:',num2str(ii)];
% h! K9 p/ p" c    eval(str)
; n! p1 x* H( i+ r8 S0 D6 o# \end9 l# Y4 |  C, G% B, {
这样可以生成一系列变量 a1、a2…a10 对循环结果进行保存。
* a5 E+ ~' b3 i) L6 S不推荐使用 eval 函数的原因,帮助文档有详细的解释。
4 p& s4 B2 A; ~+ F. D  @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.
3 u3 R; ^- P8 p+ d; W3 C$ eCode within an eval statement can unexpectedly create or assign to a variable already in the current workspace, overwriting existing data.
8 e! S0 c! I6 t9 \Concatenating strings within an eval statement is often difficult to read. Other language constructs can simplify the syntax in your code.6 Y6 g. c- k; X5 Z
MATLAB 对于这类问题有更好的解决办法,利用元胞数组对结果进行存储。元胞数组是 MATLAB 中的特色数据类型,它的元素可以是任意类型的变量,包括不同尺寸或不同维度的矩阵。 对于上面的例子,利用元胞数组:2 N! V$ n3 G6 w) L
for ii=1:10
9 h! m) e3 |7 h  s% j' D    a{ii}=1:ii;* K0 M. ~* ?( [; M+ t' R3 e  a- F
end
8 H' Z& ~* v8 w( o5 A! s) z7 M' A5 i即生成一系列元胞存储循环结果。这样无论是程序的可读性、运行效率还是后续程序对保存结果调用的方便程度,都远胜于 eval 函数。
8 @. e9 r- H0 x$ P) z0 l除此之外,在处理符号变量时如果需要生成一系列有规律名符号变量,例如生成一个多项式:, B* }" s1 |& W3 a" p) n  U
y = x1+2*x2+3*x3+…+100*x100. ~6 n; O. n7 u  S- k- h
eval+num2str 能够实现,但更简便的方法还是利用矩阵:
) ]; w4 l) o' m2 l+ ox=sym('x',[1,100]);
& C5 u: O5 d1 d( [' H3 Fw=(1:100).*x;
. K6 j$ |7 W# _7 _9 ~y=sum(w)
, V" }; ]) N' ]& s4 C
1 Z- o: }& \7 m2 r! c' W- H+ S( m+ T' F, J1 u/ I

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-23 23:42 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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