拟合的“ linearinterp”的Matlab集成返回错误“第一个输入参数必须是函数句柄”

时间:2019-06-14 15:13:37

标签: matlab integral integrate linear-interpolation

试图获得一些实验收集的数据的积分。

在使用了信封和abs函数之后,我使用了fit函数来获取我想要积分的方程式(不幸的是'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搞砸了,我仍然会收到该错误。

TIA

1 个答案:

答案 0 :(得分:2)

  • 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 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有一个表达式   表达不正确。