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

MATLAB求解方程之trapz函数

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

+ ?7 w# \7 \0 X0 E, K5 \+ ?trapz 是基于梯形法则的离散点积分函数。 调用形式:( V) {( j- D2 q) ?5 ~$ Y$ k0 e$ D
I = trapz(x,y)# \8 h2 N/ a1 Q( b' i
其中 x 和 y 分别是自变量和对应函数值,以 sin(x) 在 [0,pi] 积分为例:0 f# f$ I& J% b6 P4 g
x = linspace(0,pi,1e3);     %生成 [0,pi] 内的一系列离散点% v1 r7 A. ~% x
y = sin(x);0 w' R& w+ C. O' s: i9 _# C* U
I = trapz(x,y)
% }4 Z7 n3 d4 r* j$ K7 v
- P& P: `) P$ c浮点数误差
0 Z$ g  p4 f4 E- e9 x; [由于计算机中都是以二进制形式存储数据,当用十进制数进行计算时,就会存在十进制数二进制数的转换。但是某些十进制数转化为二进制数是一个无限位的小数,这时必须对该无限位小数进行截断计算机才能存储,那么此时就会产生误差,即浮点数误差。 ! ^  M+ _  @9 C7 x1 A+ e
例如十进制的0.9,在转化为二进制时是无限循环小数0.1110011001100110011...。此时须对该无限位小数进行截断才能保存在内存当中,截断后再转换回十进制时,0.9就变成了0.90000000000000002,这就是浮点数误差的产生过程。 3 x1 }9 q6 k5 y3 b4 ~& o" x' T6 P0 ?
由于浮点数误差的存在,当进行数值计算时就会出现一些不可避免的问题,最常见的就是判断两数相等时得到与预期相反的结果。
6 ?6 g- C4 @0 p例:令 a = 0.1+0.2, b = 0.3, 判断 a==b 时,MATLAB 会返回0, 当执行 a-b 时,会发现结果不是精确等于0,而是一个非常小的数5.5511e-17。 . W' w7 g4 y7 p! G1 k9 k; ^
或者在矩阵中寻找数的位置(也相当于是判断两数相等)。
3 `% G8 L" F7 ?%例) \/ f: r0 s0 |8 ]( y
>> a = 0.1:0.1:0.5* b: k) G/ o8 c3 Y
9 x  k: `: K7 Y2 v" W0 @1 m/ V  Y
a =
4 e) O, e/ y  V" t3 X6 r/ n2 {: }# B% a
    0.1000    0.2000    0.3000    0.4000    0.50002 k$ M/ o  d% E' N  _; `
; F* J: T2 q1 n" t1 J/ l8 E
>> find(a==0.3)
* ^. L3 P+ c; s1 U: x! f/ F2 l0 K9 k# h3 W# u. H
ans =3 }1 \5 I& M  W, u: i- j
" }' p) A3 ?" v2 y$ c
   Empty matrix: 1-by-0
7 o/ }6 V' {( h由于 a 向量中的 0.3 是由 0.1+0.1+0.1 计算得到,在计算过程中就产生了浮点数误差,这也导致在判断 a==0.3 时结果为false,所以 find(a==0.3) 返回一个空矩阵。 * @7 B+ |+ [" p# e
在进行数值计算判断两数相等时,最好不要直接判断,而是设立一个容差值,当两个浮点数的差的绝对值小于给定的容差值时,我们就认为这两个浮点数相等。
* f! x; M, v) G  ?3 }比如对于上面的例子:" h  ~! f: |$ E$ k" S
>> a=0.1:0.1:0.5
  c. N1 t, d0 S5 w. o4 X7 g9 a1 q# J; \" F8 _# M2 e
