Matlab интегрирует подогнанный linearinterp, возвращая ошибку. Первый входной аргумент должен быть дескриптором функции

Попытка получить интеграл некоторых экспериментально собранных данных.

После использования функций конверта и абс я использую функцию подгонки, чтобы получить уравнение, которое я хочу интегрировать (к сожалению, «poly» не дает достаточно точного соответствия данным):

[yupper,ylower] = envelope(signal,1000,'peak');

dat = abs(yupper);

f = fit(x,dat,'linearinterp');

Затем, когда я пытаюсь

q = integral(f,3e4,9e4);

Я получаю сообщение об ошибке:

Ошибка при использовании интеграла (строка 82) Первый входной аргумент должен быть дескриптором функции.

Ошибка в findenergyfromfitcurve (строка 10) q = integral(f,3e4,9e4);

Я думал, что f была (математической) функцией, не понимаю, о чем мне говорит ошибка. Когда я пытаюсь использовать 'poly3', если линейный интерпретатор все испортил, я все еще получаю эту ошибку.

ТИА


person user2587726    schedule 14.06.2019    source источник


Ответы (1)


  • f — это функция, но ее тип — cfit, а не дескриптор функции.

  • integral() требуется дескриптор функции, вы можете преобразовать cfit в дескриптор функции, прежде чем брать интеграл

Код выглядит следующим образом

x = rand(5,1);
dat = rand(5,1);
f = fit(x,dat,'linearinterp');

% Create a new function handle
f = @(x)f(x);

q = integral(f, 3e4,9e4,  'ArrayValued', 1)


2) Что делает ... «Значение массива», 1) также? Это не сработало, пока я не вставил это, так что это должно что-то делать

f — это кусочная функция, следующая иллюстрация основана на предположении, что f — это двухкусочная линейная функция, но ее можно использовать для n-кусочных функцию. введите здесь описание изображения

Задача для функции fit() найти параметры:

  • a
  • b
  • c
  • d
  • k

С точки зрения кода f выглядит так

function y = f(x,a,b,c,d,k)
    % PIECEWISELINE   A line made of two pieces
    % that is not continuous.

    y = zeros(size(x));

    % This example includes a for-loop and if statement
    % purely for example purposes.
    for i = 1:length(x)
        if x(i) < k
            y(i) = a.* x(i) + b;
        else
            y(i) = c.* x(i) + d;
        end
    end
end

Чтобы построить дескриптор функции, просто используйте fplot(f)

Вот график для f введите здесь описание изображения


Подводя итог, f, вероятно, имеет более одного выражения, поэтому я установил для 'ArrayValued' значение true, чтобы integral() известная функция f имела более одного выражения, опуская это означает, что f имеет одно выражение, которое не правда.


person Adam    schedule 14.06.2019
comment
Спасибо за это, но у меня есть 2 вопроса: 1) Почему я не могу построить f после того, как превратил его в дескриптор функции? Это работает до этой строки, я просто не думаю, что правильно понимаю дескрипторы функций. 2) Что делает ... «Значение массива», 1) также? Это не сработало, пока я не вставил это, так что это должно что-то делать... - person user2587726; 17.06.2019