牛顿的解释';java上的s方法示例
:牛顿的解释';java上的s方法示例,java,newtons-method,Java,Newtons Method,: 问题是……我完全理解这个程序是如何工作的。我的问题是方程f(x)=x^2-c,以及它与上面代码的关系。为什么要把它除以x,这样x(x-c/x)?对于其中一些例子,似乎缺少数学上的解释。换句话说,我想从一个简单的数学角度来解释,而不是编写那么多代码。基于,Javadoc注释中已经解释了以下内容: * Computes the square root of a nonnegative number c using * Newton's method: * - initializ
问题是……我完全理解这个程序是如何工作的。我的问题是方程f(x)=x^2-c,以及它与上面代码的关系。为什么要把它除以x,这样x(x-c/x)?对于其中一些例子,似乎缺少数学上的解释。换句话说,我想从一个简单的数学角度来解释,而不是编写那么多代码。基于,Javadoc注释中已经解释了以下内容:
* Computes the square root of a nonnegative number c using
* Newton's method:
* - initialize t = c
* - replace t with the average of c/t and t
* - repeat until desired accuracy reached
基于此,Javadoc注释中已经解释了以下内容:
* Computes the square root of a nonnegative number c using
* Newton's method:
* - initialize t = c
* - replace t with the average of c/t and t
* - repeat until desired accuracy reached
好的,我将给它一个重击(参见内联注释):
好的,我将给它一个重击(参见内联注释):
你得到了
c
,你想解决这个问题
t = sqrt(c)
或同等地
c = t^2
或者再说一次
c - t^2 = 0.
我将调用上面的方程f(t)=0
(因为它是一个给定的常数,所以没有提到c
)。
牛顿方法迭代t
的试验值,我将其标记为t_I,t_{I+1},…
一阶泰勒展开式为:
f(t_i + dt_i) = f(t_i) + dt_i * f'(t_i) + ...
所以如果你没有足够的f(t_i)=0
,你可以添加一个dt_i
,这样
f(t_i + dt_i) nearly = 0 = f(t_i) + dt_i * f'(t_i) + ...
因此dt_i=-f(t_i)/f'(t_i)
,即f(t_i+-f(t_i)/f'(t_i))
比f(t_i)
更接近于零
如果你做f(t)=c-t^2
的导数,你会看到,codet{i+1}=(c/t{i+t{i)/2
中的方程就是上面估计的t{i+1}=t{i+dt{code>的迭代公式
这是一种迭代方法,所以不能给出精确解。您需要决定何时停止(足够精确),否则算法将永远继续。这就是为什么要检查f(ti)
,而不是真正的f(ti)=0
。在他们的案例中,他们选择了一个阈值=epsilon*t^2
;我认为使用t^2
的乘法是因为如果使用固定常数作为阈值,可能会遇到数值精度问题(即,如果使用万亿,由于浮点表示的精度有限,您永远无法获得10^{-10}
的固定精度。)你得到了c
,你想要解决
t = sqrt(c)
或同等地
c = t^2
或者再说一次
c - t^2 = 0.
我将调用上面的方程f(t)=0
(因为它是一个给定的常数,所以没有提到c
)。
牛顿方法迭代t
的试验值,我将其标记为t_I,t_{I+1},…
一阶泰勒展开式为:
f(t_i + dt_i) = f(t_i) + dt_i * f'(t_i) + ...
所以如果你没有足够的f(t_i)=0
,你可以添加一个dt_i
,这样
f(t_i + dt_i) nearly = 0 = f(t_i) + dt_i * f'(t_i) + ...
因此dt_i=-f(t_i)/f'(t_i)
,即f(t_i+-f(t_i)/f'(t_i))
比f(t_i)
更接近于零
如果你做f(t)=c-t^2
的导数,你会看到,codet{i+1}=(c/t{i+t{i)/2
中的方程就是上面估计的t{i+1}=t{i+dt{code>的迭代公式
这是一种迭代方法,所以不能给出精确解。您需要决定何时停止(足够精确),否则算法将永远继续。这就是为什么要检查f(ti)
,而不是真正的f(ti)=0
。在他们的案例中,他们选择了一个阈值=epsilon*t^2
;我认为使用t^2的乘法是因为如果使用固定常数作为阈值,可能会遇到数值精度问题(即,如果使用万亿,由于浮点表示的精度有限,您永远无法获得固定精度的10^{-10}
)
我相信上面提到的代码来自R.Sedgewick的书《Java编程入门》,第62页。他在书中试图说的是,你可以用f(x)=x^2-c
作为特例来求任何正数的平方根。那么它是如何工作的:
牛顿的方法说明X(n+1)=X(n)-(F(X(n))/F'(X(n)))
。假设在F(X)=X^2-C
,其中C=2
,因为我们正在寻找2的平方根(如果你想找到36的平方根,那么C=36
等等)。然后函数F(X)
的一阶导数是F'(X)=2X
。应用牛顿法,我们得到
X(n+1)=X(n)-(X^2-C)/(2X))
对于X(0)=2,我们得到
n=1,
X(1)=2-(2^2-2)/(2*2)
X(1)=1.5
;
n=2
X(2)=1.5-(1.5^2-2)/(2*1.5)
X(2)=1.41666667
等等…ejlab.net jelmar
我相信上面提到的代码来自R.Sedgewick的书《Java编程入门》,第62页。他在书中试图说的是,你可以用f(x)=x^2-c
作为特例来求任何正数的平方根。那么它是如何工作的:
牛顿的方法说明X(n+1)=X(n)-(F(X(n))/F'(X(n)))
。假设在F(X)=X^2-C
,其中C=2
,因为我们正在寻找2的平方根(如果你想找到36的平方根,那么C=36
等等)。然后函数F(X)
的一阶导数是F'(X)=2X
。应用牛顿法,我们得到
X(n+1)=X(n)-(X^2-C)/(2X))
对于X(0)=2,我们得到
n=1,
X(1)=2-(2^2-2)/(2*2)
X(1)=1.5
;
n=2
X(2)=1.5-(1.5^2-2)/(2*1.5)
X(2)=1.41666667
诸如此类……我觉得我应该回答这个问题。这可能不是最礼貌的说法,但我觉得您可以花20分钟与讲师或教授讨论此代码。如果上面代码中的注释不够帮助,您可能需要更多帮助