大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新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账号...