Двойная интеграция с использованием экспериментальных данных
Мне нужно выполнить двойную интеграцию с использованием экспериментальных данных, но мои пределы интегрирования одинаковы для каждого интеграла, в данном случае времени. Математически мне нужно рассчитать:
E [a0+ ∫0T a (t) dt] = a + limTx → ∞ (1 / T) ∫0T ∫0t 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 могут быть проблемы со сплайнами, но я не знаю, как это решить.
1 ответ
Прежде всего, вы не должны использовать одну и ту же букву для множества вещей; Ваш код довольно трудно читать, потому что нужно выяснить, что означает T в каждом случае.
Во-вторых, помогает чистая математика: после замены переменных и простого вычисления двойной интеграл становится единым интегралом:
T 0 T ∫ 0 x a (t) dt dx = ∫ 0 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 раз быстрее.