A. 三次拟合和五次拟合的区别
三次拟合顾名思义更加精确一些 举个简单的例子 最小二乘法 二次拟合函数是f(x)=ax^2+bx+c 三次拟合函数是f(x)=ax^3+bx^2+cx+d 从公式来看,三次拟合能够更准确
B. matlab 三次拟合和二次拟合的区别
三次拟合顾名思义更加精确一些
举个简单的例子
最小二乘法
二次拟合函数是f(x)=ax^2+bx+c
三次拟合函数是f(x)=ax^3+bx^2+cx+d
从公式来看,三次拟合能够更准确的贴近真实的曲线
C. 曲线拟合 曲率计算
为了更清楚地说明问题,把回答做了更新,增加了解释部分。
数据点用(x_i,y_i)表示,
拟合曲线方程为:
y=e^(0.002707959454*x^2-0.2852803573*x+2.666852328);(-33<=x<=0)
e为自然对数的底,e=2.718281828459045……。
如果限定x的范围是[-33,0],那么,拟合出来,
最小曲率在x=-33处取得(曲率半径最大),为1.946756485*10^(-13);
最大曲率在x=0处取得(曲率半径最小),为0.01654934877。
根据问题的要求,这里计算出来的是曲率而非曲率半径。
由于所用的拟合曲线不同,得出的结论会稍有差异,不过差别不大,数量级应该会一致。
但是,如果所用的方法不同,并且做出的假设不一样,那么,结果可能会差别较大。
这里基于如下假定和考虑:
1、这些数据都是测量数据而非计算数据,换言之,承认这些数据存在误差。如果是计算数据,那么,可以直接计算曲率,而不用算出那么多组数据出来。从你给出的数据看,y值中各个数据不为0的数字大多只有两位,少数有3位,很多数据后面有很多个零,由此可以推断,实际的有效数字至多只有3位,误差应该在百分之几只有——这也是很普遍的情况,仪器仪表测量出来的数据,不可能那么多数据都有很多个0在后面,而且,目前,除了光电测量仪器测量时间的有效数字会很多——很准确以外(时间是目前能够测量最准确的物理量),绝大多数常用的数字测量仪表都只有三位或三位半(四位数字的测量仪表价格已经很昂贵了——不要误把三位半的数字仪表当成四位),指针式仪表的有效数字不会更多。提问者的最后一个数据“2300000”,如果按照正常的判断有效数字的方法,有七位有效数字,这不太可能——除非是重大科研项目,否则不会用那么准确的测量仪器(那样的话,这些数据都是保密的,提问者不可能带出来)。于是可以推知,要么是测量数据时记录不规范(不知道用科学计数法准确记录有效数字位数),要么是把录入到excell中的数据复制过来(已经看不出有效数字的位数了)。这样的话,后面的数据的绝大误差非常大,2300000的误差至少应该有5000,比起前面几个数据(30多),大了150多倍。如果不加处理,直接拟合的话,把他们的误差都看成一样,是不合适的。所以,这里也不是直接对数据点(x_i,y_i)用最下二乘法做拟合,而是对(x_i,lny_i)用最下二乘法做拟合,(后来想一想,对(x_i,lgy_i)拟合可能会更好一些)。
2、只考虑有数据的范围,即x在-33到0之间的情况,此范围之外没有测量数据,不便计算(即使计算出来也不准)。(拟合出来的结果是曲率随着x的减小不断减小——这里认为从0到-33是在减小而不是最大,那么如果不限定范围,最大值和最小值是不存在的)
3、根据数据的特点,拟合曲线是一条整体的曲线,而不是分段曲线。做出x~lnx的曲线(如附图一所示)可以看出,除了开始几个点(|x|较小时)之外,其余的数据点几乎都在一条直线上。如果是人工做图,基本上都会通过直线拟合该曲线,舍去前面几个数据点。但是,直线拟合的话,在|x|较小时会产生较大的误差,见附图四),在工程上,常常都用二次曲线拟合(结果见附图二)。所以,这里并没有单纯地用对数曲线拟合,而是用e^(a*x^2+b*x+c)的曲线拟合。如果要分段拟合,常常用样条曲线或是NURBS曲线拟合(工程上很少直接用三次曲线拟合,而是用样条曲线拟合,可以理解为在三次曲线分段拟合的基础上做了一点改进),计算量大很多。结果可能会差别大一点。从提问者给出的数据曲线来看,这些数据点连接起来并不光滑(除个别点以外,大致是光滑的),说明误差肯定是存在的。如果分段拟合,曲线严格通过每一个数据点(网友ha_2010_ha的做法),那样,拟合曲线的每一段都只依赖于附近几个数据点,而与其它数据点无关(这是样条曲线的性质),这样,如果局部几个数据都有误差,会导致这附近的曲线都受此误差的影响,导致结果不准确(因为不能充分利用数据)——另一方面,避免了y值很大的点对y值很小的点的影响,这也是一个好处了。如果可以确保所有数据都非常准确,误差很小,且各数据的数量级一致,往往会用样条曲线(三次样条曲线最常用)或是NURBS曲线(一般认为NURBS曲线比普通样条曲线更好一点)(特别是有很多“弯曲”的曲线,不适宜用一个函数整体来拟合),那么只要在AutoCAD上把这些点画出,用“Spline”拟合一下就可以了,曲线都严格通过每一个数据点,但是会发现,拟合出来的曲线有很多个“弯”,不知道这是不是提问者想要的结果(有些时候,特别是化学上,对这种“与众不同”的点很感兴趣)。只是在AutoCAD上拟合时,看不出曲线的表达式,计算曲率时麻烦一些。本人对Matlab不熟悉,不知道那里是否有样条曲线和NURBS曲线能够(感觉上应该有此功能)。
4、基于假定1,拟合曲线不一定会通过每一个数据点,而是通过最小二乘法,使得处理后的各个数据点(x,lny)与拟合曲线的距离之平方和最小。
5、另外一位网友ha_2010_ha给出了另外的拟合方式,是基于数据都很准确的假定下做出的(曲线过每一个拟合点),与此处计算的结果差别较大。这不是方法错误,而是基于不同的假定得出的结论不同而已。
6、如果需要更精确的结果,可以用高次曲线来拟合(x,lgy),从图五和图六可以看出,四次和五次曲线上的点与原来的数据点拟合得非常好。
以下是各种拟合方式下的曲率最值,从中可以看出,曲率的数量级都是一样的。如果要精确一点,可以采用四次或五次曲线的拟合结果。
曲线次数,对数种类,最大曲率,最小曲率
#一次,自然对数:0.02939653517,6.100957152*10^(-13)
#一次,常用对数:0.02939653428,6.100957344*10^(-13)
#二次,自然对数:0.01654934877,1.946756485*10^(-13)
#二次,常用对数:0.01654934725,1.946756287*10^(-13)
#四次,常用对数:0.01805898064,3.911154182*10^(-13)
#五次,常用对数:0.01835618491,3.897350975*10^(-13)
又及:
关于提问者的疑问:
y=f(x)的曲率计算公式为:
k=|y''|/(1+y'^2)^(3/2);
只要把拟合曲线的方程代入上市,计算出最大值和最小值即可。
由于原始数据跨越5个数量级,直接从总的数据图上是很难看出弯曲程度的。很容易错误地认为在x=-25左右弯曲程度最大。其实,只要分别做出局部数据图像,把相邻的几个点单独画出来,就可以看得比较清楚。(比如,把前面8个点描出来,就会发现,那里是弯曲最厉害的,而在x取30多时,弯曲程度很小。)
关于另外一位网友提到的几个问题:
另外一位回答者没有考虑误差的影响,误以为只要通过所有数据点,就是充分利用了数据,没有通过某个数据点就是没有利用数据。其实,通过最小二乘法算出来的拟合曲线参数是和每个数据都相关的。改变任何一个数据都会直接影响到整体结果,但是一个数据对拟合曲线的影响非常小,于是,即便个别数据误差大一点,也不会对整个拟合曲线参数有多大影响。由于各个数据点对拟合曲线总体的影响很小,因而对各数据点附件一段拟合曲线的影响也不大。
另外,对误差大小的判断还有误区,只考虑到了绝对误差,没有考虑相对误差。例如,在x=-31时,y=1090000,拟合曲线的误差如果达到10000,从绝对值看,确也不小;在x=-3处,y=36,误差假设为1,绝对误差也不大。但是,y=1090000时,即便误差达到10000,也不到千分之一,何况测量数据只有3为有效数字,测量误差都超过了100000,把计算误差较小到10000以下没有任何意义。而在y=36,测量误差大致为0.5,相对误差已经达到14%,远比y=1090000时的相对误差误差大很多。(举一个例子:南京长江大桥在江面上的正桥长1577米,从卫星上测量的误差大概5米;有直尺测量一只10厘米左右的铅笔,直尺最小刻度1毫米;那是不是测量直尺更准确呢?这个例子在以前的初中物理教科书上出现过。)(这也是这位网友没有理解为什么要在数量级跨度较大的情况下对数据取对数后再拟合(在y值较大的地方绝对误差会大很多),而不直接拟合(各个数据点的误差一视同仁地处理)——其实,在大学物理实验课程中,老师都会讲到如何处理数据。如果还不清楚,可参阅大学物理实验的指导书,一般在第一册中会提到。)
另外,通过三次样条插值,算出来,开始部分的曲率中,x=-3.46或-2.69时取得最大值5.17,并没有达到10。
提到误差,再多说几句。由于当x的绝对值较小时,测量误差很大,如果局部拟合,会导致局部误差很大。比如,x=-4时,y=37,测量误差大概在0.5左右(大一点可以认为是1),那么,实际值可能在36.5到37.5之间。假如把y=37换成36.5,那么重新计算一下,会发现,这一次,该点附件的最大曲率增大大了30.4%,为6.73,(取最大曲率的点也由-3.46变为-3.54,相差2.3%)即在其它数据点精确的情况下,仅仅考虑x=-4处这一个数据点的误差,就会发现实际的最大曲率值可能与计算值偏差达30%,如果考虑到其它几个点的误差,这个偏差还更大。估计在40~50%左右。在这么大的偏差的情况下,计算出来曲率大的地方,有可能实际曲率会小一些,计算出来曲率小的地方有可能实际曲率会大一些,由于计算偏差那么大,谁还能够确定哪里是曲率最大的地方哪里是曲率最小的地方?
另外,由样条曲线的局部性质,把x在-8到-33的那些数据点都去掉,只留下开始8个数据点,算出的结果是一样。也从另外一个角度看得出目前讨论的这个问题中,分段插值这种方法并没有充分利用到数据。(某些情况下,这也是一个优点,称为“局部稳定性”,可以参阅样条函数的书籍。目前国内有不少高校的计算数学专业都面向研究生开设了该课程,从国外引进了不少相关专着。)
以上如有错误,欢迎批评指正。
D. 知道一组数据,如何用matlab进行三次样条函数拟合
如下:
function
fit_tulun
%多项式拟合方式
x=linspace(0,4*pi,6);
y_jingque=sin(x);
%决定稀疏样本点数据
p_poly=polyfit(x,y_jingque,5);
x_poly_fit=linspace(0,4*pi,100);
y_poly_fit=polyval(p_poly,x_poly_fit);
%三次样条拟合方式
sp=csapi(x,y_jingque);
%求三次样条函数的导数.
s_diff=fnder(sp,1);
plot(x_poly_fit,y_poly_fit,'ko',x_poly_fit,y_poly_fit,'b:')
%plot(x_poly_fit,y_poly_fit,'b:')
hold
on
fnplt(sp,'r')
fnplt(s_diff,'c')
x1=linspace(0,4*pi,200);
plot(x1,sin(x1),'m','linewidth',1.8)
legend('多项式拟合样本点','多项式拟合曲线','三次样条拟合曲线','三次样条导数曲线','正弦曲线精确图形').
E. 实验数据曲线的拟合问题
曲线拟合基本上就是一个插值计算的过程,除了最小二乘法,其他插值方法也可以被用于曲线拟合。常用的曲线拟合方法还有基于RBF(Radial Basis Function)的曲线拟合和三次样条曲线拟合。最小二乘法方法简单,便于实现,但是如果拟合模式选择不当,会产生较大的偏差,特别是对于复杂曲线的拟合,如果选错了模式,拟合的效果就很差。基于RBF(Radial Basis Function)的曲线拟合方法需要高深的数学基础,涉及多维空间理论,将低维的模式输入数据转换到高维空间中,使得低维空间内的线性不可分问题在高维空间内变得线性可分,这种数学分析方法非常强大,但是这种方法不宜得到拟合函数,因此在需要求解拟合函数的情况下使用起来不是很方便。
样条插值是一种工业设计中常用的、得到平滑曲线的一种插值方法,三次样条又是其中用的较为广泛的一种。使用三次样条曲线进行曲线拟合可以得到非常高精度的拟合结果,并且很容易得到拟合函数,本节的内容将重点介绍三次样条曲线拟合的原理和算法实现,并通过一个具体的例子将三次样条函数拟合的曲线与原始曲线对比显示,体会一下三次样条曲线拟合的惊人效果
F. 三次多项式曲线拟合
>> x=[0.0 0.1 0.2 0.3 0.5 0.8 1.0]; %输入数组 >> y=[1.0 0.41 0.50 0.61 0.91 2.02 2.46]; >> f1=inline(poly2sym(polyfit(x,y,3))); %polyfit拟合得到系数,poly2sym由系数得到多项式,inline转换内联函数 >> f2=inline(poly2sym(polyfit(x,y,4))); >> plot(x,y,'*'); %绘散点图 >> for i=1:7 %text给各点做坐标标注,num2str转换数值为字符,strcat字符串连接 text(x(i),y(i)+0.1,strcat('(',num2str(x(i)),',',num2str(y(i)),')')); end; >> xlabel('x'); %给x轴做标注 >> ylabel('y'); >> figure; %打开新的绘图窗口 >> y1=f1(x); %用拟合得到的式子求y值,如果想要拟合曲线更光滑,可将x的值更细化 >> y2=f2(x); >> plot(x,y1,'-r*'); %绘3次拟合曲线图 >> for i=1:7 text(x(i),y1(i)+0.1,strcat('(',num2str(x(i)),',',num2str(y1(i)),')')); end; >> xlabel('x'); >> ylabel('y'); >> figure; >> plot(x,y2,'-bo'); %绘3次拟合曲线图 >> for i=1:7 text(x(i),y2(i)+0.1,strcat('(',num2str(x(i)),',',num2str(y2(i)),')')); end; >> xlabel('x'); >> ylabel('y');
G. matlab 3次曲线拟合,求解,悬赏50
参考代码:
xi = -1 + (0:10) * 0.2;
f = 1 ./ (1+25*xi.^2);
p = polyfit(xi,f,3);
x = -1 : 0.01 : 1;
y1 = 1 ./ (1+25*x.^2);
y2 = polyval(p,x);
plot(xi,f,'bo',x,y1,'b--',x,y2,'r');
legend('节点','函数f(x)','三次曲线拟合')
由图可见,三次曲线的拟合效果不理想。
H. 最小二乘法三次多项式曲线拟合 算法 MFC实现的 急用 万分感激
先求解一个
最小二乘问题
,即解一个
超定方程组
(得到
三次曲线
系数)
再用MFC中的画图函数离散的画出这个三次曲线(注意MFC中的坐标是矩阵坐标,也就是说原点位于左上角)
I. 最小二乘法三次多项式曲线拟合 算法 C++ 实现,该怎么处理
//最小二乘法
//x[n] y[n] 已知输入
//n输入点个数
//a[m] 返回m-1次拟合多项式的m个系数
//m 拟合多项式的项数,即拟合多项式的最高次为m-1
//dt[3] dt[0]返回拟合多项式与各数据点误差的平方和,
dt[1]返回拟合多项式与各数据点误差的绝对值之和
dt[2]返回拟合多项式与各数据点误差的绝对值的最大值
//
//拟合多项式的输出
//Y(x) = a0 + a1(x-X) + a2(x-X)^2 + …… am(x-X)^m
// 其中X为已知点x的平均值
******************************************/
#include "math.h"
void pir1(x,y,n,a,m,dt)
int n,m;
double x[],y[],a[],dt[];
{
int i,j,k;
double z,p,c,g,q,d1,d2,s[20],t[20],b[20];
for (i=0; i<=m-1; i++) a[i]=0.0;
if (m>n) m=n;
if (m>20) m=20;
z=0.0;
for (i=0; i<=n-1; i++) z=z+x[i]/(1.0*n);
b[0]=1.0; d1=1.0*n; p=0.0; c=0.0;
for (i=0; i<=n-1; i++)
{ p=p+(x[i]-z); c=c+y[i];}
c=c/d1; p=p/d1;
a[0]=c*b[0];
if (m>1)
{ t[1]=1.0; t[0]=-p;
d2=0.0; c=0.0; g=0.0;
for (i=0; i<=n-1; i++)
{ q=x[i]-z-p; d2=d2+q*q;
c=c+y[i]*q;
g=g+(x[i]-z)*q*q;
}
c=c/d2; p=g/d2; q=d2/d1;
d1=d2;
a[1]=c*t[1]; a[0]=c*t[0]+a[0];
}
for (j=2; j<=m-1; j++)
{ s[j]=t[j-1];
s[j-1]=-p*t[j-1]+t[j-2];
if (j>=3)
for (k=j-2; k>=1; k--)
s[k]=-p*t[k]+t[k-1]-q*b[k];
s[0]=-p*t[0]-q*b[0];
d2=0.0; c=0.0; g=0.0;
for (i=0; i<=n-1; i++)
{ q=s[j];
for (k=j-1; k>=0; k--)
q=q*(x[i]-z)+s[k];
d2=d2+q*q; c=c+y[i]*q;
g=g+(x[i]-z)*q*q;
}
c=c/d2; p=g/d2; q=d2/d1;
d1=d2;
a[j]=c*s[j]; t[j]=s[j];
for (k=j-1; k>=0; k--)
{ a[k]=c*s[k]+a[k];
b[k]=t[k]; t[k]=s[k];
}
}
dt[0]=0.0; dt[1]=0.0; dt[2]=0.0;
for (i=0; i<=n-1; i++)
{ q=a[m-1];
for (k=m-2; k>=0; k--)
q=a[k]+q*(x[i]-z);
p=q-y[i];
if (fabs(p)>dt[2]) dt[2]=fabs(p);
dt[0]=dt[0]+p*p;
dt[1]=dt[1]+fabs(p);
}
return;
}
J. 三次样条曲线拟合,折磨我啊
origin的analysis下有一项Non-linear curve fit,在那里面选fitting wizard,就可以找到常用的拟合公式,想要自己新建拟合公式的话,就选advanced fitting tool.