솔버 선택 : NonlinearBlockGS 대 NewtonSolver

Aug 22 2020

그룹간에 순환 종속성이있는 두 개의 openmdao 그룹이 있습니다. 복잡한 단계를 사용하여 미분을 계산합니다. 종속성에 대한 비선형 솔버가 있으며 SLSQP를 사용하여 목적 함수를 최적화합니다. 문제는 비선형 솔버의 선택에 있습니다. 내가 사용할 NonlinearBlockGS때 최적화는 12 회 반복에서 성공합니다. 그러나 NewtonSolverwith를 사용 Directsolver하거나 ScipyKrylov최적화가 실패하면 (반복 제한 초과) maxiter=2000. 순환 연결은 수렴하지만 설계 변수가 최적 값에 도달하지 못하는 것입니다. 연속 반복에서 설계 변수 간의 차이는 순서 1e-5입니다. 그리고 이것은 필요한 반복을 증가시킵니다. 또한 초기 추측을 최적 값에 더 가까운 값으로 변경하면 작동합니다.

추가로 확인하기 위해 모델을 IDF로 변환하여 (결합 변수 및 일관성 제약 조건의 복사본을 생성하여) 솔버가 필요하지 않습니다. 이제 최적화는 5 번의 반복에서 성공적으로 수행되었으며 결과 NonlinearBlockGS는 사용시 결과와 유사합니다 .

왜 이런 일이 발생합니까? 내가 뭔가를 놓치고 있습니까? NewtonSolver다른 사람보다 언제 사용해야 합니까? 코드를 보지 않고 답하기 어렵다는 것을 알고 있습니다. 그러나 내 코드가 여러 구성 요소로 길고 장난감 모델로 문제를 재현 할 수 없다는 것입니다. 따라서 일반적인 통찰력을 높이 평가합니다.

답변

2 JustinGray Aug 22 2020 at 08:57

코드를 보지 않고는 세부 사항을 제공하기가 어렵습니다.

매우 광범위하게 말하면 Newton은 때때로 NLBGS보다 수렴하는 데 더 많은 문제가있을 수 있습니다 (참고 : 이것은 절대적으로 사실은 아니지만 좋은 경험 규칙입니다). 그래서 제가 추측하는 것은 첫 번째 또는 두 번째 반복에서 뉴턴 솔버가 실제로 수렴하지 않는다는 것입니다. newton.options['iprint']=2옵티마이 저가 반복 할 때 반복 기록을 설정 하고 살펴보면 이를 확인할 수 있습니다 .

최적화에 솔버가 있는 경우 비 수렴에 오류가 발생하도록 설정하는 것도 중요합니다 . 일부 옵티마이 저는이 오류를 처리 할 수 ​​있으며 라인 검색에서 역 추적합니다. 다른 사람들은 그냥 죽을 것입니다. 어느 쪽이든 중요합니다. 그렇지 않으면 옵티마이 저가 수렴되지 않았 음을 알 수없는 수렴되지 않은 경우를 제공하게됩니다.

이것은 두 가지 이유로 나쁘다. 첫째, 목표 및 제약 조건 값이 잘못 될 것입니다! 둘째, 그리고 아마도 더 중요한 것은 그것이 계산하는 파생물이 잘못 될 것입니다! 자세한 내용은 [이론 설명서에서] 읽을 수 있지만 요약하면 OpenMDAO가 사용하는 분석적 미분 방법은 잔차가 0이된다고 가정합니다. 그렇지 않은 경우 수학은 분해됩니다. 완전 모델 유한 차분을 수행하더라도 비 수렴 모델이 문제입니다. FD를 시도하면 시끄러운 쓰레기가 발생합니다. 2

따라서 모델을 올바르게 설정했고 선형 솔버가 문제를 설정했다고 가정하면 (NLBGS와 함께 작동하기 때문에 그렇게 들리는 것처럼 들림) 뉴턴 솔버가 수렴하지 않을 가능성이 큽니다. 드라이버 디버그 인쇄 와 결합 된 iprint를 사용 하여 직접 확인하십시오. 이 경우 뉴턴이 더 잘 작동하도록하는 방법을 알아 내야합니다.

여기 에 꽤 일반적인 몇 가지 팁이 있습니다 . armijo line search를 사용해 볼 수도 있는데, 이는 종종 약간의 속도를 희생하면서 뉴턴 해결을 안정화 할 수 있습니다.

마지막으로 ... 뉴턴이 모든 상황에서 최선의 답은 아닙니다. NLBGS가 더 안정적이고 계산 비용이 더 저렴하다면이를 사용해야합니다. 나는 그것이 뉴턴과 함께 작동하도록하려는 당신의 열망에 박수를 보냅니다. 왜 그렇지 않은지 확실히 추적해야하지만 Newton이 결합 된 문제를 안정적으로 해결할 수 없다는 것이 밝혀지면 그것도 괜찮습니다!