7

ベクトルに関数値がfあり、引数の値を含むベクトルもありますx。の定義された整数値を見つける必要がありますf。しかし、引数ベクトルxは一様ではありません。不均一なグリッド上の統合を扱うMatlabの関数はありますか?

4

3 に答える 3

6

ヘルプから取得:

Z = trapz(X,Y) は、台形法を使用して X に関する Y の積分を計算します。X と Y は同じ長さのベクトルでなければなりません。または、X が列ベクトルで、Y が大きさが 1 でない最初の次元が length(X) である配列でなければなりません。trapz はこの次元に沿って動作します。

ご覧のとおりx、均一である必要はありません。

例えば:

x = sort(rand(100,1)); %# Create random values of x in [0,1]
y = x;
trapz( x, y) 

戻り値:

ans =

    0.4990

もう一つの例:

x = sort(rand(100,1)); %# Create random values of x in [0,1]
y = x.^2;
trapz( x, y) 

戻り値:

ans =

    0.3030
于 2012-11-15T11:27:24.623 に答える
3

関数 (および分散方法) によっては、最初にデータを補間するxことで精度が向上する場合があります。spline

pp  = spline(x,y);
quadgk(@(t) ppval(pp,t), [range]) 

それが手っ取り早い方法です。より高速で直接的なアプローチがありますが、それは見苦しく、透過性がはるかに低くなります。

result = sum(sum(...
    bsxfun(@times, pp.coefs, 1./(4:-1:1)) .*...  % coefficients of primitive
    bsxfun(@power, diff(pp.breaks).', 4:-1:1)... % all 4 powers of shifted x-values
    ));

これらすべてが役立つ理由の例として、ここから例を借ります。正確な答えは

>> pi/2/sqrt(2)*(17-40^(3/4))
ans =
     1.215778726893561e+00

定義する

>> x = [0 sort(3*rand(1,5)) 3];
>> y = (x.^3.*(3-x)).^(1/4)./(5-x);

我々は気づく

>> trapz(x,y)
ans =
    1.142392438652055e+00

>> pp  = spline(x,y);
>> tic; quadgk(@(t) ppval(pp,t), 0, 3), toc
ans =
    1.213866446458034e+00
Elapsed time is 0.017472 seconds.

>> tic; result = sum(sum(...
    bsxfun(@times, pp.coefs, 1./(4:-1:1)) .*...  % coefficients of primitive
    bsxfun(@power, diff(pp.breaks).', 4:-1:1)... % all 4 powers of shifted x-values
    )), toc
result =
    1.213866467945575e+00
Elapsed time is 0.002887 seconds.

したがってtrapz、値を よりも過小評価します0.07。後者の 2 つの方法では、誤差は 1 桁小さくなります。また、splineアプローチの読みにくいバージョンは、桁違いに高速です。

したがって、この知識を武器に:賢明に選択してください:)

于 2012-11-15T11:59:32.647 に答える
0

の各区分ペアに対してガウス求積法を実行しx、それらを合計して完全な積分を得ることができます。

于 2012-11-15T13:28:32.203 に答える