Несколько вложенных интегралов в Matlab

Я пытаюсь интегрировать вложенные интегралы следующего вида:

s_min = 0; 
s_max = lam;
t_min = 0; 
t_max = pi;
pmax =  @(x,y) y;
pmin = 0;
ymax = 1;   
ymin = @(x) x;
xmax = 1;
xmin = 0;

eqn = integral(@(x) x.*integral(@(y) (1/y).*integral(@(p) (exp(-arrayfun(@(p,x,y)integral2(@(s,t)myfun(s,t,p,x,y),s_min,s_max,t_min,t_max),p,x,y)./(k.*T))),pmin,pmax,'Arrayvalued',true),ymin,ymax,'Arrayvalued',true),xmin,xmax,'Arrayvalued',true)

Однако я получаю сообщение об ошибке:

Ошибка при использовании интеграла (строка 85)
A и B должны быть скалярами с плавающей запятой.

Я подумал, что если добавить 'Arrayvalued' для одиночных интегралов и arrayfun для двойных интегралов, то это не будет проблемой. Почему это не работает?


person SFfever    schedule 10.06.2016    source источник


Ответы (1)


Аргументы диапазона для integral() должны быть числами, но вы даете функции pmax и ymin. Вам нужно их оценить. Я разделил его на несколько строк, чтобы сделать его более читаемым.

fa = @(p,x,y) @(s,t) myfun(s,t,p,x,y);
fb = @(p,x,y)integral2(fa(p,x,y),s_min,s_max,t_min,t_max);
fc = @(x,y) @(p) (exp(-arrayfun(fb,p,x,y)./(k.*T)));
fd = @(x)@(y) (1/y).*integral(fc(x,y),pmin,pmax(x,y),'Arrayvalued',true);
fe = @(x) x.*integral(fd(x),ymin(x),ymax,'Arrayvalued',true);
eqn = integral(fe,xmin,xmax,'Arrayvalued',true)

Реализация многомерной интеграции таким образом кажется довольно неэффективной, она не закончилась на моей машине, пока я писал это. Возможно, вам придется реализовать собственный интегратор.

person janismac    schedule 10.06.2016
comment
Привет, janismac, спасибо! Есть ли у вас какие-либо предложения или ссылки на то, как я мог бы сделать свой собственный интегратор? Можно ли это сделать с помощью зацикленных функций? - person SFfever; 10.06.2016
comment
Для ограниченной функции в прямоугольной области (также известной как гиперкуб) это было бы очень просто. Но у вашей функции есть особенность 1/y, для этого потребуется какая-то адаптивная сетка и контроль ошибок. Математика этого вне меня. - person janismac; 10.06.2016