또한 (이것은 게임에서 매우 늦어서이 문제에 추가되는 것이지만, 이것은 나를 좌절시킵니다.) 다음은 중첩 된 함수가있는 솔루션입니다.
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를 입력하십시오.
요점은 래퍼 기능을 피하고 싶습니다. deal을 사용하면 실제로 익명의 함수가 3 개의 값을 반환 할 수 있습니다 (거래가 인수를 반환하기 때문에). 그러나 ODE-solver는 다양한 반환 값을 기대하고있는 반면 거래는 정확히 일치해야합니다. –
당신은 완전히 옳습니다. 나는 변화를 얻을 때 이것을 다시 보게 될 것이다. 나는 그것이'ode45'가 다양한 수의 인수를 이벤트 핸들러로 전달한다는 사실과 관련이 있다고 생각한다. –
필자는 그것이 'odeevents'에서 하나의 출력으로 평가되고 'odezero'에서 출력 삼중 항으로 평가되는 기능 때문이라고 생각합니다. 그러나 익명 함수의 출력 args 수는 1 * 또는 * 3이지만 둘 다 처리 할 수는 없습니다. – embert