ネストされた機能を使用せずにオードを解決するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1572268

  •  21-09-2019
  •  | 
  •  

質問

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

役に立ちましたか?

解決

解決したい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]);

他のヒント

書かれたように、あなたのコードがどのように機能するかはわかりません。それはODE15Sへの最初の入力でしょうか?

いずれにせよ、Vararginまたは入力を取得する別の機能ステップ関数を記述できます。次に、定数を使用して匿名関数を作成します。それをODE15に渡します。

- ローレン

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top