如何避免python函数中的灾难性取消?


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))

Answers:


31

这确实称为灾难性取消。实际上,这种情况非常简单:使用等效的数值稳定表达式重写函数

t1+1t2.
11t21+1t2

在此处输入图片说明


太棒了!您能推荐一本概述了这些技术的书吗?
Dipole

2
@Jack“数值算法的准确性和稳定性”是一本不错的高级书籍。任何入门教材也将对此进行讨论。
Kirill 2014年

我想知道您是否使用Wolfram Mathematica绘制了这张图表。THX:)
xyz

您是否知道有任何参考文献收集和/或讨论了类似的技巧,以便以数学上等效的方式重写数学表达式,从而减少重要性损失?我读了Higham的书,但是讨论是笼统的,以后的所有章节都是关于线性代数的(目前不是我的主题)。
becko

@becko根据我的经验,这是非常特别的。如果您有一种方法可以用正确的答案来测试公式(即使您只是使用超高精度算术生成它们),则操作起来就容易得多,这样一来,您就不会在没有先失败测试用例的情况下就寻找数值不稳定性。而且,如果它适用于所有已知输入,那么在任何地方是否存在数值不稳定性都没有实际问题。
Kirill
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.