2

私は数値積分法をいじっていて、関数が欲しい

myIntegrator(f,fParams)

ここでは、数値積分を実装します。

fには任意の数のパラメーターが必要になる可能性があるため、 myIntegrator() が関数ハンドル (@f) を受け入れ、 fParams を使用してそれを呼び出す一般的な方法を探します

より明確にするために、次の@gを使用して、次に@h (いくつかの数値関数のみ)を使用して、 myIntegratorを呼び出したいと思います。

g(x,y)
h(x)

そして、実行するmyIntegratorで使用できる1行のコードがあるかどうか疑問に思っています:

myIntegrator(f,fParams)
   invoke(f,fParams)
end

両方で機能します

myIntegrator(@g,[x,y])

myIntegrator(@h,[x])

あなたの助けは大歓迎です!

4

2 に答える 2

1

可変数の入力引数の 使用を検討しましたvararginか?

function myIntegrator( f, varargin )
%
%
fprintf(1, 'function f got %d arguemnts\n', nargin );
% calling f with its arguments
f( varargin{:} );

詳細については、のマニュアルを参照してvararginください。

今、あなたはそれを呼び出すことができます

myIntegrator( @g, x, y );

としても

myIntegrator( @h, x );
于 2013-04-04T10:11:24.850 に答える
0

あなたが探していると思いますfeval

>> feval(@cos, pi)
ans =
   -1

fevalは任意の数の入力を受け入れ、関数 への入力として与えられますf。さらに、feval関数ハンドルと文字列で定義された関数の両方で機能します。

引数を渡すための優れたメカニズムは、Shai で説明されているように、vararginへの呼び出しでセル拡張を使用するメソッドです。f

ただし、これらすべてを忘れて別のルートを取ることをお勧めします。無名関数:

[t,y] = myIntegrator(@(t,x) f(a,t,c,x,y), ...)
[t,y] = myIntegrator(@(t,x) g(x,y,z,u,v,t), ...)

積分器 (実際に ODE のソルバーを意味する場合。それ以外の場合は直交法と呼ばれます) は、通常、時間tと状態変数のみxを微分方程式に入力します。それは、数学的に書く方法でもあります。

DE が必要とするその他のパラメータ (定数、データ、ファイル名など) は、インテグレータが渡す責任はありません。それは呼び出し元の責任です。インテグレーターは、関数の詳細を知る必要はなく、MATLAB に既に組み込まれているものを多かれ少なかれ複製するメカニズムを持つべきではありません。KISS の原則に違反しています。

私が話しているこの責任の移行は、上で示した簡単な例によって達成されます。ode45詳細については使用方法を参照するか、この問題に関する MATLAB ドキュメントでよく参照されるこのページを参照してください。

于 2013-04-04T10:00:37.387 に答える