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 回答