Java估计某个点的导数
我目前正在写一个计算器应用程序。我正试图在其中编写衍生估算器。下面的公式是一种简单的方法。通常在纸上你会使用最小的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给出了相同的答案。
以下是f(x)=x^2 at x=4
的h和结果列表
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之间的数字会给我一个更精确的结果,有没有办法找到这个数字,或者至少接近它。
ANSWERED
非常感谢BobG。该应用程序目前计划为2种形式,即命令行PC应用程序。还有一个Android应用程序。特别要感谢About页面的部分内容。如果你想它将是开源的,但我没有发布到项目网站的链接,直到我找出一些非常大的错误。目前我一直称它为Mathulator,但名称可能会改变,因为它已经有版权并且听起来很愚蠢。我不知道发布候选版本何时会运行,目前我还没有任何线索会稳定的。但如果我能实现我想要的一切,它将会非常强大。再次感谢。快乐的编程。
没有找到相关结果
已邀请:
6 个回复
壤欠攻混
蕉衫
时会发生的事情。在这些情况下建议的是替代减法与其他一些操作。例如,您可以切换到`f(x)展开的某种系列。 我不太明白你的第二个问题,因为答案取决于你的要求 - “你想要多少”。 顺便说一下,您可以在math.stackexchange.com上找到问题的答案。 另外,访问
提供的链接:数字微分
襄挟款籍
,但
可能会再次10,所以你必须做
。为了获得有意义的结果,我建议你将1e-8乘以原始数字的绝对值,这将在导数中给出大约7个正确的数字。就像是:
无论如何,这是一个近似值,比方说,如果你试图计算x = 1e9处的sin(x)的导数,你将得到h = 10,结果将全部错误。但对于“有趣”部分接近于零的“常规”功能,这将很有效。 2.“h”越少,您对衍生物进行采样的点就越精确,但得到的导数的正确数字越少。我无法证明这一点,但我的直觉是用
得到
正确的数字,其中15是
的精度。 此外,使用“更对称”公式是一个好主意,它给出了二阶多项式的绝对正确答案:
锑寝粒
悲帽慑彤电
扭湘阀柿蹄