初学者的Java代码帮助:Newton Raphson Square Root Loop

时间:2014-07-16 19:33:22

标签: java

在我的大学Java课程中,我们正在学习循环控制结构,我们得到了一个编写一个小程序的编码,我猜测它应该给出一个数字的平方根,并继续取平方根直到满足差异或准确性。以下是说明:

“编写一个名为NewtonRaphson的类,可用于使用牛顿方法找到sqrt(a)的近似解,对于任何正实数。

注意:sqrt(a)可以用函数表示法表示如下:f(x)= x2 - a, 从f'(x)= 2 * x,

打印迭代序列和每次迭代的近似值。 (即,以表格形式)。

编写一个名为TestNewton的驱动程序类。使用以下数据测试NewtonRaphson类。

•初始猜测为5.0 •在本练习中,当两个连续近似值之间的差值小于0.00005“

时,该过程终止

我的代码链接在底部,主类和测试类,但我没有得到循环结果我只是在运行程序后输入5时得到相同的5的平方根。有人可以告诉我我搞砸了哪里?

谢谢,我真的很喜欢编码,这需要永远制作,我不得不请求一些朋友的帮助。

主要班级:http://pastebin.com/eiUJFJjQ 测试类:http://pastebin.com/sJ4dB5uZ

或者,如果你更喜欢这里的代码,那就是:

import java.text.NumberFormat; 
import java.text.DecimalFormat; 

public class NewtonRaphson { 

static final double DIFFERENCE = 0.00005; 
double n; 
double x; 
double derivative; 
double function; 
double xold; 
double xnew; 
int i; 

public NewtonRaphson(double n2, int x2) 

{ 
    n=n2; 
    x=x2; 
    function = Math.pow(n, 2)-x; 
    derivative = 2*n; 
    xnew=n-function/derivative; 
    xold=0; 
} 

boolean positive() 

{ 
    return (n >= 0); 
} 

public double findXNew(double xold2) 

{ 
    function = Math.pow(xold2, 2)-x; 
    derivative = 2*xold2; 
    return xold2-function/derivative; 
} 

public void findSqRtA() 

{ 

    i=0; 
    while(Math.abs(xnew-xold)> DIFFERENCE)

{ 

    xold=xnew; 
    xnew=findXNew(xold); 
    i++; 
    System.out.println(this); 

} 

    System.out.println("\nIteration completed, difference is less than 0.00005"); 

} 

public String toString() 

{ 
    NumberFormat nf = NumberFormat.getInstance(); DecimalFormat df = (DecimalFormat)nf; 
    df.applyPattern("0.00000000"); 

    return "The approximate value of the square root of "+x+" is " + xnew + "\n" + 

    "The number of iterations is " + i; 
} 
}

import java.io.Console; 
import java.util.Scanner; 

public class TestNewton { 

public static void main(String[] args) { 

Scanner reader = new Scanner(System.in); 
System.out.println("Enter a number you would like to find the square root of"); 

int a = reader.nextInt(); 

NewtonRaphson nr = new NewtonRaphson(5.0, a); 

nr.findSqRtA(); 

} 
} 

我的输出是这样的,但我希望它在每次迭代结果后取平方根。

Enter a number you would like to find the square root of
5
The approximate value of the square root of 5.0 is 2.3333333333333335
The number of iterations is 1
The approximate value of the square root of 5.0 is 2.238095238095238
The number of iterations is 2
The approximate value of the square root of 5.0 is 2.2360688956433634
The number of iterations is 3
The approximate value of the square root of 5.0 is 2.236067977499978
The number of iterations is 4

Iteration completed, difference is less than 0.00005

2 个答案:

答案 0 :(得分:1)

Newton-Raphson 方法非常有趣。您可以使用它来逼近实值函数根。 x 2 只是其中之一。检查使用Newton-Raphson方法生成的fractals。所以,不要低估Newton-Raphson。

您的代码有效。但是你的期望是错误的,你认为在每次迭代时你都会更新猜测。代码实际上是在while循环中完成的。

你可能会这样做,epsilon也可能是一个参数。 首先,你给一个大的epsilon找到一个平方根估计。 然后用略小的epsilon输入最后一个近似值,直到您对结果满意为止。 我想这就是你的期望。

您可以简化代码。请查看此code

答案 1 :(得分:0)

您的代码实际上为我生成了正确的结果。因此,我不确定问题是什么。 有关牛顿方法的帮助,请参阅本文:

http://en.wikipedia.org/wiki/Newton's_method

你能告诉我们你的输出吗?

“我认为该程序应该从前一个平方根取每个新答案的平方根,它不断取5的平方根。但我希望它取每个迭代结果的平方根”

哦,我明白了,那是因为你有这个:

NewtonRaphson nr = new NewtonRaphson(5.0, a);

只需将上面的5.0替换为您之前的号码。