2013-02-19 1 views
5

Matlab에서 익명 함수를 이벤트 함수로 사용할 수 있습니까? 내가 뭘 원하는Matlab에서 ODE를 해결할 때 익명 함수를 이벤트 함수로 사용할 수 있습니까?

opt = odeset('Events', @(t,y) (deal(y(end)-t^2,1,0))); 
[T,Y] = ode45(@odefun,[tstart tend],y0,opt); 

그러나,이 출력의 수는 정확히 일치해야합니다 거래를 불평 오류를 반환합니다 기본적으로. 익명의 함수가 복수의 인수를 돌려 줄 수있는 다른 방법이 있습니까?

답변

0

또한 (이것은 게임에서 매우 늦어서이 문제에 추가되는 것이지만, 이것은 나를 좌절시킵니다.) 다음은 중첩 된 함수가있는 솔루션입니다.

function [ dealfunchandle ] = dealwithit(arrayfunc) 
% Takes as input an event function of (t,z) that returns a 3 array (in same order as event syntax). 

    function [a, b, c] = dealfunc(t,z) 
     output = arrayfunc(t,z); 
     a = output(:,1); 
     b = output(:,2); 
     c = output(:,3); 
    end 

dealfunchandle = @dealfunc; 
end 

이 함수는 한 번만 작성하면됩니다 (다른 이벤트 함수를 많이 사용해야하는 경우 유용함). 다음과 같이 코드 내에서 익명 이벤트 함수를 생성하는 데 사용할 수 있습니다.

arrayfunc = @(t,y) [y(1), 0, 1]; 
events = dealwithit(arrayfunc); 

opts = odeset('Events', events); 

그런 다음 정상적으로 ode45를 입력하십시오.

1

아니요, 할 수 없습니다. Matlab의 익명 함수는 하나의 값만 반환합니다.

대신 deal 주위에 얇은 래퍼를 정의하고 핸들로 래퍼를 전달할 수 :

function [a b c] = wrapper(t,y) 
    [a b c] = deal('some stop condition', 1, 0); 
end 

opt = odeset('Events', @wrapper); 

[T, Y] = ode45(@odefun, [tstart tend], y0, opt); 
+1

요점은 래퍼 기능을 피하고 싶습니다. deal을 사용하면 실제로 익명의 함수가 3 개의 값을 반환 할 수 있습니다 (거래가 인수를 반환하기 때문에). 그러나 ODE-solver는 다양한 반환 값을 기대하고있는 반면 거래는 정확히 일치해야합니다. –

+0

당신은 완전히 옳습니다. 나는 변화를 얻을 때 이것을 다시 보게 될 것이다. 나는 그것이'ode45'가 다양한 수의 인수를 이벤트 핸들러로 전달한다는 사실과 관련이 있다고 생각한다. –

+0

필자는 그것이 'odeevents'에서 하나의 출력으로 평가되고 'odezero'에서 출력 삼중 항으로 평가되는 기능 때문이라고 생각합니다. 그러나 익명 함수의 출력 args 수는 1 * 또는 * 3이지만 둘 다 처리 할 수는 없습니다. – embert

2

나는 같은 질문에 대한 답을 찾고이 게시물을 발견. 이것은 어떤 사람들에게는 질문이 여전히 유효하다는 것을 의미합니다. 마침내 나는 혼자서 그 해결책을 발견 했으므로 나는 조금 구식의 대답을하고 싶다.

사실 예, 가능하지만 간단하지 않습니다. 시도해보십시오 :

evnt_fun = @ (t, f) subsref ({ '일부 중지 조건', 1, 0}, 구조체 '유형', '{}', 'subs', {{ ':'} })));

코드의 이전 버전과의 호환성을 완전히 확인할 수 없습니다. 그러나 R2011 이상의 MATLAB 버전에서 작동합니다.

관련 문제