我需要使用实验数据执行双重积分,但我的积分限制对于每个积分都是相同的,在这种情况下是时间。数学上我需要计算:
E [a 0 +∫ 0 T a(t)dt] = a + lim Tx→∞(1 / T)∫ 0 T ∫ 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可能无法处理样条线,但我不知道如何解决这个问题。
答案 0 :(得分:3)
首先,你不应该用同一个字母写一堆东西;你的代码很难阅读,因为必须弄清楚T在每个实例中意味着什么。
其次,纯数学有助于:在改变变量和简单计算之后,双积分成为单个积分:
∫ 0 T ∫ 0 x a(t)dt dx =∫ 0 < / sub> T ∫ t T a(t)dx dt =∫ 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倍。