2

実験データを使用して二重積分を実行する必要がありますが、積分限界は各積分 (この場合は時間) で同じです。数学的に私は計算する必要があります:

E [ a 0 + ∫<sub>0 T a(t)dt ] = a + lim Tx → ∞</sub> (1/T) ∫<sub>0 T ∫<sub>0 t a dt dT

いくつかの検索の後、私は到達しました:

T = 0:0.1:600;
x = T;
A = rand(1,length(T)); % my data
pp_int = spline(T,A );
DoubleIntegration = integral(@(x)arrayfun(@(T )(integral(@(T ) ppval(pp_int,T ),0,  T  )),x),0,T(end)  );

コードの実行に非常に時間がかかり、大きな値が得られました。私の問題は、Matlab がスプラインの処理に問題がある可能性があることだと思いますが、それを解決する方法がわかりません。

4

1 に答える 1

3

まず第一に、同じ文字を複数のものに使用するべきではありません。すべてのインスタンスで T が何を意味するのかを理解する必要があるため、コードを読むのはかなり困難です。

次に、純粋な数学が役立ちます。変数を変更して簡単な計算を行うと、二重積分が単一積分になります。

∫<sub>0 T ∫<sub>0 x a(t) dt dx = ∫<sub>0 T ∫<sub>t T a(t) dx dt = ∫<sub>0 T (Tt)*a( t) dt

デモンストレーションのために、より狭い範囲で非ランダム データを使用しました。

T = 0:0.1:60;
x = T;
A = sin(T.^2); % my data
pp_int = spline(T,A );
tic
DoubleIntegration = integral(@(x) arrayfun(@(T )(integral(@(T ) ppval(pp_int,T ),0,  T  )),x),0,T(end)  );
toc
tic
SingleIntegration = integral(@(t) (T(end)-t).*ppval(pp_int,t), 0, T(end));
toc
disp(DoubleIntegration)
disp(SingleIntegration)

出力:

Elapsed time is 27.751744 seconds.
Elapsed time is 0.007223 seconds.
   51.3593

   51.3593

同じ結果で、3800 倍高速です。

于 2015-06-19T18:31:00.247 に答える