2014-02-14 2 views
0

이 코드는 다른 질문 이었지만 업데이트 된 코드를 추가하는 방법을 찾지 못했습니다. 이 코드가 작동하고 올바른 대답을 내놓았지만 while 루프 조건에 따라 멈추지 않습니다. 내가 뭘 잘못했는지 모르겠다. 대답은 명확하게 수렴하고 모든 값은 옳다. 다만 루프는 무시된다.Java의 무한 루프 while - Newton-Raphson 메서드

/* 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); 
    } 
} 
+0

을 두 번'n' 증가하고있는'for' 루프에서. 그게 맞습니까? –

+0

ahm, 왜 잠시 동안해야합니까? 루프를 깨기 전에 적어도 5000 개의 결과가 필요합니까? – diazazar

+0

할 일을 할 때 OR을 AND로 변경해보십시오. for 루프 내에서 eps 비교를 수행하고 충분히 근접한 경우 eps 비교를 수행하는 것이 좋습니다. 즉 바깥 쪽 루프를 놓습니다. –

답변

2

당신이 그것을 도달 그러므로 for 루프가 n = 0 따라서 무한 루프를 설정, 다시 실행할 때

eps <= e_allow || n < nMax 

이 true로 평가 표현.

특히, 당신은 할 것 같은 : 같은

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