0

我有一组 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);

4

2 回答 2

2

您有两个单独的请求。

对于无约束拟合,您根本不需要任何函数,问题是线性的mrdivide和/或pinv给出最小二乘意义上的最佳拟合:

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

或者

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

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

对于约束拟合,lsqcurvefit您已经发现的函数运行良好。只需将lb参数设置为零向量即可强制a为非负数:

a = lsqcurvefit(@polyval,a0,X,y,zeros(1,9));
于 2014-10-28T21:24:21.830 回答
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评估多项式。px

于 2014-10-28T21:15:21.907 回答