2012-06-26 4 views
0

문제의 코드에서 함수 호출 및 코사인 사인 발견의 속도를 최적화하는 것은 여기에 있습니다 :matlab에 : 루프

function k = whileloop(odefun,args) 
    ... 
    while (sign(costheta) == originalsign) 
     y=y(:) + odefun(0,y(:),vars,param)*(dt); % Line 4 
     costheta = dot(y-normpt,normvec); 
     k = k + 1; 
    end 
    ... 
end 

하고 명확하게는, odefun이 F1.m, 광산의 m-파일입니다. 이 while 루프를 포함하는 함수에 전달합니다. 그것은 whileloop(@F1,args)과 같은 것입니다. 위 코드 블록의 4 행은 오일러 (Euler) 방법입니다.

while 루프를 사용하는 이유는 "normvec"점에 의해 정의 된 평면 "normpt"과 벡터 "normvec"에 교차하는 벡터 "y"를 트리거하려고하기 때문입니다.

이 코드를 쉽게 변경하여 속도를 극적으로 향상시킬 수 있습니까? mex 파일을 만드는 방법을 배워야합니까 (속도를 높이기 위해)?

편집 : 여기

하나는 함께 시험을 시도 할 수 있습니다 무엇의 예에서 돌진 시도이다. 나는 이것을 디버깅하지 않았다.

%Save the following 3 lines in an m-file named "F1.m" 
function ydot = F1(placeholder1,y,placeholder2,placeholder3) 
    ydot = y/10; 
end 

%Run the following: 
dt = 1.5e-12 %I do not know about this. You will have to experiment. 
y0 = [.1,.1,.1]; 
normpt = [3,3,3]; 
normvec = [1,1,1]; 
originalsign = sign(dot(y0-normpt,normvec)); 
costheta = originalsign; 
y = y0; 
k = 0; 
while (sign(costheta) == originalsign) 
    y=y(:) + F1(0,y(:),0,0)*(dt); % Line 4 
    costheta = dot(y-normpt,normvec); 
    k = k + 1; 
end 
disp(k); 

dt는 충분히 작아야 트리거 할 수있는 수십만 번의 반복이 필요합니다.

오일러 방법을 사용해야한다고 가정합니다. 나는 당신이 왜 그런 가정을 할 것인지에 대해 궁금해 할 때, 상태 의존적 인 소음과 함께 확률 적 미분 방정식을 가지고 있습니다.

+0

다른 솔루션을 테스트하는 것이 더 쉬워 지도록 내장 함수와 테스트 데이터 세트를 함께 사용할 수 있습니까? – tmpearce

+0

'dot (y-normpt, normvec)'를'sum (conj (y-normpt). * normvec) '으로 바꾸면'if'-'then' 절을 저장할 수 있습니다. 그러나 세 벡터가 모두 열 벡터인지 확인하십시오. –

+0

이 예를 사용하는 방법은 아직 명확하지 않습니다. 복사하여 붙여 넣을 수 있도록 만들어 실행하면 효과가 있습니다. (제발. :) :) – tmpearce

답변

2

저는 실제 ODE 통합에 중점을 둡니다. 수행해야 할 단계가 줄어들수록 루프가 더 빨리 실행됩니다. 실제 통합 방법을 최적화 한 후에는 서명 확인 속도 만 걱정할 것입니다.

1 차 명시적인 오일러 방법을 사용하고있는 것처럼 보입니다. 고차원 적분기 또는 암시 적 방법을 시도해 보셨습니까? 종종 시간 단계를 크게 늘릴 수 있습니다.

+0

이것은 훌륭한 제안이며 중요한 정보를 잊어 버린 것을 강조합니다. 이것은 상태 - 의존 소음을 갖는 확률 론적 ODE이며, 현재로서는 오일러 방법을 사용해야합니다. 수학은 지금 그것을 바꾸기에 너무 무겁다. – user1483329

+0

그러면 코드를 프로파일 링하는 것이 가장 좋습니다. odefun이 실행 시간의 상당 부분을 차지한다면, sign check를 최적화함으로써 얻을 수있는 것은 거의 없다. 프로파일 러를 켜려면'profile on '을 사용하고 결과를 보려면'profile viewer'를 사용하십시오 (nb : 프로파일 러를 끄기도합니다). 그렇다면'odefun'을 최적화 할 필요가 있습니다. – sfstewman

+0

나는 심지어 matlab에 코드를 프로파일 링하는 것에 대해 몰랐다. 이것은 지금 충분한 도움입니다.실제 F1은 매우 복잡하며 프로파일 링의 결과에 의해 입증 된대로 최적화를 사용할 수 있습니다. – user1483329