數據處理是建模競賽每個賽題都繞不開的一關,所謂得數據者者的天下,所有不論是從數據的收集、挖掘、分析還是處理在建模過程中都十分重要。數學建模中常見的數據處理方法有:
曲線插值與擬合
數值微分與積分
微分方程數值解
優化問題
回歸分析
判別分析
對表格給出的函數,求出沒有給出的函數值。
在實際工作中,經常會遇到插值問題。下表是待加工零件下輪廓線的一組數據,現需要得到x坐標每改變0.1時所對應的y的坐標。
下面是關於插值的兩條命令(專門用來解決這類問題):
y=interp1(x0,y0,x,’method』) 分段線性插值
y=spline(x0,y0,x) 三次樣條插值
x0,y0是已知的節點坐標,是同維向量。
y對應於x處的插值。y與x是同維向量。
method可選』nearest』(最近鄰插值),』linear』(線性插值),’spline』(三次樣條插值),』cubic』(三次多項式插值)
解決上述問題,我們可分兩步:
用原始數據繪圖作為選用插值方法的參考。
確定插值方法進行插值計算。
x0=[0,3,5,7,9,11,12,13,14,15]';
y0=[0,1.2,1.7,2.0,2.1,2.0,1.8,1.2,1.0,1.6]'
plot(x0,y0) %完成第一步工作
x=0:0.1:15;
y=interp1(x0,y0,x'); %用分段線性插值完成第二步工作
plot(x,y)
y=spline(x0,y0,x');
plot(x,y) %用三次樣條插值完成第二步工作
MATLAB中二維插值的命令是:
z=interp2(x0,y0,z0,x,y,'meth')
在一個長為5個單位,寬為3個單位的金屬薄片上測得15個點的溫度值,試求出此薄片的溫度分布,並繪出等溫線圖。(數據如下表)
二維插值(px_lc21.m)
temps=[82,81,80,82,84;79,63,61,65,87;84,84,82,85,86];
mesh(temps) %根據原始數據繪出溫度分布圖,可看到此圖的粗造度。
%下面開始進行二維函數的三階插值。
width=1:5; depth=1:3; di=1:0.2:3; wi=1:0.2:5;
[WI,DI]=meshgrid(wi,di); %增加了節點數目
ZI=interp2(width,depth,temps,WI,DI,'cubic'); % 對數據(width,depth,temps)進行三階插值擬合。
surfc(WI,DI,ZI)
contour(WI,DI,ZI)
假設一函數g(x)是以表格形式給出的,現要求一函數f(x),使f(x)在某一準則下與表格函數(數據)最為接近。
由於與插值的提法不同,所以在數學上理論根據不同,解決問題的方法也不同。
此處,我們總假設f(x)是多項式。
【問題】
彈簧在力F的作用下伸長x釐米。F和x在一定的範圍內服從虎克定律。試根據下列數據確定彈性係數k,並給出不服從虎克定律時的近似公式。
【解題思路】
可以用一階多項式擬合求出k,以及近似公式。
在MATLAB中,用以下命令擬合多項式。
polyfit(x0,y0,n)
一般,也需先觀察原始數據的圖像,然後再確定擬和成什麼曲線。
對於上述問題,可鍵入以下的命令:
x=[1,2,4,7,9,12,13,15,17]';
F=[1.5,3.9,6.6,11.7,15.6,18.8,19.6,20.6,21.1]';
plot(x,F,'.')
從圖像上我們發現:前5個數據應與直線擬合,後5個數據應與二次曲線擬合。於是鍵入 :
a=polyfit(x(1:5),F(1:5),1);
a=polyfit(x(5:9),F(5:9),2)
【舉例】
現要根據瑞士地圖計算其國土面積。於是對地圖作如下的測量:以西東方向為橫軸,以南北方向為縱軸。(選適當的點為原點)將國土最西到最東邊界在x軸上的區間劃取足夠多的分點xi,在每個分點處可測出南北邊界點的對應坐標y1 ,y2。用這樣的方法得到下表:
根據地圖比例知18mm相當於40km,試由上表計算瑞士國土的近似面積。(精確值為41288km2)。
【解題思路】
數據實際上表示了兩條曲線,實際上我們要求由兩曲線所圍成的圖形的面積。
解此問題的方法是數值積分的方法。具體解時我們遇到兩個問題:
❓數據如何輸入;
❓沒有現成的命令可用。
對於第一個問題,我們可把數據拷貝成M文件(或純文本文件)。
然後,利用數據繪製平面圖形。鍵入
load mianji.txt
A=mianji';
plot(A(:,1),A(:,2),'r',A(:,1),A(:,3),'g')
接下來可以計算面積。鍵入:
a1=trapz(A(:,1)*40/18,A(:,2)*40/18);
a2=trapz(A(:,1)*40/18,A(:,3)*40/18);
d=a2-a1
d = 4.2414e+004
至此,問題得到了解決。
想得到更理想的結果,可以自己設計解決問題的方法。(可以編寫辛普森數值計算公式的程序,或用擬合的方法求出被積函數,再利用MATLAB的命令quad,quad8)
已知20世紀美國人口統計數據如下,根據數據計算人口增長率。(其實還可以對於後十年人口進行預測)
【解題思路】
設人口是時間的函數x(t).於是人口的增長率就是x(t)對t的導數.如果計算出人口的相關變化率。那麼人口增長滿足 ,它在初始條件x(0)=x0下的解為 。
解:此問題的特點是以離散變量給出函數x(t),所以就要用差分來表示函數x(t)的導數.
常用後一個公式。(因為,它實際上是用二次插值函數來代替曲線x(t))即常用三點公式來代替函數在各分點的導數值:
MATLAB用命令diff按兩點公式計算差分;此題自編程序用三點公式計算相關變化率。編程如下(diff3.m):
for i=1:length(x)
if i==1
r(1)=(-3*x(1)+4*x(1+1)-x(1+2))/(20*x(1));
elseif i~=length(x)
r(i)=(x(i+1)-x(i-1))/(20*x(i));
else
r(length(x))=(x(length(x)-2)-4*x(length(x)-1)+3*x(length(x)))/(20*x(length(x)));
end
end
r=r;
保存為diff3.m文件聽候調用.再在命令窗內鍵入
X=[1900,1910,1920,1930,1940,1950,1960,1970,1980,1990];
x=[76.0, 92.0, 106.5, 123.2, 131.7, 150.7, 179.3, 204.0, 226.5, 251.4];
diff3;
由於r以離散數據給出,所以要用數值積分計算.鍵入
x(1,1)*exp(trapz(X(1,1:9),r(1:9)))
數值積分命令:trapz(x),trapz(x,y),quad(『fun』,a,b)。
在初始角度不大時,問題可以得到很好地解決,但如果初始角較大,此方程無法求出解析解.現問題是當初始角為100和300時,求出其解,畫出解的圖形進行比較。
解:若θ0較小,則原方程可用來近似.其解析解為,若不用線性方程來近似,那麼有兩個模型:
取g=9.8,l=25,100=0.1745,300=0.5236.
用MATLAB求這兩個模型的數值解,先要作如下的處理:令x1=θ,x2=θ』,則模型變為
再編函數文件(danbai.m)
function xdot=danbai(t,x)
xdot=zeros(2,1);
xdot(1)=x(2);xdot(2)=-9.8/25*sin(x(1));
在命令窗口鍵入()
[t,x]=ode45(『danbai』,[0:0.1:20],[0.1745,0]);
[t,y]=ode45(『danbai』,[0:0.1:20],[0.5236,0]);
plot(t,x(:,1),』r』,t,y(:,1),』k』);
曲線插值與擬合、數值微分與積分、微分方程數值解是的數學建模中常用的數字處理方法,今天我們的學習就到這裡,下次我們繼續學習優化問題、回歸分析及判別分析等數據處理方法。
大大大大大大福利來襲!針對很多同學對於數據處理的煩惱,數樂君特設置了數據處理方法以及關於數據處理的MATLAB實現方法課程。原價299元,現限時免費!在美賽即將到來之際,回饋給各位鐵粉模友!
該課程可反覆觀看學習且支持課件下載。
額外福利!!!
學就學到精通,除了上述課程外,還有六本珍貴書籍免費分享給各位模友:
3.《Learning to Programm with matlab》
4.工程與科學數值方法的MATLAB實現(第2版)
5.Engineering Computations and Modeling in MATLAB Simulink 2011
模友們可能已經發現:現在公眾號推送文章的順序,已經不會按時間排列了。這種變化,可能會讓各位模友錯過我們每天的推送。
所以,如果你還想像往常一樣,聚焦數模樂園,就需要將「數模樂園」標為星標公眾號,同時在閱讀完文章後,別忘了給一個「在看」哦。
(1)點擊頁面最上方「數模樂園」,進入公眾號主頁
(2)點擊右上角的小點點,在彈出頁面點擊「設為星標」,就可以啦。