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

matlab的trapz求定积分_matlab求离散点积分EDA365欢迎您登录!您需要登录才可以下载或查看,没有帐号?注册x(T(B3I-e%Q&H3mtrapz是基于梯形法则的离散点积分函数。调用形式:6H*C!TA0dI=trapz(x,y)g3];x1g(x!w(Kh+R%R3G6`其中x和y分别是自变量和对应函数值,以sin(x)在[0,pi]积分为例:/p…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

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$ U

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号