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

MATLAB求解方程之trapz函数

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

9 a: {0 S+ w$ itrapz 是基于梯形法则的离散点积分函数。 调用形式:6 R# i% T2 b( p% h" R9 J( ]# o
I = trapz(x,y)
9 n- O0 R& ]" ~( d% y, T* i其中 x 和 y 分别是自变量和对应函数值,以 sin(x) 在 [0,pi] 积分为例:
- m1 n- C. X* {9 sx = linspace(0,pi,1e3);     %生成 [0,pi] 内的一系列离散点
) c) }( V8 @& b- r' Gy = sin(x);* P5 o" L4 \' I+ R: s3 l
I = trapz(x,y)
5 ^* ]3 O3 q' n6 |/ p8 ?/ Q! _6 z% Y" N  ?: U# P6 m
浮点数误差
: Q! n, P/ o, E& d2 c$ y# R1 Z由于计算机中都是以二进制形式存储数据,当用十进制数进行计算时,就会存在十进制数二进制数的转换。但是某些十进制数转化为二进制数是一个无限位的小数,这时必须对该无限位小数进行截断计算机才能存储,那么此时就会产生误差,即浮点数误差。
' R; F9 T! t+ y- t2 J例如十进制的0.9,在转化为二进制时是无限循环小数0.1110011001100110011...。此时须对该无限位小数进行截断才能保存在内存当中,截断后再转换回十进制时,0.9就变成了0.90000000000000002,这就是浮点数误差的产生过程。 3 s3 L& B; p4 M% n& J
由于浮点数误差的存在,当进行数值计算时就会出现一些不可避免的问题,最常见的就是判断两数相等时得到与预期相反的结果。
: {# \+ t# Z/ W  y8 B/ B例:令 a = 0.1+0.2, b = 0.3, 判断 a==b 时,MATLAB 会返回0, 当执行 a-b 时,会发现结果不是精确等于0,而是一个非常小的数5.5511e-17。
8 a8 x  t" d* }3 R8 K  M或者在矩阵中寻找数的位置(也相当于是判断两数相等)。2 c5 c- y& v8 I
%例
9 }' G: g0 C" ?5 y5 O. j>> a = 0.1:0.1:0.58 m5 I* O% L2 ]* E# f5 o
1 v9 P/ F; Q3 ~" V% }! X9 _# P, x
a =( A' Z2 Z+ m! d( }

1 H4 ], o$ x& u$ y9 c    0.1000    0.2000    0.3000    0.4000    0.5000
9 J+ X. T/ l, h! a6 ]7 W; T2 ?, R  f; E7 }: x& [3 p$ _
>> find(a==0.3)
4 U. ]5 ]( }; f+ P
4 a% P9 ?, q( gans =
" o8 e, Z: D7 ^+ E: {) S; p' @
0 M/ C+ q" b" Y  b$ Q+ b   Empty matrix: 1-by-0: }4 R4 m$ r9 P
由于 a 向量中的 0.3 是由 0.1+0.1+0.1 计算得到,在计算过程中就产生了浮点数误差,这也导致在判断 a==0.3 时结果为false,所以 find(a==0.3) 返回一个空矩阵。
# t" @  J- ^. W  Y1 {/ ^" Y# W2 w在进行数值计算判断两数相等时,最好不要直接判断,而是设立一个容差值,当两个浮点数的差的绝对值小于给定的容差值时,我们就认为这两个浮点数相等。 / m8 _$ ]7 ?5 \
比如对于上面的例子:' t) J) V6 i; z1 C4 ~  S  B" ^
>> a=0.1:0.1:0.5. R5 o/ C2 V, b, Q6 S' ]

