2014-05-23 1 views
0
public static double sqrt(double c) 
{ 
    if (c < 0) return Double.NaN; 
    double t = c;       // line 1 
    double err = 1e-15;     // line 2 
    while (Math.abs(t - c/t) > err * t) // line 3 
     t = (c/t + t)/2.0;   // line 4 
    return t; 
} 

Q1 : t = c, c/t = 1이기 때문에 라인 1과 라인 4의 변수 t가 혼동 스럽습니다. 라인 4는 무엇을 의미합니까?Java에서 제곱근에 대한 Newton의 방법을 이해하는 방법?

질문 2 : 3 행에서 확인해야 할 목적은 무엇입니까?

"뉴턴의 방법"을 검색하여 몇 가지 설명을했지만 여전히 이해할 수 없었습니다. 여기에 직접 설명을 요청해도 될까요?

+0

코드를 단계별로 디버그하고 변수 및/또는 해당 값을보아야합니다. – assylias

답변

3

Q1 : t은 루프 반복마다 변경되므로 처음에는 c/t == 1이지만 그 이후에는 그렇지 않습니다.

질문 2 : err에 정의 된대로 "충분히 근접한"대답을 얻을 때까지 루프를 계속 진행하십시오.

2

뉴턴의 방법은 실수 값 함수의 근사를 근사하는 데 사용됩니다. here을 참조하십시오.

루트를 double 값으로 계산할 때 실제로 F(x) = X^2 - C을 해결하려고 시도합니다. 여기서 C는 double이고 방정식을 0으로 만드는 x를 찾으려고합니다.

이제 Newton's Method은 일련의 추측으로이를 근사합니다. 각 추측에 의해 (이 함수는 적절한 특성을 가짐), 우리는 제곱근에 가깝게됩니다. 점증 적 근사는 실제로 각 추측 (t)에서 그래프의 접선을 계산 한 다음 그 점에서 추측으로 선택하고 단계 (c/t + t)/2에서 더 가까이 이동합니다. 어떤 점에서 우리는 매우 가깝고 함수가 영원히 계속되기를 원치 않으므로 다음 추정값이 현재 근사값과 일정한 거리를 가지고 있는지 확인하기 위해 3 행을 갖습니다. 다음 근사값이 err * t보다 가까울 경우 우리는 계속해서 귀찮게하지 않습니다. 우리는 충분히 가깝습니다.