首页 > 解决方案 > Matlab集成拟合的“linearinterp”返回错误“第一个输入参数必须是函数句柄”

问题描述

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

在使用了信封和 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

标签: matlabintegralintegratelinear-interpolation

解决方案


  • 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) ... 'Array valued', 1) 也有什么作用?直到我把它放进去它才起作用所以它必须做点什么

f分段函数f,下图是基于2 分段线性函数的假设,但它也可以用于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()函数 knownsf 有多个表达式,省略它意味着f有一个不正确的表达式。



推荐阅读