前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >matlab的trapz求定积分_matlab求离散点积分

matlab的trapz求定积分_matlab求离散点积分

作者头像
全栈程序员站长
发布2022-11-15 17:30:10
1.5K0
发布2022-11-15 17:30:10
举报
文章被收录于专栏:全栈程序员必看

EDA365欢迎您登录!

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

x

( T( B3 I- e% Q& H3 m

trapz 是基于梯形法则的离散点积分函数。 调用形式:6 H* C! T A0 d

I = trapz(x,y)g3 ]; x1 g( x! w( K h+ R% R3 G6 `

其中 x 和 y 分别是自变量和对应函数值,以 sin(x) 在 [0,pi] 积分为例:

/ p- s3 v8 y l( [x = linspace(0,pi,1e3); %生成 [0,pi] 内的一系列离散点 r1 ~3 ?7 ?, F3 J8 j

y = sin(x);

7 G& A- R% g3 f7 I” M$ G* AI = trapz(x,y)

* V9 [* Y$ s) o, g6 M, e. p” D2 r% K& i% N- F6 o) r( q

浮点数误差: j6 H/ D K5 ^, N

由于计算机中都是以二进制形式存储数据,当用十进制数进行计算时,就会存在十进制数二进制数的转换。但是某些十进制数转化为二进制数是一个无限位的小数,这时必须对该无限位小数进行截断计算机才能存储,那么此时就会产生误差,即浮点数误差。 8 D( O. `3 V- W’ d# Y# N

例如十进制的0.9,在转化为二进制时是无限循环小数0.1110011001100110011…。此时须对该无限位小数进行截断才能保存在内存当中,截断后再转换回十进制时,0.9就变成了0.90000000000000002,这就是浮点数误差的产生过程。 # w’ A9 Z+ {0 T+ q4 {; O” i% n

由于浮点数误差的存在,当进行数值计算时就会出现一些不可避免的问题,最常见的就是判断两数相等时得到与预期相反的结果。

( J6 }$ B1 @# O( y, Y+ R例:令 a = 0.1+0.2, b = 0.3, 判断 a==b 时,MATLAB 会返回0, 当执行 a-b 时,会发现结果不是精确等于0,而是一个非常小的数5.5511e-17。

4 U Q o” x2 r: P* Z1 T’ u- F或者在矩阵中寻找数的位置(也相当于是判断两数相等)。0 s% a J& a+ q& I

%例8 v7 J& e) R3 k, T; F% ~

>> a = 0.1:0.1:0.5

9 ?4 O/ ]* a* x V2 z) Y1 @. Z’ C5 k% u( a+ p’ X” n/ z! f/ L

a =

6 |3 B0 F” x5 T3 j. y3 C3 e+ R& S, n) v& q

0.1000 0.2000 0.3000 0.4000 0.5000

5 O: S L0 t* P( X) x, J1 q

( y” i c+ z6 l: |7 k0 z>> find(a==0.3)

0 m$ C; M8 z/ X3 O

– ~3 k8 R. h( ~2 Q1 p/ }$ V8 Bans =

) A2 H4 I! X# S

/ B; g% Q# @; x b/ V5 c: C Empty matrix: 1-by-07 `; x u2 x% d6 K7 x