( L1 F' V3 k4 M$ L7 n% J& r. ga =
. D# u3 I. ]3 z# j
! E- e" A0 ^1 j  0.1000   0.2000   0.3000   0.4000   0.5000
8 j' v$ U, g! x9 y. }3 i2 q' g/ ^" p8 r5 p# D; w4 h
>> tol=eps(0.3)*10   %设立容差值,一般比这个点的浮点数误差高一到两个数量级即可。eps函数能够求得该点的浮点数误差值。
1 c7 D! J: `, b- h
+ U4 h: _' L: C& C' l9 r- j2 ^tol =
6 }1 r0 \- A5 O: m; u! A! x/ S, l
  5.5511e-15) X! R1 u5 a/ K0 z
/ b' [6 d- k3 p; M6 J3 ]7 @2 W$ M
>> find(abs(a-0.3)
" q1 a5 M8 S7 h% k' Zans =
* t, s% U1 h% K$ C0 G( K& z) T$ N# M$ X7 o" O1 D! a3 ~2 o
  32 ~' }) V* _7 H: h  I' \- u* z
0 }: a! U3 I' d8 S

* P! V  ~' h: r; I8 h  \生成一系列有规律名变量
! C) W2 B4 U2 z9 ?) _3 ~当循环迭代需要把每次迭代结果进行保存时,如果每次迭代的结果是尺寸不同的矩阵,无法用矩阵进行存储,那么可以利用 eval 和 num2str 这两个函数可以生成一系列例如 a1、a2、a3… 变量对结果进行保存(不推荐这种方法,原因是 eval 这个函数有很多缺点)。 ( {- O: e7 z0 l8 u6 y
eval::将括号内的字符串视为语句并运行。
3 H( ^" E/ x( onum2str: 将数值转换为字符串。+ K4 d) B% s6 f0 K
%例7 d  N2 ^& x, J' D6 n# w
for ii=1:10
- V# E( _8 z) g* [6 w7 Y    str=['a',num2str(ii),'=1:',num2str(ii)];
6 D/ d: }% A8 b- k. y; L    eval(str)
8 |3 |' T( k7 V# x  wend
( s7 f. r9 U. p& p' i  t这样可以生成一系列变量 a1、a2…a10 对循环结果进行保存。
( R1 X6 B  c4 W  {* x; y) L9 `; _不推荐使用 eval 函数的原因,帮助文档有详细的解释。: C/ c; J( r# ^" z9 r# R
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.% ^6 J. c. B- A( A" n
Code within an eval statement can unexpectedly create or assign to a variable already in the current workspace, overwriting existing data.1 `4 Y' {8 ^* o# m0 O
Concatenating strings within an eval statement is often difficult to read. Other language constructs can simplify the syntax in your code.: U- {$ _1 u( n9 ~$ r) k
MATLAB 对于这类问题有更好的解决办法,利用元胞数组对结果进行存储。元胞数组是 MATLAB 中的特色数据类型,它的元素可以是任意类型的变量,包括不同尺寸或不同维度的矩阵。 对于上面的例子,利用元胞数组:% }" J, H/ ~; h5 O
for ii=1:108 f5 |* _/ o3 w$ s/ n% X
    a{ii}=1:ii;
3 h% r$ @# A  v9 Y3 o0 i5 d7 {end
/ d# L, ~9 N" Y7 N4 F+ h即生成一系列元胞存储循环结果。这样无论是程序的可读性、运行效率还是后续程序对保存结果调用的方便程度,都远胜于 eval 函数。
0 E0 |, ?* O8 F1 B  l- K除此之外,在处理符号变量时如果需要生成一系列有规律名符号变量,例如生成一个多项式:5 E+ \* e/ O3 V
y = x1+2*x2+3*x3+…+100*x100; y2 j' p  ?3 g  [, g7 [2 A
eval+num2str 能够实现,但更简便的方法还是利用矩阵:1 c7 w/ w7 V. u* F  U  F1 F
x=sym('x',[1,100]);9 q) z8 ]. O6 l. [2 D6 I% s0 w
w=(1:100).*x;+ h- F/ j# |+ T" }  z9 S! Q
y=sum(w)
7 x# D4 h/ m' t3 Q2 m% w2 b8 [+ D7 I  I5 G4 Y2 f  i. Q
$ B, [7 w, v( X7 r% g9 v

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 01:49 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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