认识并避免舍入错误

当用数字逼近一个值时,请记住浮点结果对所使用的精度是敏感的。此外,浮点结果容易产生舍入错误。以下方法可以帮助您识别和避免不正确的结果。

尽可能使用符号计算

表演象征性的计算推荐使用,因为精确的符号计算不容易产生舍入错误。例如,标准的数学常量在symbol Math Toolbox™中有它们自己的符号表示:

pi sym(pi)
ans = 3.1416 ans = pi

避免不必要使用数字近似值。浮点数近似于常数;这不是恒定的本身。使用此近似值,您可以获得不正确的结果。例如,沉重的特殊功能对正弦返回不同的结果sym(pi)和数字近似的正弦π

沉重的(SiN(Sym(Sym)))沉重的(SIN(PI))
ans = 1/2 ans = 1

按提高精度执行计算

riemann假设指出,riemann zeta函数的所有非血频零ζ(Z.有相同的实部吗ℜ(Z.)= 1/2。要找到zeta函数的可能零,请绘制其绝对值|ζ(1/2 +IY.)|。以下绘图显示了Zeta函数的前三个非竞争根|ζ(1/2 +IY.)|

Syms.yFplot(ABS(Zeta(1/2 + I * Y)),[0 30])

使用数值解算器vpasolve.要近似Zeta功能的前三个零:

VPASOLVE(Zeta(1/2 + i * y),y,15)vpasolve(zeta(1/2 + i * y),y,20)vpasolve(zeta(1/2 + i * y),y,25)
ans = 14.134720457251983562 ANS = 21.022039628479593897 ANS = 25.0108575801456887658014568876321456887658014568863214790992563

现在,考虑同样的函数,只是稍微增加实部, ζ 1000000001 2000000000 + 一世 y 。根据黎曼假设,这个函数对于任何实值都不为零y。如果你使用vpasolve.使用10个重要的十进制数字,求解器查找以下(不存在的)Zeta函数的零:

旧=数字;数字(10)VPASOLVE(Zeta(1000000001/200000000000 + i * y),y,15)
ans = 14.13472514

增加数字的数量表明结果不正确。Zeta功能 ζ 1000000001 2000000000 + 一世 y 任何实际值都没有零14 <y<15

数字(15)VPASOLVE(Zeta(1000000001/200000000000 + i * y),y,15)数字(旧)
ANS = 14.1347251417347 + 0.00000000000499989207306345i

有关其他计算,请恢复默认数字:

数字(旧)

比较符号和数字结果

Bessel函数具有半整数索引返回确切的符号表达式。通过浮点数近似这些表达式可以产生非常不稳定的结果。例如,以下贝塞尔函数的确切符号表达式是:

B =贝塞尔j(53/2,sym(pi))
B =(351 * 2 ^(1/2) *(119409675 /π^ 4 - 20300 /π^ 2 - 315241542000 /π^ 6……+ 445475704038750/pi^8 - 366812794263762000/pi^10 +…182947881139051297500 /π^ 12 - 182947881139051297500 /π^ 14…+ 10174148683695239020903125/pi^16 - 1060253389142977540073062500/pi^18…+ 57306695683177936040949028125/pi^20 - 1331871030107060331702688875000/pi^22…+ 1))/ ^2

利用VPA.以10位数的精度近似此表达式:

VPA(B,10)
ANS = -2854.225191

现在,使用浮点参数调用Bessel函数。这两个近似值之间的显着差异表示一个或两个结果不正确:

Besselj(53/2,pi)
ans = 6.9001e-23

增加数字工作精度以获得更准确的近似B.

VPA(B,50)
ans = 0.000000000000000000000069001456069172842068862232841396473796597233761161

绘制函数或表达

绘制结果可以帮助您识别不正确的近似值。例如,以下Bessel函数的数字近似返回:

b =贝塞尔河(53/2,sym(pi));VPA(B,10)
ANS = -2854.225191

绘制这个贝塞尔函数的值X周围53/2。函数图表明,这种近似是不正确的:

Syms.XFplot(贝塞尔·X,SYM(PI)),[26 27])