2017-07-12 9 views
-1

正常に動作するこのコードを試してください。積分へのネストされた呼び出しは失敗します

a=1;b=2; 
% A two-variate function 
f2= @(x,y) x+y; 
[email protected](x) integral(@(y) f2(x,y), a,b); 
% Test the evaluation of the derived function handle 
derivedF2(0); 
% Test the integration of the derived function handle 
% integralVal=integral(derivedF2,a,b); 
% integralVal=integral(@(x) derivedF2(x),a,b); 
% Test plotting of the derived function handle 
figure(11); 
ezplot(derivedF2); 

ただし、integralValで始まる行のコメントを外すと、コードが壊れます。

明らかに、派生した関数ハンドルは統合操作をサポートしていないか、何かを見逃していますか?

答えて

1

短い答え

integralVal=integral(derivedF2,a,b, 'ArrayValued', true); 

説明あなたはあなたのエラーメッセージ読んでください

Output of the function must be the same size as the input. If FUN is an array-valued integrand, set the 'ArrayValued' option to true.

derivedF2のでがで評価されたが、あなたは'ArrayValued'オプションを追加する必要がありますベクトル化された方法、すなわちを評価する単一のスカラの代わりにベクトルyを供給することによって、異なる座標に一度に座標を代入すると、MATLABはベクトル化された方法で外側の積分も評価することができません。したがって、あなたはすなわち、外側の積分に'ArrayValued'オプションを追加する必要があります:問題がintegralにネストされた呼び出しに純粋に関連していることを

Warning: Function failed to evaluate on array inputs; vectorizing the function may speed up its evaluation and avoid the need to loop over array elements.

注:ezplotは、以下の関連の警告を生成すること

integralVal=integral(derivedF2,a,b, 'ArrayValued', true); 

注意を次のコードでも同じエラーが発生します。

integralVal=integral(@(x) integral(@(y) f2(x,y), a,b),a,b); 

WhはArray Valuedですか?

... a function that accepts a scalar input and returns a vector, matrix, or N-D array output.

そこで、@(y) f2(x, y)xが配列、すなわちである場合、それはyのスカラー入力の配列を返す配列値関数です。 @(y) f2(x, y)、すなわちxが配列であることを避け、配列値の関数であることを避け

  • 2つの可能性は、アレイ値の問題を回避するために存在します。これは、derivedF2が上記で詳述した配列値関数であることを示すことによって行うことができる。厳密に言えば、配列値関数ではない。すなわち、積分は同じ数の出力および入力を有するべきである。ただし、内部で配列値関数を使用します。つまり、@(x) f2(x, y)は配列値関数です。Matlabはデフォルトで被積分関数をベクトル化して評価します。すなわち、yのベクトルを使用します。

  • @(y) f2(x, y)が配列値関数であることをMATLABを教える:

    [email protected](x) integral(@(y) f2(x,y), a,b, 'ArrayValued', true); 
    

    これは、より直感的なアプローチであるが、内部の積分は非常に多くの場合、外部の積分よりも呼ばれているように遅いですがあります。

大切なアレイの代替解釈は、あなたがベクトル化を使用しないように、MATLABを伝えるということですが、この解釈のために大切な名前アレイは、やや誤解を招くです。

+0

ありがとう、@ m7913d。そしてあなたの残りの人はこの答えを読んでいます。 ezplotの警告を修正する1つの方法は、そのコード行を次のように変更することです。 "ezplot(@(x)arrayfun(derivedF2、x));" – user2008151314

+0

こんにちは@ m7913d、私は "ArrayValued"オプションをもっと見ると、私はもっと混乱しました。 [このリンク](https://www.mathworks.com/help/matlab/ref/integral.html#inputarg_fun)では、「ArrayValued」オプションをtrueに設定すると、funはスカラーを受け入れて固定サイズの配列です。 "また、[このリンク](https://www.mathworks.com/help/matlab/ref/integral.html#input_argument_d0e495282)では、「このフラグをtrueに設定すると、funはスカラー入力を受け取り、それを返しますベクトル、行列、またはND配列の出力です。 – user2008151314

+0

'ArrayValued'、trueは、被積分関数が配列値関数であることを示します。それは "配列値関数"が地球上で何を驚かせるのです...これはあまりにも基本的な質問であれば申し訳ありません。 – user2008151314

関連する問題