【问题标题】:correct function handle for integral2 in matlabmatlab中integral2的正确函数句柄
【发布时间】:2013-09-17 18:33:35
【问题描述】:

我在 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

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

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-function 中更改某些内容:而不是 f = w_x'*w_y; 我试过f = w_x.'*w_y;w_y = transpose(w_y); f = kron(w_x,w_y);,但积分输出大小的东西总是存在这个错误。 谁能解释一下,我的错在哪里?

编辑:在 Werner 用键盘调试方法提示之后,我可以告诉你以下内容。 第一步返回w_x类型为&lt;1x154 double&gt;w_y&lt;1x192 double&gt;xy都是&lt;14x14 double&gt;。在下一步中,f 出现,其值为 &lt;154x192 double&gt;。然后一切都消失了,除了 xy 和 matlab-function 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 中调用并打算有一个&lt;1xn double&gt; 值输入并返回一个&lt;1xn double&gt; 输出,但至少我可以简单地使用以下方法通过使用两个一维integral-调用来解决张量积上的积分,即

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

【问题讨论】:

  • 它创建了一个矩阵,因为从 X 和 Y 矩阵中取出的每两个点都是网格空间中的一个点。如果你想要的话,你可以只使用 X 和 Y 中的列和行来在你的函数上使用它。

标签: matlab function integral


【解决方案1】:

第一个函数是完全错误的。当您在内部执行 w = x 时,您没有索引数组位置。

此外,如果这样可行,您将返回一个线向量,即大小 1xlength(x),当您执行 w_x'*w_y 时,您正在执行 length(x)x1 乘以 1xlength(y),这将为您提供一个矩阵 @ 987654325@.

考虑修正你的功能:

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 使其继续执行。

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

【讨论】:

  • 非常抱歉,但我认为让示例函数尽可能简短会更好,并没有认识到大错误。现在有我正在使用的实际功能。
  • @Mr.Kitopa 这个 matlab 行给了你一个提示:if ~isequal(size(Z),size(X)) || ~isequal(size(Z1),size(VTSTIDX))。看起来,您的函数应该返回一个14x14 矩阵,即 Z(如果我是对的,它是您的函数返回的矩阵)应该与 X 和 Y 输入具有相同的大小。因此,在计算 w 时应该小心,以便在函数中为每个 xy 输入一个值。
  • 请您再解释一下好吗?我不知道,当我想从两个输入向量生成一个输出矩阵时,我怎么能有一个返回两个值的函数。这意味着,例如对于 x(i) 和 y(j) 对,应该有一个值 w(i,j)。我可以用两个 for 循环来管理它,但我认为,张量积正好做到了这一点并且速度更快(因为矢量化)......或者我磨损了吗?
  • @Mr.Kitopa 正如你自己所说,x 和 y 都是 ,输入不是向量,它们是用于估计积分的所有网格点的矩阵。我认为您的函数应该做的是返回一个 矩阵,该矩阵表示该网格的函数答案,但您返回的是一个 矩阵。因此,您需要同时使用这两个函数,以便它与输入的 14x14 网格点一起使用,以返回一个大小相同且有意义的答案网格(有意义我的意思是该函数表示它应该为此)。
  • 嗯,好的,现在我明白了。但是,integral2 怎么可能使 xy 成为 nxn 矩阵,而在 W_1D 中它们只是 1xn 向量?在W_2D 中,我调用返回向量的一维函数...
猜你喜欢
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-30
  • 1970-01-01
相关资源
最近更新 更多