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