Matlab 利用实验数据进行双积分

Matlab 利用实验数据进行双积分,matlab,integration,splines,Matlab,Integration,Splines,我需要使用实验数据进行二重积分,但我的积分极限对于每个积分都是相同的,在这种情况下,时间。从数学上讲,我需要计算: E[a0+∫0T a(t)dt]=a+limTx→ ∞ (1吨)∫0T∫0t a 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(@

我需要使用实验数据进行二重积分,但我的积分极限对于每个积分都是相同的,在这种情况下,时间。从数学上讲,我需要计算:

E[a0+∫0T a(t)dt]=a+limTx→ ∞ (1吨)∫0T∫0t a 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可能在处理样条曲线时遇到问题,但我不知道如何解决这个问题。

首先,你不应该在很多事情上使用同一个字母;你的代码很难阅读,因为你必须弄清楚T在每个实例中的含义

第二,纯数学有帮助:在变量变化和简单计算后,二重积分变为单积分:

∫0T∫0x a(t)dt dx=∫0T∫tT a(t)dx dt=∫0T(T-T)*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倍

有一个积分2函数可能更有效。此外,根据您输入的数据,您的预期值约为180000(rand在0和1之间是一致的,所以所有的值都是正值。我想使用integral2函数,尽管该函数需要两个变量的依赖关系,我不知道如何使用样条曲线执行此步骤。我的实际数据有正值和负值rand函数只是为了提供更多信息。