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

MATLAB求解方程之trapz函数

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
! x) [; Z3 A: E& I# E. U! L
trapz 是基于梯形法则的离散点积分函数。 调用形式:
* }, X2 o. n) l) GI = trapz(x,y)' o1 [2 G6 Z8 U: [/ r( s6 j
其中 x 和 y 分别是自变量和对应函数值,以 sin(x) 在 [0,pi] 积分为例:
* O" C8 W7 H* w- _x = linspace(0,pi,1e3);     %生成 [0,pi] 内的一系列离散点+ [# X7 V  l5 R" B- \1 ^
y = sin(x);
3 a  E$ @% V4 M" oI = trapz(x,y). B3 U( @$ e+ j

: J* w! R0 V# r( ~浮点数误差6 ~' n3 i( m. {
由于计算机中都是以二进制形式存储数据,当用十进制数进行计算时,就会存在十进制数二进制数的转换。但是某些十进制数转化为二进制数是一个无限位的小数,这时必须对该无限位小数进行截断计算机才能存储,那么此时就会产生误差,即浮点数误差。
8 b) L6 i3 |! o3 F* ^例如十进制的0.9,在转化为二进制时是无限循环小数0.1110011001100110011...。此时须对该无限位小数进行截断才能保存在内存当中,截断后再转换回十进制时,0.9就变成了0.90000000000000002,这就是浮点数误差的产生过程。 7 q8 V. C) u# R/ ^  O: z8 g- `7 q0 P
由于浮点数误差的存在,当进行数值计算时就会出现一些不可避免的问题,最常见的就是判断两数相等时得到与预期相反的结果。 ' C8 Q& I' t, s8 `, _6 K! R: R9 P
例:令 a = 0.1+0.2, b = 0.3, 判断 a==b 时,MATLAB 会返回0, 当执行 a-b 时,会发现结果不是精确等于0,而是一个非常小的数5.5511e-17。
7 [8 n) [8 z: R" e' Q. J+ A  \- E或者在矩阵中寻找数的位置(也相当于是判断两数相等)。
+ k, T1 e$ k5 [- ^, Y( Y%例) ]" b+ ?) L1 k: _' @' q
>> a = 0.1:0.1:0.5
5 }* g7 N3 c3 j; Q9 G' M+ g3 b: T. S2 u3 I: ]! M
a =
4 i9 Z7 G! D4 [4 o8 e- L8 L; l: ^. i7 {/ P( q$ Z, T  p
    0.1000    0.2000    0.3000    0.4000    0.5000- H8 h8 s. k5 b- x  x% p4 F4 C
. x+ Y0 B. U, {5 J1 B, V1 }5 l) E
>> find(a==0.3)
* O6 l5 b8 X+ c- u" F  m* }2 p, L9 s6 {
ans =
$ m, k  M% I( D( L( t/ t& _8 f
. E" a+ O& C* v( D( U5 b* g   Empty matrix: 1-by-04 ^5 s) _! g1 Z8 x% B% W
由于 a 向量中的 0.3 是由 0.1+0.1+0.1 计算得到,在计算过程中就产生了浮点数误差,这也导致在判断 a==0.3 时结果为false,所以 find(a==0.3) 返回一个空矩阵。 ' q$ V9 x  p  b2 R- S
在进行数值计算判断两数相等时,最好不要直接判断,而是设立一个容差值,当两个浮点数的差的绝对值小于给定的容差值时,我们就认为这两个浮点数相等。
' \1 G( F) d! z# w5 \+ Y比如对于上面的例子:, @+ a( \4 L, P
>> a=0.1:0.1:0.50 F8 Z0 E- Q& X% i/ O7 N& l& {3 {
# ~  O) ~8 V0 Z* F3 I
a =6 v' f. R8 `5 c6 F# K7 a& K/ [
& }5 P. h0 N2 A# x' f
  0.1000   0.2000   0.3000   0.4000   0.5000
