Октавная ошибка числовой интеграции при попытке использовать как именованные функции, так и дескрипторы функций - PullRequest
0 голосов
/ 07 июня 2019

Моя проблема в том, что я получаю сообщение об ошибке: «подынтегральное выражение F должно возвращать один вектор с действительными значениями того же размера, что и входные данные», даже если подынтегральное выражение возвращает такой вектор.

Я вызываюследующее в функции:

Vsame = @(x) Vsame_fit(x./lB);
F0011 = @(x) (1-(x.^2)/2).*exp(-(x.^2./2));
integ_F0011same = @(x) F0011(x).*Vsame(x);
integ_F0011same(linspace(1,3,10))
Fsame(1,1,2,2) = quadcc(integ_F0011same,0,Inf);

Я определил константу lB в другом месте.Вне этой функции я определил Vsame_fit:

function y = Vsame_fit(q)
    for k=1:length(q)
        if q(k)<0.022913
            y(k) = 0.98*tanh(200*q(k));
        elseif q(k)<0.50274
            y(k) = 1/(0.9*q(k)+1);
        elseif q(k)<21.598
            y(k) = 1/(1.046*q(k)+0.9266);
        else
            y(k) = 1/(0.9512*q(k)+2.89);
        end
    end
end

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

integ_F0011same(linspace(1,3,10))

внутри функции, возвращается 10-элементный элемент, как и ожидалось.Почему я получаю эту ошибку?В конце концов, я просто хочу получить значение интеграла, которое, как я надеялся, будет сохранено в Fsame (1,1,2,2).Причина, по которой я определил вещи с таким большим количеством отдельных функций, заключается в том, что я повторно использую Vsame еще три раза для оценки похожих интегралов, например,

integ_F0110same = @(x) F0110(x).*Vsame(x);
Fsame(1,2,2,1) = quadcc(integ_F0110same,0,Inf);

, где F011 (x) также был определен с помощью дескриптора функции.Есть ли лучший способ, которым я должен делать это?

...