下天 发表于 2003-8-4 21:38:09

[原创]MatLab中的数值陷阱

MatLab中,1:1.4/0.1与1:14不等价,你相信吗?

原因如下:
t1=1.5/0.1-15;         --> t1= 0
t2=1.4/0.1-14;         --> t2= -1.7764e-015
t3=(-21+22.4)/0.1-14; --> t3= -1.4211e-014

可见,1:1.5/0.1与1:15等价;1:1.4/0.1与1:14不等价,反而等价于1:13。

其更深层次的原因,在于数值除法带来的误差,所以不要轻信MatLab计算的结果。

也许很少有人应用“1:1.4/0.1”之类的语句,但当某些变量代替1.4、0.1们隐藏在程序某个角落时,数值计算的不精确性很可能会将程序引向错误。

所以,当你确信算法正确、变量无误却得不到理想的结果时,很可能程序已掉入了数值陷阱。

MatLab中的数值陷阱似乎还有很多,还望高手多多补充




xiaofenger 发表于 2003-8-5 23:16:23

以下是引用阿剑在2003-8-4 20:24:35的发言:
菜鸟

好好解释
没必要这么说吧
这两个字也解决不了问题吧

路过 发表于 2003-8-4 21:45:43

经典!

toby 发表于 2003-8-4 22:19:56

所以,当你确信算法正确、变量无误却得不到理想的结果时,很可能程序已掉入了数值陷阱。


还有可能出现了逻辑错误!
还有有时候确实会出现你说的数值陷阱情况,但是你说的例子中
1:1.4/0.1与1:14不等价,反而等价于1:13。
好象有点问题。
a=1/(1.4/0.1)   a =0.07142857142857;
b=1/14            b =0.07142857142857;
c=1/13            c =0.07692307692308;
a-c=-0.00549450549451;
a-b=1.387778780781446e-017;

下天 发表于 2003-8-5 03:48:40

请toby同志在MatLab工作区输入:
1:1.4/0.1

会得到结果:
ans =

   1   2   3   4   5   6   7   8   9    10    11    12    13

故而,1:1.4/0.1等价于1:13

阿剑 发表于 2003-8-5 04:24:35

菜鸟

下天 发表于 2003-8-5 17:42:25

强烈抗议阿剑同志的攻击性言论!这样会打击别人发言积极性的

也许是我没写清楚,造成了toby兄的误解:
“1:1.4/0.1”中的冒号表示MatLab中的等间隔向量生成符,不是数学意义上的比值符号,特此说明并致歉。

////////\\\\\\\\
学问是讨论出来的
\\\\\\\\////////










[此贴子已经被作者于2003-8-5 11:50:33编辑过]

panzervi 发表于 2003-8-5 23:00:22

嗯,果然是个黑暗 的陷阱啊~恐怖

toby 发表于 2003-8-6 03:33:05

恩!
现在我明白了!
请多指教!
还有就算我是菜鸟,
不也有笨鸟先飞吗!
我不会有事的!

Square 发表于 2003-8-6 09:34:54

强烈支持楼上。
页: [1] 2 3
查看完整版本: [原创]MatLab中的数值陷阱