0

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.96Lik(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을 사용하면 TolXTolFun을 모두 설정할 수 있지만,이 정도 (10^-6 이하로, 내가 필요로하는 것보다 훨씬 더 높은 정밀도)로 차이를 만들지는 않았습니다. 혼동스럽게도 때로는 옵티마이 저가 이전 반복에서 k- 값을 찾는다. 심지어 목표 함수가 반환하는 최종 k- 값보다 0에 가깝다.

따라서 알고리즘은 특정 시점까지 반복되고 더 나은 솔루션을 찾기에 충분한 크기의 추가 단계를 수행하지 못하는 것처럼 보입니다. 알고리즘이 다른 큰 단계를 거치지 않는 이유를 아는 사람이 있습니까? 이것을 바꿀 수있는 것이 있습니까? (optimset 아래 목록을 살펴 보았지만 유용한 것은 없었습니다.)

고마워요!

+1

해법이 트릭을하지 않으면, 그것은 당신의 기능은 평가하려고 지점 주위에 잘 작동하지 않는 표시 될 수 있습니다. –

답변

1

지역에서 단조로운 것처럼 보이는 '야생'기능을 가지고있는 것처럼 보이고, 매우 작은 범위의 정밀도로 정밀도가 매우 높지는 않지만, 모든 기준이 야만족 인 강제로 접근. 바람직한 stepsize을 선택

는 어느 상한선 xmaxxmin 하한을 찾아

에서 함수를 평가 :

는 점에서 기능을 평가하기 위해 너무 많은 시간을 고려하지 않는 가정이 시도하십시오

xmin:stepsize:xmax 

필요한 경우 (단조 로움이 실제로 적용됨)이 작업을 수행하여 다른 상한 및 하한을 얻을 수 있으며 정확도를 높이기 위해 프로세스를 반복 할 수 있습니다.

+0

안녕하세요. Dennis, 답장을 보내 주셔서 감사합니다. 이 기능은 평가하기가 다소 느리지 만,이 특정 평가에는 무차별 대입 방식이 적합 할 것이라고 나는 생각한다. 일반적으로 나는 여러 번 비슷한 평가를 할 수 있기를 바란다. (이 줄은 실제로 루프 안에있다.) 그리고 자동화 된 방법으로 사용자가 많은 시행 착오없이 일반화 할 수 있기를 바란다. 그래서 나는 이것을하기위한 더 "자동적 인"방법에 대해 다른 사람들로부터 더 많은 제안을 듣게되어 기쁠 것입니다! – HelenAlex

+0

@HelenAlex 단조 로움을 가정하면 범위를 n 부분 (예 : 5 또는 10)으로자를 수 있습니다. 그런 다음 가장 낮은 값을 찾아서 새 범위를 lowestValue + -oldrange/n으로 설정하십시오. 이것은 루프에서 쉽게 수행 할 수 있으며 몇 단계 만 거치면 꽤 좋은 근사값을 제공해야합니다. –

0

간단한 이분법을 사용하지 않는 이유는 무엇입니까? 항상 특정 구간의 중간을 평가 한 다음이를 오른쪽 또는 왼쪽 부분으로 축소하여 항상 하나의 바운드가 음수이고 다른 바운드가 양수 값을 갖도록합니다. 매우 신속하게 임의의 정밀도로 줄일 수 있습니다. 매번 반으로 간격을 줄이면 매우 빨리 수렴해야합니다.

그러나 불연속성이 있다는 점에서 그 기능에는 몇 가지 다른 문제가 있다고 생각됩니다. fzero가 그렇게 나쁘게 작동한다는 것이 이상하게 보입니다. 이것은 결정론적인 기능입니다.

+0

안녕하세요, Andreas, 답변 해 주셔서 감사합니다. 네, 간단한 이분법이 효과가 있다는 것에 동의합니다. 결국이 방법을 구현할 수 있습니다.그러나 fzero는 다른 방법들 중 이분법을 사용하기 때문에 처음에는 코드화 된 코드뿐만 아니라 적어도 내가 할 것이라고 기대했습니다. 나는 fzero가 너무 나쁘게 작동한다는 것에 놀랐다 (예, 나의 기능은 결정적이다). 관련 범위의 여러 지점에서 평가를 시도했지만 (원래 게시물 참조) 함수가 연속으로 표시되었지만 확인하지 않은 지점에서 문제가 발생할 수 있습니다. 나는 어떤 문제도 bisection method에 나타날 것이라고 생각한다. – HelenAlex

+0

fzero가 이미 2 분면을 사용하고 있다면 다시 구현할 필요가 없습니다. [오류 코드] (http://www.mathworks.de/de/help/matlab/ref/fzero.html)를 반환 할 수 있습니다. – Andreas

1

또한 fmincon을 사용하는 동안이 문제가 발생했습니다. 여기 어떻게 고쳐야 할까?

최적화 루프 (여러 변수) 내에서 함수 (단일 변수)의 해를 찾아야했습니다. 이 때문에 단일 변수 함수의 해를 구하는 데 많은 시간을 할애해야했습니다. 문제는 fmincon (또는 fzero)이 검색 간격이 너무 길면 솔루션으로 수렴하지 않는다는 것입니다. 이 문제를 극복하기 위해 필자는 풀 루프에서 문제를 풀었습니다. 솔버의 결과 인 fval 값에 대한 제약이있는 거대한 시작 상행선 (1e200)을 사용했습니다. 결과 fval이 충분히 작지 않은 경우, 인자에 의한 상한을 감소시킵니다. 코드는 다음과 같습니다.

fval = 1; 
factor = 1; 
while fval>1e-7 
    UB = factor*1e200; 
    [x,fval,exitflag] = fminbnd(@(x)function(x,...),LB,UB,options); 
    factor = factor * 0.001; 
end 

좋은 해결책을 찾으면 해결사가 종료됩니다. 물론 다른 요인을 도입하거나 요인 단계를 증가시켜 LB와 함께 할 수도 있습니다. 내 제 1 언어가 영어가 아니므로 실수를해서 사과드립니다.

건배, 크리스티안

관련 문제