У меня возникла проблема из-за того, что переменная limit и неявная функция вместе.
Итак, давайте упростим это до этого:
s(y)=y - наша "неявная" функция
Int[Int(x*s(y)*dy, 1,x)*dx, 1, 2] — наш двойной интеграл (равный 9/8).
(Так что вы можете даже разделить на 2 интеграла I_small= s(y)dy и I=I_small * x*dx)
Все, что я понял:
1) Пробовал использовать quad2d (поэтому проблем с переменным limit нет) - но не могу поставить в него корень неявной функции. Так что это работает для неявной функции:
function main
quad2d(@myfun,1,2,1,@(x)x)
end
function value=myfun(x,y)
value=x.*y;
end
Но для неявного я пробовал это - и это не работает. Я знаю, что с этим кодом что-то не так - Matlab не понимает, что аргумент "y" в имени функции и "y" в самой функции совпадают. Но не знаю, как это исправить.
function main
quad2d(@myfun,1,2,1,@(x)x)
end
function value=myfun(x,y)
f=@(s,y)s-y;
value=x.*fzero(@(s)f(y,s), 0.5);
end
2) Этот код решает противоположное I = s(x).*y, и я не могу понять, как переключить x на y, потому что fzero не работает, если я помещаю в него y вместо x(j)
function main
quad(@myfun, 0,1)
end
function z=myfun(x)
z=zeros(size(x));
f=@(x,s) s-x;
for j=1:length(x);
s(j)=fzero(@(s)f(x(j),s), 0.5);
h=@(y) (s(j).*y);
z(j)=quad(h,1,x(j));
end
end
3) Я также пробовал вложенные квады, но они работают только с постоянными ограничениями. Не могу понять, как вместо Upperlimit поставить @(x)x.
function main
quad(@(y)y.*first_int(2),1,2)
end
function value=first_int(UpperLimit)
value=quad(@(x)yfunction(x,1),1,UpperLimit);
end
function value=yfunction(x,l)
syms y;
f=@(x,y) l.*x-y;
for k=1:length(x)
value(k)=fzero(@(y)f(x(k),y), 0.5);
end
Не могли бы вы, ребята, помочь с этим?
integral2? Вы также можете попробовать символьную математику черезint. - person horchler   schedule 08.01.2016