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.