matlab中的integral2的正确函数句柄

时间:2013-09-17 18:33:35

标签: matlab function integral

我在matlab中创建了一个函数,它返回一个像

这样的向量
function w = W_1D(x,pos,h)
w=zeros(1,length(x));
        if (h~=0)
            xmpos = x-pos; 
            inds1 = (-h <= xmpos) & (xmpos < 0);
            w(inds1) = xmpos(inds1)./h + 1;
            inds2 = (0 <= xmpos) & (xmpos <= h);
            w(inds2) = -xmpos(inds2)./h + 1;
        else
            error('h shouldn't be 0')
        end
 end

因此,最后,有一个大小为w的向量length(x)。 现在我创建了第二个函数,如

function f = W_2D(x,y,pos_1,pos_2,h)
  w_x = W_1D(x,pos_1,h);
  w_y = W_1D(y,pos_2,h);
  f = w_x'*w_y;
end

其中length(x)=length(y)。因此,函数W_2D显然返回一个矩阵。 但是,当我现在尝试评估矩形域上的积分时,例如

V = integral2(@(x,y) W_2D(x,y,2,3,h),0,10,0,10);

matlab返回一些错误:

Error using integral2Calc>integral2t/tensor (line 242)
Integrand output size does not match the input size.

Error in integral2Calc>integral2t (line 56)
[Qsub,esub] = tensor(thetaL,thetaR,phiB,phiT);

Error in integral2Calc (line 10)
[q,errbnd] = integral2t(fun,xmin,xmax,ymin,ymax,optionstruct);

Error in integral2 (line 107)
Q = integral2Calc(fun,xmin,xmax,yminfun,ymaxfun,opstruct);

我还试图改变W_2D - 函数中的某些内容:而不是f = w_x'*w_y; 我试过f = w_x.'*w_y;w_y = transpose(w_y); f = kron(w_x,w_y);,但Integrand输出大小的东西总是存在这个错误。 谁能解释一下,我的错在哪里?

编辑:在Werner用键盘调试方法提示后,我可以告诉你以下内容。 第一步返回w_x类型的<1x154 double>w_y<1x192 double>xy均为<14x14 double>。在下一步中,f的值为<154x192 double>。然后一切都消失了,除了xy,matlab函数integral2Calc.m出现在编辑器中,它跳转到函数调用堆栈integral2t/tensor,经过一些更多步骤后,错误发生这里

    Z = FUN(X,Y);  NFE = NFE + 1;
    if FIRSTFUNEVAL
        if ~isfloat(Z)
            error(message('MATLAB:integral2:UnsupportedClass',class(Z)));
        end
        % Check that FUN is properly vectorized. This is important here
        % because we (otherwise) always pass in square matrices, which
        % reduces the probability of the user generating an error by
        % using matrix functions instead of elementwise functions.
        Z1 = FUN(X(VTSTIDX),Y(VTSTIDX)); NFE = NFE + 1;
        if ~isequal(size(Z),size(X)) || ~isequal(size(Z1),size(VTSTIDX))
            % Example:
            % integral2(@(x,y)1,0,1,0,1)
            error(message('MATLAB:integral2:funSizeMismatch'));
        end

希望信息足够详细......我不知道发生了什么,因为我的例子与mathworks网站上关于integral2的内容完全相同,不是吗?

也许我应该更精确一点,我想做什么:因为W_2D给了我一个紧凑支持的二维帽函数的表面w(x,y),存储在矩阵w中,我想要计算(x,y)平面和表面之间的体积z = w(x,y)...

EDIT2:我仍然不明白如何处理这个问题,integral2创建矩阵作为我的W_1D函数的输入,这些函数在W_2D中调用并打算有一个<1xn double> - 值输入并返回<1xn double>输出,但至少我可以使用以下内容通过使用两个一维integral调用来解决张量积上的积分,是

V = integral(@(x)integral(@(y)W_1D(y,3,h),0,10).*W_1D(x,2,h),0,10);

1 个答案:

答案 0 :(得分:1)

这第一个功能是非常错误的。当你在里面w = x时,你没有索引数组位置。

此外,如果这样可行,则返回行向量,即大小1xlength(x),当你执行w_x'* w_y时,你正在length(x)x11xlength(y),会给你一个矩阵length(x)*length(y)

考虑更正你的功能:

function w = W_1D(x,pos)
   w = zeros(length(x),1); % Allocate w as column vector, so that the product gives a scalar (as I suppose that it is what you want.
   for ii=1:length(x) % Here, so that is indexes w and x elements as you need
       w(ii)=x(ii) - pos; % I changed your code to something that makes sense, but I don't know if that is what you want to do, you have to adapt it to work correctly.
   end
end

您可能还想调试您的功能,考虑在操作之前添加keyboard,并使用dbstep检查他们返回的内容。即:

function f = W_2D(x,y,pos_1,pos_2)
  w_x = W_1D(x,pos_1);
  w_y = W_1D(y,pos_2);
  keyboard
  f = w_x'*w_y;
end

执行将在keyboard处停止,然后您可以检查w_x尺寸,w_y尺寸,然后执行dbstep以追查f = w_x'*w_y,看看它是什么回。完成调试后,您可以执行dbcont,以便继续执行。

这个答案是一个草案,因为很难帮助您提供所提供的信息。但我认为你可以用这个开始解决问题。如果您有更多疑虑,请随时提出。