在 Matlab 中分段拟合具有不同数量奇点的不连续函数的简单方法
Easy way to piecewise fit in Matlab a discontinuous function with varying number of singularities
我有一些不连续的数据,我想一次对它们进行分段拟合,因为有一个拟合参数对函数的所有部分都是通用的。
不连续点的数量和位置各不相同。
我考虑过使用 class 并将不连续性索引作为数据成员,然后使用具有不同输入数量的成员函数作为我发送给 Matlab 的拟合函数的函数。
例如
function f = approximate(obj,varargin)
f = zeros(size(varargin{1}));
for i = 1:nargin-3
x = varargin{1}(obj.segmentStartIdx(i):obj.segmentEndIdx(i));
f(obj.segmentStartIdx(i):obj.segmentEndIdx(i)) = varargin{2} + (0.25*(1-x/varargin{i+2}).^-2+x/varargin{i+2}-0.25);
end
end
显然,这不起作用...
配合
使用
fittype = ('fp.approximate(x,A,B,C)');
Matlab 抛出以下错误:
Error using fittype/testCustomModelEvaluation (line 12)
Expression fp.approximate(x,A,B,C) is not a valid MATLAB expression, has non-scalar coefficients, or cannot be evaluated:
Error in fittype expression ==> fp.approximate(x,A,B,C)
??? Attempt to reference field of non-structure array.
Error in fittype>iCreateFittype (line 371)
testCustomModelEvaluation( obj );
Error in fittype (line 328)
obj = iCreateFittype( obj, varargin{:} );
Error in fit>iFit (line 157)
model = fittype( fittypeobj, 'numindep', size( xdatain, 2 ) );
Error in fit (line 108)
[fitobj, goodness, output, convmsg] = iFit( xdatain, ydatain, fittypeobj, ...
Caused by:
Error using fittype/evaluate (line 102)
Error in fittype expression ==> fp.approximate(x,A,B,C)
??? Attempt to reference field of non-structure array.
尝试非成员函数并没有解决问题,但不确定我做错了什么......
我已将其简化为以下函数:
function [ f ] = moreArgTestFunc( p, xData )
f = zeros(size(xData));
global segmentStartIdx;
global segmentEndIdx;
for i = 1:length(p)-1
x = xData(segmentStartIdx(i): segmentEndIdx(i));
f(segmentStartIdx(i):segmentEndIdx(i)) = p(1) + (0.25*(1-x/p(i+1)).^-2+x/p(i+1)-0.25);
end
end
尝试在 NonLinearModel.fit 或 nlfit 中使用它会导致以下错误:
Error using moreArgTestFunc (line 2)
Not enough input arguments.
所以我可能在这里遗漏了一些东西...
有更好的方法吗?
调用 NonLinearModel.fit、fitnlm 或 lsqcurvefit 时,必须将函数指针作为参数传递。我认为传入函数名就足够了——但显然不是。
使用匿名函数
funcToFit = @(p,x) myfunctionName(p,x)
然后传递 funcToFit 而不是 myfunctionName 作为参数解决了问题。
通过对 p 使用不同大小的向量解决了要拟合的不同数量的参数。
我有一些不连续的数据,我想一次对它们进行分段拟合,因为有一个拟合参数对函数的所有部分都是通用的。 不连续点的数量和位置各不相同。
我考虑过使用 class 并将不连续性索引作为数据成员,然后使用具有不同输入数量的成员函数作为我发送给 Matlab 的拟合函数的函数。
例如
function f = approximate(obj,varargin)
f = zeros(size(varargin{1}));
for i = 1:nargin-3
x = varargin{1}(obj.segmentStartIdx(i):obj.segmentEndIdx(i));
f(obj.segmentStartIdx(i):obj.segmentEndIdx(i)) = varargin{2} + (0.25*(1-x/varargin{i+2}).^-2+x/varargin{i+2}-0.25);
end
end
显然,这不起作用... 配合
使用fittype = ('fp.approximate(x,A,B,C)');
Matlab 抛出以下错误:
Error using fittype/testCustomModelEvaluation (line 12)
Expression fp.approximate(x,A,B,C) is not a valid MATLAB expression, has non-scalar coefficients, or cannot be evaluated:
Error in fittype expression ==> fp.approximate(x,A,B,C)
??? Attempt to reference field of non-structure array.
Error in fittype>iCreateFittype (line 371)
testCustomModelEvaluation( obj );
Error in fittype (line 328)
obj = iCreateFittype( obj, varargin{:} );
Error in fit>iFit (line 157)
model = fittype( fittypeobj, 'numindep', size( xdatain, 2 ) );
Error in fit (line 108)
[fitobj, goodness, output, convmsg] = iFit( xdatain, ydatain, fittypeobj, ...
Caused by:
Error using fittype/evaluate (line 102)
Error in fittype expression ==> fp.approximate(x,A,B,C)
??? Attempt to reference field of non-structure array.
尝试非成员函数并没有解决问题,但不确定我做错了什么...... 我已将其简化为以下函数:
function [ f ] = moreArgTestFunc( p, xData )
f = zeros(size(xData));
global segmentStartIdx;
global segmentEndIdx;
for i = 1:length(p)-1
x = xData(segmentStartIdx(i): segmentEndIdx(i));
f(segmentStartIdx(i):segmentEndIdx(i)) = p(1) + (0.25*(1-x/p(i+1)).^-2+x/p(i+1)-0.25);
end
end
尝试在 NonLinearModel.fit 或 nlfit 中使用它会导致以下错误:
Error using moreArgTestFunc (line 2)
Not enough input arguments.
所以我可能在这里遗漏了一些东西...
有更好的方法吗?
调用 NonLinearModel.fit、fitnlm 或 lsqcurvefit 时,必须将函数指针作为参数传递。我认为传入函数名就足够了——但显然不是。 使用匿名函数
funcToFit = @(p,x) myfunctionName(p,x)
然后传递 funcToFit 而不是 myfunctionName 作为参数解决了问题。
通过对 p 使用不同大小的向量解决了要拟合的不同数量的参数。