FindRoot
의 도움말 페이지에 숨겨진 사양은 무엇입니까?
“기본적으로 FindRoot는 Newton의 방법 (Newton-Raphson)을 사용하여 비선형 시스템을 해결합니다.”
(또는 내가 생각하는 비선형 방정식) 그럼에도 불구하고 FindRoot
명령에 숨겨진 것이 있습니다. 함수를 고려하십시오.
f[x]:=Exp[1 - x] - 1,
뉴턴 반복 함수는
Nf[x_]:=E^(-1 + x) (-1 + E^(1 - x)) + x
NestList
를 사용하여이 함수로 반복 뉴턴의 방법에 의해 생성 된 일련의 값. 초기 추측 값의 큰 값에 대한 Newton 방법은이 문제에 대해 느린 수렴을 나타냅니다. $ x_0 = 10 $를 사용하면 다음과 같은 결과를 얻을 수 있습니다.
NestList[Nf, 10., 8] (* {10., -8092.08, -8091.08, -8090.08, -8089.08, -8088.08, -8087.08, -8086.08, -8085.08} *)
여기서 우리는 느린 수렴. 함수 Nf[x]
플롯은 메서드의 동작을 이해하는 데 도움이됩니다. 하지만
Module[{s = 0, e = 0}, {FindRoot[f[x], {x, 10.}, StepMonitor :> s++, EvaluationMonitor :> e++], "Steps" -> s, "Evaluations" -> e}]
생성
{{x -> 1.}, "Steps" -> 7, "Evaluations" -> 11}
해결 방법을 얻기 위해 7 단계 만 필요합니다. x = 1 $. FindRoot
가이 결과를 생성하는 이유는 무엇입니까? 분명히 FindRoot
는 표준 Newton의 방법을 사용하지 않습니다. 그렇지 않습니까? 누구든지 나를 도울 수 있습니까? 감사합니다.
댓글
- 여기 및 여기
답변
기본적으로 FindRoot
는 가이드 tutorial/UnconstrainedOptimizationLineSearchMethods
<에 설명 된대로 단계 제어의 “LineSearch”
방법을 사용합니다. / div> . 기본 설정은
FindRoot[Exp[1 - x] - 1, {x, 10.}, Method -> {"Newton", "StepControl" -> {"LineSearch", "CurvatureFactor" -> Automatic, "DecreaseFactor" -> 1/10000, "MaxRelativeStepSize" -> 10, Method -> Automatic}}]
뉴턴의 방법을 다소 정확하게 얻으려면 단계 제어를 사용하지 마십시오. 그러나 FindRoot
는 여전히 최대 단계 크기를 제한합니다 (아래의 경우 첫 번째 단계는 x == -100.
로 잘림).
Module[{s = 0, e = 0}, {FindRoot[Exp[1 - x] - 1, {x, 10.}, Method -> {"Newton", "StepControl" -> None}, StepMonitor :> s++, EvaluationMonitor :> e++], "Steps" -> s, "Evaluations" -> e}]
FindRoot :: cvmit : 100 회 반복 내에서 요청 된 정확도 또는 정밀도로 수렴하지 못했습니다. >>
(* {{x -> -1.07713}, "Steps" -> 100, "Evaluations" -> 101} *)
옵션을 사용하여
StepMonitor :> Print[{x}], EvaluationMonitor :> Print[x]
단계 및 평가를 모니터링 할 수 있습니다. 또는 "Optimization`UnconstrainedProblems`"
패키지의 FindRootPlot
를 사용합니다. (단계가 아닌 평가를 나타내는 노란색 점을주의 깊게 살펴보십시오.)
Needs["Optimization`UnconstrainedProblems`"] FindRootPlot[Exp[1 - x] - 1, {x, 10.}, PlotRange -> All]
FindRootPlot[Exp[1 - x] - 1, {x, 10.}, Method -> {"Newton", "StepControl" -> None}, PlotRange -> All]
댓글
- 다른 방법으로 설명 :
FindRoot[]
는 댐핑 된 버전의 Newton-Raphson을 사용합니다. 댐핑이 없으면 시작 값을 잘못 선택하면 더 자주 차이가 발생합니다. 댐핑은 반복이 거칠어 질 가능성을 줄입니다.