0

関数 f = @(x,y,z) があります ... y と z の数値を指定して x の有限数値積分を実行したいと考えています。

現在、私は次のようにこれを行います-

f2 = @(x) f(x,5,10)
integral(f2,-1,1)

(5 と 10 は実際には、プログラムの過程で特定の値を想定した y と z にすぎません)。

私の質問は次のとおりです-

(y、z)の多くの値に対してこの積分を行う必要があるため(通常はループ内)。毎回、関数を再定義する必要があります。これにより、おそらく私のプログラムは非常に遅くなります。この操作を実行するためのより最適な方法はありますか?関数を常に再定義する必要はありません。プログラムをより速く実行する必要があります。

ありがとう!

4

2 に答える 2

1

匿名関数は遅いです。入れ子関数として書き直すfのはどうですか?f2例えば:

function result = iterate_trough(A, B)

        result = 0;
        for a = 1:2:A, for b = 5:5:B
                result = result + quad(@f2,-1,1);
        end; end;

        function r  = f(x,y,z),  r  = x+y+z;     end
        function r2 = f2(x),     r2 = f(x,a,b);  end
end

これにより、コードの柔軟性が低下しますか?

後で編集:またはさらに良いことに、呼び出しのオーバーヘッドを排除しますf:

function result = iterate_trough(A, B)

        result = 0;
        for a = 1:2:A, for b = 5:5:B
                result = result + quad(@f2,-1,1);
        end; end;

        function r2 = f2(x),  r2 = x+a+b;  end
end
于 2013-04-17T01:12:13.443 に答える
0

File Exchange で入手可能な「Writing Fast Matlab Code」に詳述されている合成 Simpson 法を使用して、多くの積分を使用していくつかのループ コード (MCMC) を高速化することができました。

http://www.mathworks.com/matlabcentral/fileexchange/5685

ドキュメントから、例として 1 次元の統合を次に示します。

h = (b − a)/(N−1);
x = (a:h:b).';
w = ones(1,N); w(2:2:N−1) = 4; w(3:2:N−2) = 2; w = w*h/3; 
I = w * f(x);

ドキュメントには、2 次元と 3 次元の例も示されています。

欠点として、コードは組み込みの直交法の一部で適応ステップ サイズの一部を放棄します。ただし、この方法は非常に高速であるため、これが問題にならないほどの高精度に力ずくで統合することができました。(ただし、私の積分はすべて比較的飼いならされています。)

お役に立てれば。

于 2013-04-17T04:37:48.107 に答える