a =0 P9 }$ y5 D) n, [

, F5 s  Q  U4 q2 k  0.1000   0.2000   0.3000   0.4000   0.5000+ g) k& Z; k1 p$ I( O9 T

2 K. x. g( E+ c) H1 k+ p" Y>> tol=eps(0.3)*10   %设立容差值,一般比这个点的浮点数误差高一到两个数量级即可。eps函数能够求得该点的浮点数误差值。6 k) |  R8 `8 N

& e; u/ I4 F* ^; A/ `6 i. e' Y. Jtol = 3 C- k; u. q# V7 T
/ D8 @* Z9 V# b6 }( e: C
  5.5511e-157 B0 B, A1 t* U5 Z0 K
, e3 Q. d# y9 [+ w+ K# N8 g
>> find(abs(a-0.3)
( i2 m& q4 v7 U0 ]ans = 0 p8 ?6 \& z) b: z$ V

* ?7 M: z+ |( G2 A0 \$ F, z' Q  3
5 F; O5 w+ H# `0 h" C
( r- G" V. s. ~4 }7 m0 C7 M0 Z# S  L5 L; E/ [' b/ T) y1 p
生成一系列有规律名变量
% _1 e0 I1 ?) e, p/ \) l" b当循环迭代需要把每次迭代结果进行保存时,如果每次迭代的结果是尺寸不同的矩阵,无法用矩阵进行存储,那么可以利用 eval 和 num2str 这两个函数可以生成一系列例如 a1、a2、a3… 变量对结果进行保存(不推荐这种方法,原因是 eval 这个函数有很多缺点)。 4 m  c2 l& k3 h9 ~2 o) ?
eval::将括号内的字符串视为语句并运行。
- D  U, |4 T) s5 h8 n6 ]# _) Q$ h# gnum2str: 将数值转换为字符串。
& p9 Q8 c& f' k5 D2 G) Y) {%例3 s% q" r: p8 _$ ^7 e
for ii=1:10, i; t6 P$ P- F, ?- C
    str=['a',num2str(ii),'=1:',num2str(ii)];
3 N/ i0 U2 U' w/ ~4 |$ L    eval(str). W# y0 s# l2 y/ X  t
end+ V; f% g# M/ d. z( L- y6 `
这样可以生成一系列变量 a1、a2…a10 对循环结果进行保存。 & ~  @, E/ w& a* F/ V$ T  b% C1 J
不推荐使用 eval 函数的原因,帮助文档有详细的解释。& e+ E4 F# r8 h/ B! p( c1 H
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 ?4 l5 n) a' s4 p
Code within an eval statement can unexpectedly create or assign to a variable already in the current workspace, overwriting existing data.
# [; Z% A$ \2 ]% Y' i) IConcatenating strings within an eval statement is often difficult to read. Other language constructs can simplify the syntax in your code.
  G: z/ D. k7 A2 L% j+ ^MATLAB 对于这类问题有更好的解决办法,利用元胞数组对结果进行存储。元胞数组是 MATLAB 中的特色数据类型,它的元素可以是任意类型的变量,包括不同尺寸或不同维度的矩阵。 对于上面的例子,利用元胞数组:
7 u. G/ K6 W, c) Qfor ii=1:10
4 @: k& b2 I- H- p! A    a{ii}=1:ii;! Q" ]" Q& L7 X$ K
end
8 j7 F! t) q6 o/ R! i" e即生成一系列元胞存储循环结果。这样无论是程序的可读性、运行效率还是后续程序对保存结果调用的方便程度,都远胜于 eval 函数。0 q! g  E3 @- M
除此之外,在处理符号变量时如果需要生成一系列有规律名符号变量,例如生成一个多项式:# G  X) F9 |& R" a
y = x1+2*x2+3*x3+…+100*x100
4 C0 d% z4 w# @. |, peval+num2str 能够实现,但更简便的方法还是利用矩阵:
7 Z4 A) j9 z6 f0 u6 k9 R# f4 d  F5 Ux=sym('x',[1,100]);# v; r( C& O  V, Y6 Y: {
w=(1:100).*x;2 O- `) {' W7 w- c0 ~  n3 z
y=sum(w)1 C# P- r9 G! ^' f) `" F
' K2 l: x" x9 n1 ?

; I8 I' C! ^- w' `8 U- M

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-21 06:36 , Processed in 0.093750 second(s), 23 queries , Gzip On.

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

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

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