matlab - 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
解决方案
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
可能有多个表达式,这就是为什么我将 'ArrayValued
' 设置为true以便integral()
函数 knownsf
有多个表达式,省略它意味着f
有一个不正确的表达式。
推荐阅读
- database - 使用 ETL 工具 (Datasatge 11.7) 或任何其他方法将数据从 Vertica 复制到 Redis
- material-table - 限制材料表 1.36.2 上的选择数量?
- django - 提示:也许您的意思是引用该列
- asp.net-core - 如何将我的 Web 项目 A 中的外部布局应用到我的 Web 项目 B(asp net core)中?
- javascript - 从 JavaScript 传递 PowerShell 参数值
- python - 将字典映射到数据框,字典值为列表
- gradle - Kotlin 上 Gradle 脚本中的命令行问题
- azure - 每 10 分钟从 azure webjob 或 azure 函数创建 PDF 或 excel
- javascript - 如何通过 graphQL 和 AWS AppSync 发送 JSON 数组以将数据添加到 Dynamo Table?
- c# - WPF DataGrid - 如何在行编辑时连续显示一个按钮(检测编辑模式)?