Двойной интеграл с переменными пределами по неявной функции в MATLAB

У меня возникла проблема из-за того, что переменная 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

Не могли бы вы, ребята, помочь с этим?


person Feels Good Man    schedule 08.01.2016    source источник
comment
Я не понимаю, что на самом деле представляет собой функция, которую вы пытаетесь решить. И есть ли причина, по которой вы не используете integral2? Вы также можете попробовать символьную математику через int.   -  person horchler    schedule 08.01.2016
comment
реальная функция s(y) является неявной и выглядит как const1/y^2=erf(s)+s/const2. Чтобы проверить правильный ответ, я использую простой s(y)=y. Поэтому я не могу использовать int, поскольку он символический, и вы не можете символически решить неявную функцию. Да, спасибо, я буду использовать Integer2 - думал, что quad2d - единственный, который численно интегрирует double int.   -  person Feels Good Man    schedule 09.01.2016


Ответы (1)


Команда quad2d (как и ее современный и лучший аналог integral2) требует, чтобы интегрируемая функция принимала матрицы в качестве входных данных.

Функция Z=FUN(X,Y) должна принимать двумерные матрицы X и Y одинакового размера и возвращать матрицу Z соответствующих значений.

С другой стороны, fzero решает только одно уравнение, а не всю их кучу сразу. Итак, чтобы ваша неявная функция могла принимать матричные входные данные, ее нужно написать с помощью цикла:

function value = myfun(x,y)
    f=@(s,y)s-y;
    value = zeros(size(x));   
    for i=1:size(x,1)
        for j=1:size(x,2)
            value(i,j) = x(i,j)*fzero(@(s) f(y(i,j),s), 0.5);
        end
    end
 end

Тогда quad2d(@myfun,1,2,1,@(x)x) или integral2(@myfun,1,2,1,@(x)x) будут работать.

person Community    schedule 09.01.2016
comment
Благодарю вас! Теперь мне ясно. Вы сэкономили мне часы! - person Feels Good Man; 09.01.2016