我有一组x和y值,我想要拟合多项式曲线。该函数应采用最多9阶多项式的形式;
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 :(得分:2)
您有两个单独的请求。
对于无约束拟合,您根本不需要任何函数,问题是线性的,mrdivide
和/或pinv
在最小二乘意义上给出最佳拟合:
a = y / bsxfun(@power, x, 1:9);
或
a = y * pinv(bsxfun(@power, x, 1:9));
如果系统不受约束,其中一个将在l2-norm意义上给出“小”解,另一个在l0-norm意义上。如果系统完全或过度约束,它们都会给出a
的值,以最小化积分平方误差(l2-norm)。
对于约束拟合,您已发现的lsqcurvefit
函数运行良好。只需将lb
参数设置为零向量即可强制a
为非依赖性:
a = lsqcurvefit(@polyval,a0,X,y,zeros(1,9));
答案 1 :(得分: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
来评估p
值向量上的多项式x
。