2017-04-25 1 views
1

무한한 적분 한계가있는 한정 분모의 수치 계산이 포함 된 수식을 사용하여 데이터에 적합하게하려고합니다. 피팅을 위해 벡터화 모델 기능이 필요한 옥타브 함수 leasqr을 사용합니다. 다음 코드는 숫자 통합을 호출 할 때 발생하는 오류를 생성합니다. 나는 오류가없는함수의 벡터화에는 옥타브 단위의 유한 정수의 수치 계산이 포함되어 있습니다.

for i = 1 : length (h) 
dd (i) = gauss_disp (h (i), pin) 
endfor 

,하지만 난이 구성을 사용할 수 없습니다 : 나는 루프를 사용하고있는 경우

function [fGsAb] = GsAbs (x, p) 
Hw = 3108.0 ; 
fGsAb = Hw ./ (2.4 .* p(1) .*p(2)) .^2 .* (exp (- (Hw - p(1) .* x) .^2 ... 
./ (2.4 .* p(1) .*p(2)) .^2) - exp (- (Hw + p(1) .* x) .^2 ... 
./ (2.4 .* p(1) .*p(2)) .^2)) ; 
endfunction 
function [GsDisp] = gauss_disp(x, p) 
[GsDisp1, err] = quadgk (@(z) GsAbs(z, p) ./(z-x), - inf, x - 0.000001); 
[GsDisp2, err] = quadgk (@(z) GsAbs(z, p) ./(z-x), x + 0.000001 , inf ); 
GsDisp = GsDisp1 +GsDisp2; 
endfunction  
h = [200:15:6000]; 
pin =[1 250]; 
dd = gauss_disp (h, pin); 

(OP2은 10x2가 OP1는 1x387입니다)

준수하지 않는 인수 leasqr. 이 제한 사항을 어떻게 해결할 수 있습니까?

미리 감사드립니다.

+0

질문이 명확하지 않습니다. 이 함수들을 파일로 정의하고 있습니까? 아니면 옥타브 터미널에서 직접? 그리고이 줄을 당신에게주는 것은 무엇입니까? –

+1

문제 해결에 도움이되는 답변을 제공해 주셨습니다. 그러나'leasqr'가'optim' 패키지의 함수라는 사실과 같은 특정 정보를 제공 해주시기 바랍니다. 그리고 이것이 실패한 특별한 형태의 함수를 기대합니다. 나 자신을 추측하기 위해 합리적인 양의 탐정 작업을해야했다. –

답변

1
이에서 gauss_disp.m 파일을 변경

:

function [GsDisp] = gauss_disp(x, p) 
    [GsDisp1, err] = quadgk (@(z) GsAbs(z, p) ./(z-x), - inf, x - 0.000001); 
    [GsDisp2, err] = quadgk (@(z) GsAbs(z, p) ./(z-x), x + 0.000001 , inf ); 
    GsDisp = GsDisp1 +GsDisp2; 
endfunction 

이에 :

function [GsDisp] = gauss_disp(x, p) 
    GsDisp = arrayfun(@(z) gauss_disp_elementwise(z, p), x) 
endfunction 

function GsDisp = gauss_disp_elementwise(x, p) 
    [GsDisp1, err] = quadgk (@(z) GsAbs(z, p) ./(z-x), - inf, x - 0.000001); 
    [GsDisp2, err] = quadgk (@(z) GsAbs(z, p) ./(z-x), x + 0.000001 , inf ); 
    GsDisp = GsDisp1 +GsDisp2; 
endfunction 

즉, 원래 함수를 스칼라 값만 처리하는 보조 함수로 만든 다음 arrayfun을 사용하여 x의 전체 범위에 대한 출력을 얻습니다. 당신이 당신의 leasqr 기능이 사용할 수 있습니다이 방법, 예컨대 :

y = leasqr(h, dd, pin, @gauss_disp); 

추신 : arrayfun 구문은 단지 편의를위한 것입니다. 당신은 당신이 당신의 질문에 사용했던 것과 비슷한 for 루프를 쉽게 사용할 수있었습니다.

+1

그것의 가장 좋은 것 :-) +1 – Andy

+0

@ 앤디 나는 방금 논문을 제출 했으므로 허용된다. –

+0

감사합니다. 필자가 찾고 있던 피팅 기능의 포장. 나는 'for'루프가 'leasqr'에게는 쓸모 없다고 생각한다. – Igor