3

MATLAB の ODE ソルバーを使用して解く必要のある微分方程式がいくつかあります。微分方程式自体はかなり単純ですが、多くの「定数」に依存しています。これらの定数は普遍的ではなく、呼び出し元が提供する必要があります。

この種の ODE の例は次のようになります。

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

ここで、j、k、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) グローバル変数を使用することなく、各システムのステップ関数を独自のファイルに移動することです。これを行う合理的な方法はありますか、それとも単にそれを吸い上げて醜いコードを書くべきですか?

4

2 に答える 2

4

誰もsomeFunctionStepを呼び出したり指したりしないため、書かれたコードがどのように機能するかわかりません。これを ode15s への最初の入力にする必要がありますか?

いずれの場合でも、varargin または入力を受け取る別の someFunctionStep 関数を作成できます。次に、定数を使用して無名関数を作成します。それを ode15s に渡します。

――ローレン

于 2009-10-15T13:57:50.987 に答える
3

解決したいODEのシステムごとに特定の「ジェネレーター」関数を作成することをお勧めします(無名関数を利用するというローレンの提案に基づいて)。あなたの例では、次のようになります。

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

各ジェネレーター関数は一連の入力パラメーターを受け取り、それらを使用して無名関数を作成し、ジェネレーター関数からの出力として関数ハンドルを返します。これを使用する方法は次のとおりです。

outputVector = ode15s(makeODE(a,b,c,d,e,f), [0,endTime], [x,y]);
于 2009-10-16T01:03:53.503 に答える