2009-10-15 6 views
3

MATLAB의 ODE 해결사를 사용하여 해결해야 할 미분 방정식이 있습니다. 미분 방정식 자체는 매우 단순하지만 많은 "상수"에 의존합니다. 이러한 상수는 보편적이지 않으며 호출자가 제공해야합니다.중첩 된 함수를 사용하지 않고 ODE를 어떻게 해결할 수 있습니까?

이러한 종류의 예시 ODE가 될 것이다 : J, K 및 L은 상수이다 X

dx/dt = -j * (k + x) ./ (l + x) 

변수이다.

내가 지금까지 해결해온 방법은 모든 초기 값과 상수 값 (10 개 정도)을 인수로 취하고 내부 "단계"를 호출하는 함수를 사용하는 것입니다. 함수는 MATLAB이 ODE 해결자를 기대하는 형태의 벡터를 취합니다. 그래서 ...

function [outputVector] = someFunction(x, y, j, k, l, m, n, o) 
    function [output] = someFunctionStep(t, inputVector) 
     x = inputVector(1); 
     y = inputVector(2); 
     dx = -j .* (k + x) ./ (l + x); 
     dy = -m .* (n + y) ./ (o + y); 
     output = [dx;dy] 
    end 
    outputVector = ode15s(@someFunctionStep, [0, endTime], [x,y]); 
end 

그러나 변수의 수와 코드 크기가 증가함에 따라,이 코드의 저주 - 근처 읽을 수 엉망 갈수록 우아하고 결과가된다. 그래서, 나는 a) 입력 벡터의 스텝 함수에 상수를 전달하거나 b) 전역 변수를 사용하지 않고 각 시스템의 스텝 함수를 자신의 파일로 옮기는 것입니다. 이 작업을 수행하는 합리적인 방법이 있습니까? 아니면 그냥 잡아 당겨 추악한 코드를 작성해야합니까?

답변

3

은 (anonymous functions을 사용하도록 Loren's suggestion 기준). 여기에 하나가 당신의 예처럼 보일 수있는 작업은 다음과 같습니다

function odeFcn = makeODE(j,k,l,m,n,o) 
    odeFcn = @(t,y) [-j*(k+y(1))/(l+y(1)); -m*(n+y(2))/(o+y(2))]; 
end 

각 발전기의 기능은 입력 매개 변수의 집합을 적용하고 발전기 기능의 출력으로 function handle를 반환 익명 함수를 작성하는 데 사용할 것입니다. 다음은이를 사용할 수있는 방법입니다.

outputVector = ode15s(makeODE(a,b,c,d,e,f), [0,endTime], [x,y]); 
+0

그게 훨씬 더 잘 보입니다! 감사! –

4

누구도 someFunctionStep을 호출하거나 가리 키지 않았기 때문에 작성된 코드가 어떻게 작동하는지 알 수 없습니다. 그것이 ode15s의 첫 번째 입력이되어야합니까?

어떤 경우에도 varargin 또는 입력을 사용하는 별도의 someFunctionStep 함수를 작성할 수 있습니다. 그런 다음 상수를 사용하여 익명의 함수를 만듭니다. 그것을 ode15s로 전달하십시오. 난 당신이 해결하고자하는 미분 방정식의 각 시스템에 대한 특정 "발전기"기능을 만드는 제안

--Loren

+0

예, ode15s의 첫 번째 인수 여야합니다. 이제 해결되었습니다. –

관련 문제