我有一些数据让我们说以下向量:
[1.2 2.13 3.45 4.59 4.79]
我想得到一个多项式函数,比如f
拟合这个数据。因此,我想使用类似polyfit
. 但是,polyfit
所做的是最小化最小二乘误差之和。但是,我想要的是拥有
f(1)=1.2 f(2)=2.13 f(3)=3.45 f(4)=4.59 f(5)=4.79
也就是说,我想操纵拟合算法,以便它会给我已经给出的精确点以及一些没有给出精确值的拟合值。我怎样才能做到这一点?
我有一些数据让我们说以下向量:
[1.2 2.13 3.45 4.59 4.79]
我想得到一个多项式函数,比如f
拟合这个数据。因此,我想使用类似polyfit
. 但是,polyfit
所做的是最小化最小二乘误差之和。但是,我想要的是拥有
f(1)=1.2 f(2)=2.13 f(3)=3.45 f(4)=4.59 f(5)=4.79
也就是说,我想操纵拟合算法,以便它会给我已经给出的精确点以及一些没有给出精确值的拟合值。我怎样才能做到这一点?
我认为每个人都没有抓住重点。你说“也就是说,我想操纵拟合算法,以便我给我精确的点以及一些不存在精确拟合的拟合值。我该怎么做?”
对我来说,这意味着您希望对列出的集合进行精确(插值)拟合,而对于其他一些点,您希望进行最小二乘拟合。
您可以使用 LSQLIN 做到这一点,方法是在点上设置一组等式约束以精确拟合,然后允许其余点以最小二乘法拟合。
问题是,这将需要一个高阶多项式。为了能够准确地拟合 5 个点,再加上一些其他点,多项式的阶数会高很多。高阶多项式,尤其是那些有约束点的多项式,会做一些讨厌的事情。但是你可以随意做你想做的事,只要你也期待一个糟糕的结果。
编辑:我应该补充一点,一个更好的选择是使用最小二乘样条,这是你可以限制通过一组给定点的东西,同时以最小二乘的方式拟合其他点,并且仍然不会做一些疯狂和疯狂的事情因此。
你有选择。
使用 polyfit,只要给它足够的余地来执行精确拟合。那是:
values = [1.2 2.13 3.45 4.59 4.79];
p = polyfit(1:length(values), values, length(values)-1);
现在
polyval(p,2) %returns 2.13
使用插值/外推
values = [1.2 2.13 3.45 4.59 4.79];
xInterp = 0:0.1:6;
valueInterp = interp1(1:length(values), values, xInterp ,'linear','extrap');
插值提供了很多平滑、外插等选项。例如,尝试:
valueInterp = interp1(1:length(values), values, xInterp ,'spline','extrap');
你问的是拉格朗日插值法。有一个 MATLAB 文件交换可用。http://www.mathworks.com/matlabcentral/fileexchange/899-lagrange-polynomial-interpolation
但是,您应该注意,最小二乘多项式拟合通常比拉格朗日插值更可取,因为您拥有的数据原则上会有噪音,并且拉格朗日插值将适合噪声以及您拥有的数据。因此,如果您知道您的数据实际上表示 M 维多项式并且有 N 个数据,其中 N>>M,那么您将有一个带有拉格朗日的 N 阶多项式。
Polyfit 可以满足您的需求。N-1 次多项式可以精确拟合 N 个点,因此,当它最小化平方误差之和时,它得到 0(这就是你想要的)。
y=[1.2 2.13 3.45 4.59 4.79];
x=[1:5];
coeffs = polyfit(x,y,4);
会给你一个通过你所有点的多项式。