13 我无法在数字上实现函数。它受到以下事实的困扰:在较大的输入值下,结果是很大的数乘以很小的数。我不确定灾难性取消是否是正确的术语,因此请纠正我。出现问题的证据: 对于6的较大输入,如何避免振荡和0.0的赋值? 这是我的功能: import numpy as np def func(x): t = np.exp(-np.pi*x) return 1/t*(1-np.sqrt(1-t**2)) python numerical-analysis floating-point — 偶极子 source
31 这确实称为灾难性取消。实际上,这种情况非常简单:使用等效的数值稳定表达式重写函数t1+1−t2−−−−−√.t1+1−t2.1−1−t2−−−−−√1−1−t21+1−t2−−−−−√1+1−t2 — 基里尔 source 太棒了!您能推荐一本概述了这些技术的书吗? — Dipole 2 @Jack“数值算法的准确性和稳定性”是一本不错的高级书籍。任何入门教材也将对此进行讨论。 — Kirill 2014年 我想知道您是否使用Wolfram Mathematica绘制了这张图表。THX:) — xyz 您是否知道有任何参考文献收集和/或讨论了类似的技巧,以便以数学上等效的方式重写数学表达式,从而减少重要性损失?我读了Higham的书,但是讨论是笼统的,以后的所有章节都是关于线性代数的(目前不是我的主题)。 — becko @becko根据我的经验,这是非常特别的。如果您有一种方法可以用正确的答案来测试公式(即使您只是使用超高精度算术生成它们),则操作起来就容易得多,这样一来,您就不会在没有先失败测试用例的情况下就寻找数值不稳定性。而且,如果它适用于所有已知输入,那么在任何地方是否存在数值不稳定性都没有实际问题。 — Kirill