Интегрируйте функцию, которая не работает напрямую по элементам

Доброе утро/день/вечер,

Я работаю над сценарием Matlab, который включает в себя тензоры четвертого порядка вычисления интегралов объема. Пусть H (r,theta,phi) - функция, которую я хочу интегрировать. Предположим, что H не может быть получен простыми операциями над r, тета и 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.

это от реализации функция integral3 от Матлаб.

если я попытаюсь с этой простой функцией:

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

нет никаких проблем, и если я интегрирую его через [0,1] x [0,1] x [0,1] x [0,1], я получу правильный результат :

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

возвращает 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

эта функция работает сама по себе и возвращает те же результаты, что и в предыдущем примере. Однако, когда я пытаюсь использовать integral3, я получаю эту ошибку:

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

но из определения моей функции ясно видно, что я специально сделал ее размером ввода.

Я не понимаю, что не так, и я не уверен, что у меня есть какое-либо другое решение для вычисления этой функции, чем использование такого синтаксиса.

Спасибо большое за ваше время и помощь :)

1 ответов


вы на правильном пути, но вы строите массив с правильной длиной, но неправильный размер. Это тонкое различие в 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

хорошее эмпирическое правило-использовать только size и numel и никогда не используйте length, который является претендентом на худшую функцию в Matlab.