Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
牛顿的解释';java上的s方法示例_Java_Newtons Method - Fatal编程技术网

牛顿的解释';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
的导数,你会看到,code
t{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
的导数,你会看到,code
t{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分钟与讲师或教授讨论此代码。如果上面代码中的注释不够帮助,您可能需要更多帮助