; C( U  u9 J3 ^2 E' I7 F1 y& ?, n5 m  f3 x" j; e+ D# G9 }. R
>> tol=eps(0.3)*10   %设立容差值,一般比这个点的浮点数误差高一到两个数量级即可。eps函数能够求得该点的浮点数误差值。
; m$ J& T- G; ~) s4 S/ a/ W) ]! P; T1 x$ @$ i( F2 A7 i
tol =
# n( p' J% W, |8 G& v( v1 n0 D6 d& x3 Q
  5.5511e-15, h8 U7 ~: ]4 z& |; B- C' w5 |% a
; C3 I8 A3 Q7 ^8 r( o% w* t
>> find(abs(a-0.3)
" e* L( @+ }* _' n- y  O. eans = ! K/ r1 L- G5 X# L
& s; D( D$ ?& R. ~  Q. A4 E
  3
2 X! e. n6 m. d; ]* ]" n
' h" e0 X: g6 a* g/ A3 K8 B# R
; B& ]& r8 w5 c: Y$ S8 B( S( U+ P$ ?生成一系列有规律名变量& c0 Z- X: M; q% f- n0 E+ p3 S
当循环迭代需要把每次迭代结果进行保存时,如果每次迭代的结果是尺寸不同的矩阵,无法用矩阵进行存储,那么可以利用 eval 和 num2str 这两个函数可以生成一系列例如 a1、a2、a3… 变量对结果进行保存(不推荐这种方法,原因是 eval 这个函数有很多缺点)。 ( m+ x) d* F' S- r, _( T
eval::将括号内的字符串视为语句并运行。
2 C1 J& a6 y! bnum2str: 将数值转换为字符串。
* _- [( h' v: j2 E$ |+ c" n  V  Q%例
( ]  O% {7 y$ L$ `: Zfor ii=1:100 p4 O9 k( v: u( r) A
    str=['a',num2str(ii),'=1:',num2str(ii)];+ N7 I$ R; P4 U9 P
    eval(str)# E. `2 D( j: B* E5 E9 r* |2 c% L5 G
end5 w9 y3 j" S" m  H6 B
这样可以生成一系列变量 a1、a2…a10 对循环结果进行保存。
3 l3 W/ _; J! z9 ?$ F* [不推荐使用 eval 函数的原因,帮助文档有详细的解释。
3 S+ T6 x8 U9 o! {" WMATLAB® 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 ]. \! O4 O) a$ O4 Y3 S* |
Code within an eval statement can unexpectedly create or assign to a variable already in the current workspace, overwriting existing data.
# X. O8 z& N2 @: B5 \3 uConcatenating strings within an eval statement is often difficult to read. Other language constructs can simplify the syntax in your code.
" X/ I/ {6 K6 a# J) k, jMATLAB 对于这类问题有更好的解决办法,利用元胞数组对结果进行存储。元胞数组是 MATLAB 中的特色数据类型,它的元素可以是任意类型的变量,包括不同尺寸或不同维度的矩阵。 对于上面的例子,利用元胞数组:
$ T' i5 `( I8 S3 j' ~for ii=1:10
- n6 U7 F- R0 d0 d; K, T  w8 ~    a{ii}=1:ii;9 e. K$ Y6 W9 H
end* I( R! a' `5 l5 D
即生成一系列元胞存储循环结果。这样无论是程序的可读性、运行效率还是后续程序对保存结果调用的方便程度,都远胜于 eval 函数。3 Q+ d5 ]; b* P' u. O0 _; x
除此之外,在处理符号变量时如果需要生成一系列有规律名符号变量,例如生成一个多项式:
% m% Y7 y- J7 I( {4 g6 Vy = x1+2*x2+3*x3+…+100*x100( d& f, f+ ~* a5 c2 h+ n: z
eval+num2str 能够实现,但更简便的方法还是利用矩阵:: a5 R% ?# h  G2 v8 ~; Y
x=sym('x',[1,100]);
3 s' J3 L$ o  h8 J7 o/ f9 sw=(1:100).*x;5 x- n9 j- S8 l- F
y=sum(w)
- G7 [5 R! E7 A3 ~9 s
: ?0 X* L8 a7 p1 R& u' C
% ?7 i2 x2 c! M

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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