在MATLAB中对隐式函数的可变限制进行双积分

时间:2016-01-08 09:48:32

标签: matlab implicit quad

由于变量限制和隐含功能在一起,我遇到了问题。

所以让我们简化它:

  

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(因此没有可变限制的问题) - 但我不能将隐含函数的根放入其中。因此它可以用于非隐式函数:

 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,因为如果我将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

你们可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

命令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)将有效。