Интегрируйте функцию, которая не работает напрямую по элементам
Доброе утро/день/вечер,
Я работаю над сценарием 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.