문제의 코드에서 함수 호출 및 코사인 사인 발견의 속도를 최적화하는 것은 여기에 있습니다 :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는 충분히 작아야 트리거 할 수있는 수십만 번의 반복이 필요합니다.
오일러 방법을 사용해야한다고 가정합니다. 나는 당신이 왜 그런 가정을 할 것인지에 대해 궁금해 할 때, 상태 의존적 인 소음과 함께 확률 적 미분 방정식을 가지고 있습니다.
다른 솔루션을 테스트하는 것이 더 쉬워 지도록 내장 함수와 테스트 데이터 세트를 함께 사용할 수 있습니까? – tmpearce
'dot (y-normpt, normvec)'를'sum (conj (y-normpt). * normvec) '으로 바꾸면'if'-'then' 절을 저장할 수 있습니다. 그러나 세 벡터가 모두 열 벡터인지 확인하십시오. –
이 예를 사용하는 방법은 아직 명확하지 않습니다. 복사하여 붙여 넣을 수 있도록 만들어 실행하면 효과가 있습니다. (제발. :) :) – tmpearce