我正在尝试实现数字receipes函数样条和夹板,如下所述:
http://www.arcetri.astro.it/irlab/library/recipes/bookcpdf/c3-3.pdf - 第3.3节
代码对我来说仍然很混乱。有人可以解释这个数字的含义吗?
if(yp1> 0.99e30 ) - 这是多少?
或者,如果有人可以提供一些链接来解释这一点,我将不胜感激。
感谢。
答案 0 :(得分:1)
Yp1和Ypn分别是1和n处插值函数的第一个推导。 所以在1 = Yp1
处推导出插值函数再次查看链接,这是我对他们使用原因的看法(yp> 0.99e30) u []的值存储为浮点数。可以存储在float中的最小值是1.2e-38(根据此链接http://floating-point-gui.de/formats/fp/)。现在计算u [1]的函数是
u[1]=(3.0/(x[2]-x[1]))*((y[2]-y[1])/(x[2]-x[1])-yp1);
Let (3.0/(x[2]-x[1]) = A, (y[2]-y[1]) = B, (x[2]-x[1])-yp1) = C.
u[1]= A * (B/C);
现在,如果yp是一个非常大的数字(例如yp> 1e30),这意味着C是一个非常大的数字。这意味着B / C是一个非常小的数字,这意味着A *(B / C)〜= 0(小到准确存储);所以基本上说如果一阶导数太大(或太小)不能用于不使用它(它被称为自然样条并且具有O(h ^ 4)的误差)并且如果他们可以使用它们将使用夹紧样条(误差为O(h ^ 2),这意味着它比自然样条方法更准确)
Ypn也一样。
请注意,您应该添加另一项检查if(Yp> 10e30)以检查负值。 比如。
if((Yp > 10e30 || Yp < -10e30))
Ypn
相同