集成一个不直接按元素操作的函数

Integrate a function that doesn't directly operate element-wise

我正在编写涉及四阶张量计算体积积分的 Matlab 脚本。设 H(r,theta,phi) 为我要积分的函数。假设H不能通过对r、theta、phi的简单运算得到。

我的问题是在 Matlab 中和在我知道的任何其他代码中一样:

All input functions must accept arrays and operate elementwise. The function FUN(X,Y,Z)
must accept arrays X, Y, Z of the same size and return an array of corresponding values.

这是来自 Matlab integral3 function 的实现。

如果我尝试使用这个简单的函数:

fun = @(X,Y,Z) X.*Y.*Z

完全没有问题,如果我在 [0,1] x [0,1] x [0,1] 上积分它,我会得到正确的结果:

integral3(fun,0,1,0,1,0,1)

returns 0.125 这是正确的。

问题是,正如我所说,我无法用向量执行简单的计算来获得 H,我或多或少被迫以这种方式做事:

function [result] = fun(x,y,z)
    sz = length(x);
    result  = zeros(1,sz);
    for i=1:sz
        result(i) = x(i)*y(i)*z(i);
    end
end

这个函数独立运行,returns 与我之前介绍的另一个函数的结果完全相同。但是,当我尝试使用 integral3 时出现此错误:

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

但是从我函数的定义中可以清楚的看出,我特地把它设为了输入的大小

我不明白哪里出了问题,而且我不确定除了使用这种语法之外我还有其他解决方案来计算这个函数。

非常感谢您的宝贵时间和帮助:)

您的方向是正确的,但是您正在构建一个长度正确但大小错误的数组。这是 Matlab 中的细微差别。我猜 integral3 正在传递一个列向量,但你的函数总是 returns 一个行向量。列向量和行向量相同"length"sz,但不同"sizes":列向量为[sz,1],行向量为[1,sz]。下面的代码可以满足您的需求,因为它使用 size 来确保输出的所有维度都与输入匹配,并使用 numel 来循环各个元素:

function result = fun(x,y,z)
    sz = size(x);
    result = zeros(sz);
    for i = 1:numel(x)
        result(i) = x(i)*y(i)*z(i);
    end
end

一个好的经验法则是只使用 sizenumel 而永远不要使用 length,这是 Matlab 中最差函数的竞争者。