我目前正在编写一个计算器应用程序。我正在尝试将导数估计器写入其中。下面的公式是一种简单的方法。通常在纸上,您会使用尽可能小的 h 来获得最准确的估计。问题是双打无法处理将非常小的数字添加到相对较大的数字。例如 4+1E-200 只会产生 4.0。即使 h 只是 1E-16,实际上 4+1E16 也会给你正确的值,但是做数学计算它是不准确的,因为第 16 位之后的任何东西都会丢失并且舍入不能正确发生。我听说双打的一般经验法则是 1E-8 或 1E-7。这个问题是大数字不起作用,因为 2E231+1E-8 将只是 2E23,1E-8 会因为尺寸问题而丢失。
f'(x)=(f(x+h)-f(x))/h as x approaches 0
当我在点 4 测试 f(x)=x^2 所以 f'(4) 时,它应该正好是 8 现在我知道我可能永远不会得到正好 8。但我最准确的似乎是 1E 左右7 或 1E8 有趣的是 1E-9 到 1E-11 都给出了相同的答案。这是 h 的列表和结果f(x)=x^2 at x=4
1E-7 8.000000129015916
1E-8 7.999999951380232
1E-9 8.000000661922968
1E-10 8.000000661922968
1E-11 8.000000661922968
1E-12 8.000711204658728
以下是我的问题:
- 选择 h 的最佳方法是什么,显然 1E-8 或 1E-7 是有意义的,但是我如何根据 x 选择 h,以便即使 x 是 3.14E203 或 2E-231,它也适用于任何大小的数字.
- 我应该考虑多少位小数。
- 你知道德州仪器是如何做到的吗,TI 83、84 和 Inspire 可以用数字计算出小数点后 12 位或精度的导数,而且几乎总是正确的,但是它们的数字的最大精度是 12 位,而那些计算器是非 CAS,所以他们实际上并没有派生任何东西
- 从逻辑上讲,有一个介于 1E-7 和 1E-8 之间的数字会给我一个更精确的结果,有没有办法找到这个数字,或者至少接近它。
已回答
非常感谢鲍勃。该应用程序目前计划为 2 种形式,一个命令行 PC 应用程序。还有一个安卓应用。在“关于”页面的部分内容中将特别感谢您。如果您愿意,它将是开源的,但在我解决一些非常非常大的错误之前,我不会发布项目站点的链接。目前我一直称它为 Mathulator,但名称可能会更改,因为它已经拥有版权,而且听起来很愚蠢。我不知道发布候选者何时会运行,目前我不知道它何时运行会稳定。但如果我也能实现我想要的一切,那将是非常强大的。再次感谢。快乐编程。