由于 a 向量中的 0.3 是由 0.1+0.1+0.1 计算得到,在计算过程中就产生了浮点数误差,这也导致在判断 a==0.3 时结果为false,所以 find(a==0.3) 返回一个空矩阵。 ” I9 H& ~3 @% I* H |( K

在进行数值计算判断两数相等时,最好不要直接判断,而是设立一个容差值,当两个浮点数的差的绝对值小于给定的容差值时,我们就认为这两个浮点数相等。 – \” Z2 Y. A4 M# {* f O; K9 j1 w+ d

比如对于上面的例子:8 B% D. b* t” a” Y1 m% q

>> a=0.1:0.1:0.5

7 I+ Q- o! R ~& T” j. E6 q5 _! p: g’ \: `$ x1 @

a =: z9 L1 y, ]: g1 W! J

6 I( L; R6 e0 T# n, O9 y 0.1000 0.2000 0.3000 0.4000 0.50001 C5 x. ~7 V4 a

$ J b8 x* ?; R9 r# {” R! ~0 E7 ?6 _* P

>> tol=eps(0.3)*10 %设立容差值,一般比这个点的浮点数误差高一到两个数量级即可。eps函数能够求得该点的浮点数误差值。6 B) q8 X, K, A$ ]

– H0 R9 b2 s! N* M( c3 D* Stol =

( a* N! N* u’ R# B. R* b- o A

7 O8 k) `! x+ f! `+ t 5.5511e-15

1 G! M; c& R+ K# ` ” L. p( G9 [% ~: K* F, z# a7 n

>> find(abs(a-0.3). ~0 E+ s* e% L) t9 Q

ans = ) m: [6 X9 G U$ l3 c/ g

( N/ S: ~. L+ m

3, A1 |# y# R6 k

2 V2 V4 K5 m8 F7 G

/ V6 l5 z8 Y( j/ Q T& p( N生成一系列有规律名变量

– O6 P: o: A+ p4 _: a当循环迭代需要把每次迭代结果进行保存时,如果每次迭代的结果是尺寸不同的矩阵,无法用矩阵进行存储,那么可以利用 eval 和 num2str 这两个函数可以生成一系列例如 a1、a2、a3… 变量对结果进行保存(不推荐这种方法,原因是 eval 这个函数有很多缺点)。 p- s6 X) }* e5 h Y+ E2 C- n. w

eval::将括号内的字符串视为语句并运行。

$ N( t& C, N, T4 {, Y- wnum2str: 将数值转换为字符串。

* z’ }% H. a1 f” G%例2 B0 G w, t4 D4 M

for ii=1:10. _8 l/ |4 q& w” O5 R1 D

str=[‘a’,num2str(ii),’=1:’,num2str(ii)];g. g1 o% H, A3 d8 q/ a4 D, Q

eval(str)

# I0 w( N8 n% |$ q( Uend- c: x) u8 ^% g’ t- r7 b

这样可以生成一系列变量 a1、a2…a10 对循环结果进行保存。 , Q p# F1 u” j Q% k

不推荐使用 eval 函数的原因,帮助文档有详细的解释。

0 o4 z9 q& L3 ^2 M# Q6 U$ lMATLAB® 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.’ Q: a& s* Z: V Q

Code within an eval statement can unexpectedly create or assign to a variable already in the current workspace, overwriting existing data.6 s1 E) w; {2 l8 ]- t

Concatenating strings within an eval statement is often difficult to read. Other language constructs can simplify the syntax in your code.

4 i& v W5 c, l2 h: fMATLAB 对于这类问题有更好的解决办法,利用元胞数组对结果进行存储。元胞数组是 MATLAB 中的特色数据类型,它的元素可以是任意类型的变量,包括不同尺寸或不同维度的矩阵。 对于上面的例子,利用元胞数组:

! ^” K& n: O$ W4 {% cfor ii=1:10

, l8 t& J2 Y8 s+ l) z. A a{ii}=1:ii;

” S: ~; S5 X& b# Send# h% U6 L! Y$ L% g/ t% `& Y3 Q6 W

即生成一系列元胞存储循环结果。这样无论是程序的可读性、运行效率还是后续程序对保存结果调用的方便程度,都远胜于 eval 函数。0 |/ _3 z) }/ }8 H, Y1 i

除此之外,在处理符号变量时如果需要生成一系列有规律名符号变量,例如生成一个多项式:+ q: Z6 [- Q* ~” G# M, U) d( \

y = x1+2*x2+3*x3+…+100*x100

Y’ v5 {! k2 Z6 @* heval+num2str 能够实现,但更简便的方法还是利用矩阵:

7 n” ~( G” w4 g, _’ r2 H& qx=sym(‘x’,[1,100]);F3 \4 Q: H3 x, o& W

w=(1:100).*x;% B, g& Z# N5 H* G% M; a. W

y=sum(w)

) L$ Q+ k- _2 i; A9 o- x’ IH0 w; h9 v+ a5 ]. u6 e7 q2 c

‘ Q3 ]/ e’ y& w% O$ }) W

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/230730.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月31日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档