在我的大学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
答案 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替换为您之前的号码。