0

このコードは別の質問にありましたが、更新されたコードを追加する方法がわかりませんでした。私はこのコードを動作させ、正しい答えを出しましたが、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

に到達すると true と評価されるため、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 に答える