罗兰在MATLAB的艺术

把想法变成MATLAB

算法结合性——不是那么快

算术是关联的,对吧?在纸和铅笔的世界,在那里你可以经常做计算准确,可以是真实的。然而,在计算机世界,实数总是不能代表完全是因为处理有限精度的数据类型,事实证明,你不能依赖于算法表现你在小学教的方式。

内容

让我们做一些数学

假设我要检查以下几点:

$ $ \ sqrt {2} = 2 / \√{2} $ $

我可以做这个分析使用符号数学工具箱

symsqrt2 =√符号(2));shouldBeZero = symsqrt2 - 2 / symsqrt2
shouldBeZero = 0

现在让我们来执行相同的计算数值。

mightBeZero = sqrt (2) - 2 /√(2)
mightBeZero = 2.2204 e-16

这里所发生的是我们看到的影响,浮点数和计算的准确性。我在一个讨论过这个之前的帖子

让我们试试另一个例子

现在让我们尝试不同的东西。首先,让我们找出的价值每股收益% sqrt {2} %。这应该是最小的(级)浮点数,当添加到% sqrt{2} %,产生许多不同于% sqrt {2} %。

sqrt2eps =每股收益(sqrt (2))
sqrt2eps = 2.2204 e-16

接下来,我们想要一个较小的数量大小比这玩。我将使用一半的价值。

halfsqrt2eps = sqrt2eps / 2
halfsqrt2eps = 1.1102 e-16

现在我们计算表达式后,象征性地和数值。

$ $ expr1 = \ sqrt {2} - \ sqrt {2} + halfsqrt2eps $ $

$ $ expr2 = \√{2} - \ sqrt {2}) + halfsqrt2eps $ $

$ $ expr3 = \ sqrt {2} + (- \ sqrt {2} + halfsqrt2eps) $ $

首先我们做他们象征性的。

expr1 = symsqrt2 - symsqrt2 +符号(sqrt2eps) / 2 expr2 = (symsqrt2 - symsqrt2) +符号(sqrt2eps) / 2 expr3 = symsqrt2 + (-symsqrt2 + sym (sqrt2eps) / 2)双(expr1)
expr2 expr1 = 1/9007199254740992 = 1/9007199254740992 e-16 ans expr3 = 1/9007199254740992 = 1.1102

象征性的结果都是一样的和返回值的一半每股收益

现在我们计算数值相同的表达式。

expr1 =√6 (2) - sqrt (2) + halfsqrt2eps expr2 = sqrt (2) -√(2)) + halfsqrt2eps expr3 = sqrt (2) + (-√(2) + halfsqrt2eps)
expr1 = 1.1102 e-16 expr2 = 1.1102 e-16 expr3 = 2.2204 e-16

这里发生了什么?如前所述,这个例子说明了浮点运算不是关联符号运算的方法。有理由不满。但值得理解。可能值得偶尔重写计算,特别是如果你想计算一个非常小的两个大数字的区别。

你重写表达式来获得更好的准确性吗?

你发现自己在一个情况下你需要重写如何计算一个数值结果(像在这里,由不同的分组),以确保你得到一个更准确的解决方案。让我知道在这里




发表与MATLAB®R2013b

|
  • 打印
  • 发送电子邮件

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。