集成一个不直接按元素运算的函数

Exp*_*111 7 math matlab numerical-methods numerical-integration

早上好/下午好/晚上好,

我正在研究一个涉及四阶张量计算体积积分的Matlab脚本.设H(r,theta,phi)是我想要整合的函数.假设不能通过对r,theta和phi的简单操作来获得H.

我的问题是在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.
Run Code Online (Sandbox Code Playgroud)

这是来自Matlab 的integral3函数的实现.

如果我尝试这个简单的功能:

fun = @(X,Y,Z) X.*Y.*Z
Run Code Online (Sandbox Code Playgroud)

完全没有问题,如果我将它集成在[0,1] x [0,1] x [0,1]上,我得到了正确的结果:

integral3(fun,0,1,0,1,0,1)
Run Code Online (Sandbox Code Playgroud)

返回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
Run Code Online (Sandbox Code Playgroud)

这个函数独立工作,返回与我之前介绍的另一个完全相同的结果.但是,当我尝试使用integral3时,我收到此错误:

Error using integral2Calc>integral2t/tensor (line 241)
Integrand output size does not match the input size
Run Code Online (Sandbox Code Playgroud)

但从我的函数定义可以清楚地看出,我特意将其作为输入的大小.

我不明白什么是错的,我不确定我有任何其他解决方案来计算这个函数而不是使用这种语法.

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

drh*_*gen 4

您的方向是正确的,但是您正在构建一个长度正确但大小错误的数组。这是 Matlab 中的细微差别。我猜这integral3是传入一个列向量,但你的函数总是返回一个行向量。列向量和行向量具有相同的“长度” sz,但“大小”不同:列向量为[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
Run Code Online (Sandbox Code Playgroud)

一个好的经验法则是仅使用sizenumel且从不使用length,这是 Matlab 中最差函数的竞争者。