2014-10-28 99 views
0

我有一组x和y值,我想要拟合一个多项式曲线。函数应该采用高达9阶多项式的形式;matlab优化工具箱 - 多项式拟合

y = a(1)*X.^1 + a(2)*X.^2 + a(3)*X.^3 + a(4)*X.^4 + a(5)*X.^5 + a(6)*X.^6 + a(7)*X.^7 + a(8)*X.^8 + a(9)*X.^9;

其中a(n)为我的系数。

我有两个问题。该曲线可能并不总是采用9阶多项式的形式。它可能是一个3阶,6阶或其他任何东西(最多9阶)。

我不确定如何使用优化工具箱进行设置。有任何想法吗?

其次,我可以设置一个约束,以便计算的y值总是正的吗?

非常感谢,

当前代码在下面。

功能;

function F = polyfun(a,redCO2) 
 
F = a(1)*redCO2.^1 + a(2)*redCO2.^2 + a(3)*redCO2.^3 + a(4)*redCO2.^4 + a(5)*redCO2.^5 + a(6)*redCO2.^6 + a(7)*redCO2.^7 + a(8)*redCO2.^8 + a(9)*redCO2.^9;

F = @(a) polyfun(a,X); 
 

 
a0 = [100, 100, 100, 100, 100, 100, 100, 100, 100]; % Starting guess 
 

 
a = lsqcurvefit(@polyfun,a0,X,y);

+0

道歉,它说:redCO2 – user3491279 2014-10-28 21:05:25

+1

如果您可以访问它的功能代码应为X,曲线拟合工具箱大概会做一个更好的工具来用于你想要做的事情。 – MrAzzaman 2014-10-28 21:09:24

回答

2

您有两个单独的请求。

对于不受约束的配合,你不需要任何功能可言,问题是线性的,mrdivide和/或pinv给出了最小二乘意义上的最佳拟合:

a = y/bsxfun(@power, x, 1:9); 

a = y * pinv(bsxfun(@power, x, 1:9)); 

如果系统欠约束,其中一个将给出一个在l2范数意义上的“小”解,另一个在l0范数意义上。如果系统完全或过度受限,则它们都会给出值a,使积分平方误差(l2-范数)最小化。

对于约束拟合,您已经发现的lsqcurvefit函数效果很好。只需设置lb参数零向量强迫a是非neqgative:

a = lsqcurvefit(@polyval,a0,X,y,zeros(1,9)); 
+0

非常感谢 - 这解决了我的第二个问题。干杯! – user3491279 2014-10-28 22:33:50

1

只需使用polyfit,这正是它被设计为:

% Data you want to fit in x and y 
% n is the polynomial order of your choosing 
% the polynomial coefficients are returned in the vector p 
p = polyfit(x,y,n); 

然后可以使用polyval用于评估x值的矢量上的多项式p

+0

感谢您的帮助。然而,在每种情况下,我都不知道“n”是什么。因此,我想使用优化工具箱。 – user3491279 2014-10-28 21:24:07

+0

如果您不知道度数,您如何期望找到多项式系数?你可以尝试各种方法并使用'[p,S] = polyfit(x,y,n)'语法,该语法也返回一个结构体'S',它会告诉你更多关于拟合度的信息。检查文档。 – am304 2014-10-28 21:26:58

+1

@ user3491279:使用'n = 9',最大订单。如果低阶多项式更好,则可以在答案中得到零。 – 2014-10-28 21:29:35