2016-06-10 2 views
0

Я пытаюсь интегрировать вложенные интегралы следующего вида:Несколько вложенных интегралы в 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) 

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

Error using integral (line 85)
A and B must be floating point scalars.

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

ответ

0

Аргументы диапазона для 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) 

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

+0

Привет, janismac, спасибо! Есть ли у вас какие-либо предложения или рекомендации о том, как я могу сделать свой собственный интегратор? Можно ли это сделать с помощью циклических функций? – SFfever

+0

Для ограниченной функции в прямоугольной области (ака гиперкуба) было бы реально легко. Но ваша функция имеет особенность '1/y', для этого потребуется некоторая адаптивная сетка и контроль ошибок. Математика этого выше меня. – janismac