2011-12-11 18 views
2

私は自分自身の関数を書く必要があります。これは、形式がf(x,y)=Integrate(g(x,y,z),z from 0 to inf)です。intergralの関数であるmatlab関数

function y=f(x,y) 
[email protected](z)exp(-z.^2)./(z.^x).*(z.^2+y.^2).^(x/2);% as a function of x,y and z 
y=quadgk(g,0,inf) 

と私はf(x0,y0)のような単一の値のためにそれを呼び出す場合、それは動作しますが、私はf([1:10],y0)のようなものを計算しようとすると、エラーメッセージがに何か問題があることは言う:私は使用したコードはでした時間と次元。原則としてforループを使用できますが、コードが遅くなり、永遠にかかるようになります。私はあなたから得ることができる何かがありますか?または参照?

私はforループを避けようとしています。なぜなら、matlabではforループを使うよりもはるかに高速です。私はこの機能を利用できるトリックがあるのだろうかと思います。事前に任意の助け

おかげで、

リン

+0

あなたの場合、私はforループを使うべきだと思います。 'x = 1:10'をお持ちの場合は、通常の関数の時間の10倍以上かかることはないと思います。 – Oli

+0

もし私が10回forループをしてもそれは問題ではありませんが、この関数を別の関数に渡して最適化を行う必要があり、このf関数がベクトル入力を受け入れて生成する必要がありますベクトル出力... – user1092696

答えて

0

はおそらく、あなたはf([1:10]',y0)基づき、行ベースの値の代わりに、列を作成、間隔を転置しようとすることができます。そうでない場合は、関数内の何かが間違っている可能性があります。たとえば、x^yをリストとして入力するには、x.^yの接頭辞を付ける必要があります。 mulitplyと私は考える部門の同じ..

+0

あなたの答えにはありがとう、私は行と列ベクトルの両方を試して、私はすべての*と^と/の後に点を置くことを確認した。私は書き留めた正確な関数を含める必要があります。 – user1092696

0

ループはあなたのための問題ではない場合、あなたのような何かを行う必要があります。

function y2=f(x,y) 
y2=zeros(size(x)); 

for n=1:numel(x) 
    [email protected](z)exp(-z.^2)./(z.^x(n)).*(z.^2+y.^2).^(x(n)/2);% as a function of x,y and z 
    y2(n)=quadgk(g,0,inf) 
end 
+0

返信いただきありがとうございました。私はforループを試しましたが、その後私のコード全体を実行するのに永遠にかかります。この関数は私のプロジェクトの一部です。私はこの関数を定義した後、逆ラプラスを実行して、結果の関数を最大化する必要があります。... matlabの場合、行列計算を実行する速度が非常に速いため、コードが遅すぎるたびにforループを使用すると、 forループよりも、それを行うにはいくつかのトリックがあることを望みます。とにかく、ありがとう。 – user1092696

0

をここでの問題は、quadk自体がgの引数としてベクトルを使用していることです。次に、gのように、z.^xのようになります。これは、zとxが同じ次元を持つ場合にのみ定義される2つのベクトルの威力です。しかし、これはあなたが望むものではありません。

すべての引数の関数をxに評価し、出力ベクトルの次元がxであると仮定します。しかし、これを可能にしていないようであっても、この単純な例であるため

[email protected](x)[x;x.^2] 
quad(g,0,1) 

は動作しません:quadgkを使用した場合

Error using quad (line 79) 
The integrand function must return an output vector of the same length as the 
input vector. 

同様のエラーが表示されます。また、このルーチンはスカラー関数に対してのみ機能し、適応積分法は一般に積分を評価するために各関数に異なる点を使用するため、これは驚くべきことではないことも書かれています。

代わりにquadvを使用する必要があります。これはベクトル値関数を統合することができます。しかし、関数が区間[0、\ infty]に統合されているので、これは間違った結果をもたらします。