Matlab интегрирует встроенную «linearinterp», возвращая ошибку «Первый входной аргумент должен быть дескриптором функции» - PullRequest
0 голосов
/ 14 июня 2019

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

После использования функций envelope и abs я использую функцию подгонки, чтобы получить уравнение, которое я хочу интегрировать (к сожалению, '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' в случае, если что-то не так с linearinterp, я все равно получаю эту ошибку.

ТИА

1 Ответ

2 голосов
/ 14 июня 2019
  • f является функцией, но ее типом является cfit not дескриптор функции .

  • 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) Что также делает ... 'Array-valueed', 1)?Это не сработало, пока я не вставил это, поэтому он должен что-то делать

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

Задача для функции 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 enter image description here


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


...