Matlab含点积的二重积分报错问题及解决方法咨询
解决Matlab二重积分中向量点积的报错问题
问题根源
integral2会向被积函数传入网格形式的数组x和y(而非单个标量),要求被积函数的输出尺寸必须和输入x/y完全一致。你的代码中,f(x)不管输入x是标量还是数组,都返回固定的1×2向量,f(x)*f(y)'计算后得到1×1标量,和输入的数组尺寸不匹配,因此触发报错。
可行解决方案
方案1:让f函数适配数组输入,使用逐元素点积
修改f函数,使其返回和输入x/y同维度的向量数组,再通过逐元素相乘后求和实现点积,保证输出尺寸和输入一致:
% 定义适配数组输入的f:每个x元素对应一个[1,0]向量,存储为三维数组 f=@(x) cat(3, ones(size(x)), zeros(size(x))); % 计算逐元素点积:沿第三维度求和得到和输入同尺寸的标量数组 integral2( @(x,y) sum(f(x).*f(y), 3), 0,1,0,1 );
方案2:使用arrayfun逐元素计算(适合f仅支持标量输入的场景)
如果你的f函数只能处理标量输入,用arrayfun对每个(x,y)对单独计算点积,输出和输入同尺寸的数组:
f=@(x) [1,0]; integral2( @(x,y) arrayfun(@(xi,yi) f(xi)*f(yi)', x, y), 0,1,0,1 );
注意:这种方法效率较低,仅推荐用于无法修改f函数的情况。
方案3:利用dot函数的维度参数(简化写法)
如果f返回的是二维数组(每行对应一个向量),可以用dot函数指定求和维度:
% f返回每行对应x元素的向量,行数和x的行数一致 f=@(x) repmat([1,0], size(x,1), 1); % 沿第二维度求和,得到和x同行数的列向量 integral2( @(x,y) dot(f(x), f(y), 2), 0,1,0,1 );
验证结果
以上三种方案运行后都会返回正确结果1,符合预期的二重积分计算结果。
内容的提问来源于stack exchange,提问作者Matt Majic
相关产品推荐
相关产品推荐

