0

好的,这段代码在另一个问题中,但我不知道如何添加我更新的代码。我让这段代码正常工作并给出了正确的答案,但它并没有根据我的 while 循环条件停止。我不确定我在那里做错了什么?答案显然收敛并且所有值都是正确的,只是忽略了 while 循环。

/* Newton Raphson Method*/

import java.util.Scanner; 
import static java.lang.Math.*; 

public class NewtRaphEx {

    // Creating Function f = x - cos(3.5x)

    double f = 0.0;
    double df = 0.0;

    public static double function(double x) {
        return (x - cos(3.5 * x)); 
    }

    public static double dfunction (double x) { 
        return (1 + 3.5*sin(3.5 * x));
    }

    public static void main (String[] args) {

       //Initialising all variables 
       double xn = 0.06;
       double xnew = 0.0;
       double e_allow = 0.001;
       double fn = 0.0;
       double eps = 0.0;
       double dfn = 0.0; 
       double dx = 0.0; 
       int n = 0;
       int nMax = 10000;

       do {
           for (n = 0; n <= nMax; n++) {
               fn = function(xn); 
               dfn = dfunction(xn);
               dx = -(fn / dfn); 
               xnew = xn + dx; 
               xn = xnew;
               eps = abs(dx / xn);
               n = n + 1;
           }
       } while (eps <= e_allow || n < nMax);

       System.out.print("N" + "\t" + "X" + "\t" + "F(x)" + "\t" + "dF(x)" + "\t");
       System.out.println("delX" + "\t" + "X_new" + "\t" + "Epsilon");
       System.out.format("%d\t" + "%.3f\t" + "%.3f\t" + "%.3f\t" + "%.3f\t" + "%.3f\t" + "%.3f", n, xn, fn, dfn, dx, xnew, eps);
    }
}
4

1 回答 1

2

表达方式

eps <= e_allow || n < nMax

当你到达它时评估为真,因此for循环将再次运行,设置n = 0无限循环。

具体来说,您将拥有:

eps = 0.0;
e_allow = 0.001;
n = 10002; // due to the increment inside the loop
nmax = 10000;

像这样:

eps <= e_allow || n < nMax
0.0 <= 0.001 (true) OR 10002 <= 10000 (false) -> true
于 2014-02-14T14:25:49.360 回答