Matlab에서 루트 찾기 문제를 해결하는 데 충분한 정확성을 얻지 못했습니다. 함수가 Lik(k)
이고 k
의 값을 찾으려면 Lik(k)=L0
이 필요합니다. 근본적으로 문제는 Matlab의 다양한 내장 솔버 (fzero
, fminbnd
, fmincon
)가 내가 원하는 것처럼 솔루션에 가까워지고 있지 않다는 것입니다.Matlab : 옵티 마이저/솔버의 정확도가 낮습니다
Lik()
은 역수 라플라스 변환 등을 계산하기 위해 광범위한 코딩이 필요한 사용자 정의 함수이므로 전체 코드는 포함하지 않습니다. 그러나이 함수를 광범위하게 사용하여 제대로 작동하는 것으로 보입니다. Lik()
은 실제로 여러 입력 매개 변수를 사용하지만, 현재 단계의 경우 모두 k
을 제외하고 고정되어 있습니다. 그래서 이것은 실제로 1 차원 루트 발견 문제입니다.
에 대한 k >= 165.95
의 값을 찾고 싶습니다. Lik(165.95)
은 L0
보다 작으며 여기서 Lik(k)
은 단조롭게 증가 할 것으로 예상합니다. 사실 관심 분야에서 Lik(k)-L0
을 평가할 수 있으며 원활하게 0을 교차하는 것처럼 보입니다. Lik(165.95)-L0 = -0.7465, ..., Lik(170.5)-L0 = -0.1594, Lik(171)-L0 = -0.0344, Lik(171.5)-L0 = 0.1015, ... Lik(173)-L0 = 0.5730, ..., Lik(200)-L0 = 19.80
. 따라서 함수가 제대로 작동하는 것처럼 보입니다. 간격으로 제한하는 경우 (165.95,173)
, fzero
반환 :
는 그러나, 나는
이fzero(@(k) Lik(k)-L0)
를 사용하여 ... "자동으로"여러 가지 방법과 루트를 찾아 정확성은 내가 기대만큼 좋지 않아으로 시도
k=170.96
은
Lik(k)-L0=-0.045
입니다. 좋습니다. 그리고 실제적인 목적을 위해, 나는 많은 정확한 시행 착오없이 그러한 정확한 상한선을 알지 못할 것이다.
(165.95,200)
간격을 사용하는 경우
fzero
은 을 반환합니다. 여기에
Lik(k)-L0 = -0.65
이 다소 있습니다. 그래서 내가 무슨 일이 일어나고 있는지 볼 수 있습니다
표시 세트 ITER
에 이러한 테스트를 실행되었고, fzero
안타 후 4 반복에 167.19
하고 k
의 변화의 의미, 제 5 회 반복에이 유지 나타납니다 다음 반복은 TolX
(0.001로 설정)보다 작으므로 프로 시저가 종료됩니다. 이탈 플래그는 솔루션에 성공적으로 수렴되었음을 나타냅니다. 는 또한 fminbnd
(제공 상하 경계 k
에) 및 fmincon
(k
위한 시작점을 제공)을 사용하여 abs(Lik(k)-L0)
를 최소화 노력 및 이와 유사한 정확도 문제로 달렸다. 특히, fmincon
을 사용하면 TolX
과 TolFun
을 모두 설정할 수 있지만,이 정도 (10^-6 이하로, 내가 필요로하는 것보다 훨씬 더 높은 정밀도)로 차이를 만들지는 않았습니다. 혼동스럽게도 때로는 옵티마이 저가 이전 반복에서 k- 값을 찾는다. 심지어 목표 함수가 반환하는 최종 k- 값보다 0에 가깝다. 따라서 알고리즘은 특정 시점까지 반복되고 더 나은 솔루션을 찾기에 충분한 크기의 추가 단계를 수행하지 못하는 것처럼 보입니다. 알고리즘이 다른 큰 단계를 거치지 않는 이유를 아는 사람이 있습니까? 이것을 바꿀 수있는 것이 있습니까? (optimset 아래 목록을 살펴 보았지만 유용한 것은 없었습니다.)
고마워요!
해법이 트릭을하지 않으면, 그것은 당신의 기능은 평가하려고 지점 주위에 잘 작동하지 않는 표시 될 수 있습니다. –