㈠ 曲線擬合 曲率計算
為了更清楚地說明問題,把回答做了更新,增加了解釋部分。
數據點用(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個數據點,算出的結果是一樣。也從另外一個角度看得出目前討論的這個問題中,分段插值這種方法並沒有充分利用到數據。(某些情況下,這也是一個優點,稱為「局部穩定性」,可以參閱樣條函數的書籍。目前國內有不少高校的計算數學專業都面向研究生開設了該課程,從國外引進了不少相關專著。)
以上如有錯誤,歡迎批評指正。
㈡ 根據下面實驗數據求解擬合曲線 P(x)=a+bx+cx^2
數據擬合已完成,如圖所示,至於你想知道每一步代碼的意義,我想你還是需要深入學習matLab。
代碼如下:
>>clear;clc;
>>x=[1,2,3,4,6,7,8]';
>>y=[2,3,6,7,5,3,2]';
>>A=[ones(7,1)xx.^2];
>>G=A'*A;
>>g=A'*y;
>>a=Gg;
>>f=@(x)a(1)+a(2)*x+a(3)*x.^2;
>>fplot(f,[18]);
>>holdon
>>plot(x,y,'o');
你可以自己嘗試對比圖形,a中存放的為所需擬合的系數a,b,c,
他們分別為
-1.3182
3.4318
-0.3864
謝謝,望採納!
㈢ excel曲線擬合的方法
Excel 中經常需要使用到曲線擬合這個設置,曲線擬合具體該如何使用呢?下面是由我分享的excel曲線擬合的 方法 ,以供大家閱讀和學習。
excel曲線擬合的方法:
曲線擬合步驟1:把實驗數據輸入excel中,兩個變數的最好做成兩個豎排。選中所有數據,注意不要把文字也選上了。
曲線擬合步驟2:在菜單欄中點“插入”,然後選擇“散點圖”下面的下拉菜單。
曲線擬合步驟3:從菜單中選擇自己需要的類型,一般選擇既有數據點,又有平滑曲線的散點圖。就能得到平滑曲線。
曲線擬合步驟4:多項式擬合(線性,指數,冪,對數也類似):
選取數據;
插入,散點圖;
選擇只有數據點的類型;
就能得到第二張圖所示的數據點。
曲線擬合步驟5:點擊一個點,會選中所有數據點,然後點右鍵,在彈出的菜單中選擇“添加趨勢線”。
曲線擬合步驟6:在這里可以選擇需要你和的曲線類型,如線性,指數,冪,對數,多項式。。選擇多項式。
再把下面的“顯示公式”,“顯示R平方”的復選框里打√,就能得到需要的曲線,公式,和相對誤差。
曲線擬合步驟7:圖形格式設置:
生成圖形後還有一些問題,比如沒有坐標軸名稱,沒有刻度等。
打開菜單中的設計,點圖標布局中的下拉菜單。
曲線擬合步驟8:會看到有很多布局類型的圖標,選擇自己需要的。比如,圖中選的布局是常見的有標題,坐標軸名稱的。
曲線擬合步驟9:坐標軸還需要設置:用滑鼠點擊坐標軸附近的區域,右鍵,選擇“設置坐標軸格式”。
㈣ 求助曲線擬合方程
首先運行如下代碼,觀察散點圖的趨勢
clear
clc
x=[4 5 6 7 8 9 10 11 12,13,14,15,16,17,18,19,20];
y1=([0,2.6,3.2,4.1,5.3,6.7,8.6,11.,14.3,18.4,23.3,30.0,38.2,48.7,62.2,79.5,100])./100;
y2=([0,5.0,7.1,9.0,11.0,13.3,16.5,20.1,24.8,30.1,37.0,45.3,55.1,67.5,82.8,79.5,100])./100;
y3=([0,14.2,35.4,48.1,56.9,69.7,74.3,78.5,82.1,85.3,37.0,88.4,91.0,93.5,95.8,98.2,100])./100;
y4=([0,29.2,47.0,57.3,64.4,70.2,75.0,78.9,82.4,85.3,88.5,90.3,92.6,94.6,96.6,98.5,100])./100;
plot(x,y1,'+')
figure
plot(x,y2,'+')
figure
plot(x,y3,'+')
figure
plot(x,y4,'+')
可以看出前兩組數據呈現指數形式後兩組呈現對數形式。
輸入如下代碼:
clc
clear
x=[4 5 6 7 8 9 10 11 12,13,14,15,16,17,18,19,20];
y1=([0,2.6,3.2,4.1,5.3,6.7,8.6,11.,14.3,18.4,23.3,30.0,38.2,48.7,62.2,79.5,100])./100;
y2=([0,5.0,7.1,9.0,11.0,13.3,16.5,20.1,24.8,30.1,37.0,45.3,55.1,67.5,82.8,79.5,100])./100;
y3=([0,14.2,35.4,48.1,56.9,69.7,74.3,78.5,82.1,85.3,37.0,88.4,91.0,93.5,95.8,98.2,100])./100;
y4=([0,29.2,47.0,57.3,64.4,70.2,75.0,78.9,82.4,85.3,88.5,90.3,92.6,94.6,96.6,98.5,100])./100;
plot(x,log(y1),'+')
figure
plot(x,log(y2),'+')
figure
plot(log(x),y3,'+')
figure
plot(log(x),y4,'+')
分成兩組進行擬合
y1y2進行對數變換後,0是沒有對數變換的,所以去掉第一組數據,輸入如下代碼:
clc
clear
format long
x=[5 6 7 8 9 10 11 12,13,14,15,16,17,18,19,20];
y1=([2.6,3.2,4.1,5.3,6.7,8.6,11.,14.3,18.4,23.3,30.0,38.2,48.7,62.2,79.5,100])./100;
y2=([5.0,7.1,9.0,11.0,13.3,16.5,20.1,24.8,30.1,37.0,45.3,55.1,67.5,82.8,79.5,100])./100;
xs1=polyfit(x,log(y1),1)
xs2=polyfit(x,log(y2),1)
對於後面的y3y4無需提出0項,輸入如下代碼:
clc
clear
format long
x=[4 5 6 7 8 9 10 11 12,13,14,15,16,17,18,19,20];
y3=([0,14.2,35.4,48.1,56.9,69.7,74.3,78.5,82.1,85.3,37.0,88.4,91.0,93.5,95.8,98.2,100])./100;
y4=([0,29.2,47.0,57.3,64.4,70.2,75.0,78.9,82.4,85.3,88.5,90.3,92.6,94.6,96.6,98.5,100])./100;
xs3=polyfit(log(x),y3,1)
xs4=polyfit(log(x),y4,1)
得到的系數矩陣如下:
xs1 =
0.24605823124687 -4.90519940477608
xs2 =
0.19720975187994 -3.80687188880285
xs3 =
0.56693594930105 -0.67657470893038
xs4 =
0.54163093681900 -0.55598866144561
故得到擬合方程如下:
log(y1)=0.24605823124687.*x-4.90519940477608
log(y2)=0.19720975187994.*x-3.80687188880285
y3=0.56693594930105.*log(x)-0.67657470893038
y4=0.54163093681900.*log(x)-0.55598866144561
進行適當的代數變換就能得到擬合方程的標准形式,此處不累述。
值得主要的是log此處表示的是自然對數。
㈤ 計算方法用最小二乘法求形如y=a+blnx的函數來擬合下述
設f(x)=a+bln(x)
假定測量值為(x1,y1),(x2,y2),...(xn,yn)
則殘值的平方和為:g(a,b)=(f(x1)-y1)^2+(f(x2)-y2)^2+...+(f(xn)-yn)^2
先將g(a,b)看作a為自變數的函數(二次函數),其中的字母b當做參數,用配平方法求g(a,b)取最小值時對應的a=h(b),再將a=h(b)代入g(a,b),從而可得到一個新函數s(b),再求出與s(b)最小值對應的b,最後由a=h(b)得到a,完成。
㈥ 多項式插值和曲線擬合的計算方法
設日出時間t的函數為:t=ax3+bx2+cx+d(3、2是x的三次方和二次方),
5月1日: x=1, t=4又60分之51
5月16日:x=16,t=4.5
5月31日:x=31,t=4又60分之17
6月30日:x=61,t=4又60分之16
代入上面的函數,求出a、b、c、d的值,得出日出時間和日期的函數。二次求導可以求出t的最大值。
其它的自己做吧。
㈦ 如何根據一組離散點數據擬合出四次多項式曲線函數,並求曲線橫坐標為1:200的每一點斜率和曲線曲率
1、根據一組離散點數據擬合出四次多項式曲線函數,可以用regress——線性回歸函數來擬合。擬合方法:
x=[。。。];y=[。。。];
X=[ones(1,19) x x.^2 x.^3 x.^4];
a= regress(y,X); %擬合系數
擬合結果:
y=a1+a2*x+a3x^2+a4x^3+a5x^4
a1=0.0043519,a2=1.6277,a3=-0.012987,a4=0.00032848,a5=-6.3049e-06
㈧ 用程序計算一次物理實驗中得到的一組數據,分別選取拋物線函數模型和指數函數模型做曲線擬合
拋物線函數模型 y=A+B*x+C*x^2
x=[1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6 6.5 7 7.5 8];
y=[33.40 79.50 122.65 159.05 189.15 214.15 238.65 252.50 267.55 280.50 296.65 301.65 310.40 318.15 325.15];
p=polyfit(x,y,2);
>>p = -6.132255979314794 94.243160956690275 -45.358846153845960
y = -6.132256*x^2 + 94.243161*x - 45.358846
SGM = 6.097259786019860 %標准誤差
RR = 0.995867072105479 %相關指數
指數函數模型 y=A*exp(B/x) 【原模型y=A*exp(B*x)有誤】
x=[1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6 6.5 7 7.5 8];
y=[33.40 79.50 122.65 159.05 189.15 214.15 238.65 252.50 267.55 280.50 296.65 301.65 310.40 318.15 325.15];
x1=1./x; z=log(y');
m=[ones(15,1),x1'];
c=m\z;
a=exp(c(1)),b=c(2)
a = 451.6721 b = -2.6050
y=451.6721*exp(-2.6050/x)
SGM = 1.562 %標准誤差
RR = 0.9997 %相關指數
㈨ 分段擬合曲線(急需賜教!)
問題還真多
這道題首先要進行擬合,然後在求擬合曲線在定義域內的最值
1.你都知道是多項式曲線擬合力,還要怎麼具體
2.具體的計算方法(人工)。就是先要確定你要擬合的多項式是幾次的。此題中,總共有61個已知值,那麼可以擬合最高次數為60。
假定是3次多項式擬合
則列方程
ax^3+bx^2+cx^1+d=y
將你的60個數全帶進去。解得abcd就ok了
3.畫圖可用matlab,操作實例
t=polyfit(x,y,60) '進行最高次數為60的多項式擬合
plot(x,y,'go')'畫圖
4.最小二乘擬合在matlab裡面也是polyfit實現的,需要3對數據。
5.三次樣條的含義不是算出三個區間,而是知道已知點的函數值,一次函數值,和二次函數值。最後算出插值函數。
根據你給的4個已知條件,matlab代碼是
x=[1,16,31,61];
y=[14.53,14.88,15.21,15.34];
polyfit(x,y,3)
ans =
-0.0000 0.0002 0.0209 14.5088
㈩ 這種曲線應該用哪種曲線擬合公式
老弟,公式打不出來的
一般都是用matlab搞定的,它裡面有現成的函數供使用的
典型程序解析:
x=[0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1];%input xi data
y=[1.978 3.28 6.16 7.08 7.34 7.66 9.56 9.48 9.30 11.2]; % input yi data
n=2; % polynomial order
p=polyfit(x, y, n)% polyfit 的輸出是一個多項式系數的行向量(擬合二項式的系數)
ezplot('-9.8108*x*x+20.1293*x-0.0317')%對擬合的函數作圖
xi=linspace(0,1,100); % x-axis data for plotting
z=polyval(p, xi);% 為了計算在xi數據點的多項式值,調用MATLAB的函數polyval
plot(x,y, 'o' ,x,y,xi,z,':')%在同一個圖形里看他們的擬合程度
典型例題:對以下數據分別作二次,三次多項式擬合,並畫出圖形.
x=1:16;
y=[4, 6.4, 8, 8.4, 9.28, 9.5, 9.7, 9.86, 10, 10.2, 10.32, 10.42, 10.5, 10.55, 10.58, 10.6];
源程序:二次多項式擬合
x=1:1:16;
y=[4, 6.4, 8, 8.4, 9.28, 9.5, 9.7, 9.86, 10, 10.2, 10.32, 10.42, 10.5, 10.55, 10.58, 10.6];
a=polyfit(x,y,2)
a =
-0.0445 1.0711 4.3252
ezplot('-0.0445*x^2+1.0711*x+4.3252')
三次多項式擬合
x=1:1:16;
y=[4, 6.4, 8, 8.4, 9.28, 9.5, 9.7, 9.86, 10, 10.2, 10.32, 10.42, 10.5, 10.55, 10.58, 10.6];
a=polyfit(x,y,3)
a =
0.0060 -0.1963 2.1346 2.5952
ezplot('0.0060*x^3-0.1963*x^2+2.1346*x+2.5952')