【问题标题】:matlab optimization toolbox - polynomial fittingmatlab优化工具箱——多项式拟合
【发布时间】:2014-10-28 21:04:10
【问题描述】:

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

【问题讨论】:

  • 抱歉,功能代码应该写成X,它写着redCO2
  • 如果您可以访问它,曲线拟合工具箱可能会是您尝试做的更好的工具。

标签: matlab optimization constraints curve polynomials


【解决方案1】:

您有两个单独的请求。

对于无约束拟合,您根本不需要任何函数,问题是线性的,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));

【讨论】:

  • 非常感谢 - 这解决了我的第二个问题。干杯!
【解决方案2】:

只需使用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

【讨论】:

  • 感谢您的帮助。但是,我不知道每种情况下的“n”是什么。因此,我为什么要使用优化工具箱。
  • 如果您不知道次数,您希望如何找到多项式系数?您可以尝试各种方法并使用 [p,S] = polyfit(x,y,n) 语法,它还会返回一个结构 S,它将告诉您有关拟合优度的更多信息。检查文档。
  • @user3491279:使用n=9,最大订单。如果低阶多项式更好,您可以在答案中得到零。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
  • 2015-06-27
  • 2019-05-23
  • 1970-01-01
相关资源
最近更新 更多