2013-05-10 99 views
2

我正在为我的数据拟合自定义函数。 获得合适的后,我想得到像我的合身功能的函数句柄,包括设置为适合发现的参数。 我知道我可以得到模型在MATLAB中获取拟合函数的函数句柄并分配拟合参数

formula(fit) 

,我可以用

coeffvalues(fit) 

得到的参数,但有没有简单的方法在一个步骤两者结合?

回答

3

这个小环将这样的伎俩:

x = (1:100).'; %' 
y = 1*x.^5 + 2*x.^4 + 3*x.^3 + 4*x.^2 + 5*x + 6; 
fitobject = fit(x,y,'poly5'); 

cvalues = coeffvalues(fitobject); 
cnames = coeffnames(fitobject); 
output = formula(fitobject); 

for ii=1:1:numel(cvalues) 
    cname = cnames{ii}; 
    cvalue = num2str(cvalues(ii)); 
    output = strrep(output, cname , cvalue); 
end 

output = 1*x^5 + 2*x^4 + 3*x^3 + 4*x^2 + 5*x + 6 

循环需要适应你的拟合系数的数量。

编辑:为了完全回答这个问题做了两处细微的修改。

fhandle = @(x) eval(output) 

返回一个函数句柄。其次,由你的程序给出的输出结果不起作用,因为功率操作读取^代替x,这显然可以被替换为

strrep(output, '^', '.^'); 
+0

谢谢工作得很好:-) – tim 2013-11-23 17:10:10

+1

谢谢,很好的答案,我用它作为我写的脚本的基础。可以做一些小的改进(例如,允许它适用于不同的函数,比如指数等):系数名称可以通过'coeffnames(fitobject)'来找到,系数的数量可以迭代可以通过'length(coeff)'(或其他各种可用字段)找到。 – Taylor 2014-05-03 18:59:05

0

您可以使用Matlab曲线拟合功能,polyfit

p = polyfit(x,y,n) 

所以,p包含多项式的系数,xy是功能的你想以适应坐标。 n是多项式的阶数。例如,n=1是线性的,n=2是二次的,等等。欲了解更多信息,请参阅此documentation centre链接。唯一的问题是你可能不想要多项式拟合,在这种情况下,你将不得不使用不同的方法。

哦,你可以使用计算的系数p一起重新评估多项式:

f = polyval(p,x); 

这里,f是在点x评估系数p多项式的值。

+1

我认为OP询问'fit'从曲线拟合工具箱(参见http://www.mathworks.co.uk/help/curvefit/fit.html)。 – am304 2013-05-10 10:14:02

+0

是的,我基本上想使用像polyval()一样的函数,但是对于自定义模型。 – lhcgeneva 2013-05-10 10:37:24