學習網址:【MOOC---鄭州輕工業大學---數學建模與實驗】 【第3章】
https://www.icourse163.org/spoc/learn/ZZULI-1452737171?tid=1453250459#/learn/content
🚀數學建模專欄:https://blog.csdn.net/weixin_44949135/category_9842054.html🚀
筆記01:https://blog.csdn.net/weixin_44949135/article/details/105832126【第1、2章】【概述、軟件介紹】
筆記02:https://blog.csdn.net/weixin_44949135/article/details/107137871【第3章】【數據處理方法】
MOOC上的視頻與課件非常詳細(可以直接下載),本博客只是博主的一些筆記。
目 錄
3.1 一維插值方法
數據處理方法---比如:對未來做預測的數據處理方法。
數據查找方法、數據擬合、聚類分析、回值分析、數據逼近...
1、數據處理的應用背景
數據正確(準確)
函數通過數據點:插值法;
不要求目標函數經過所有的數據點(或者 所有的數據點都不經過!):擬合。
2、插值的基本原理
問題: 給定一批數據點,需確定滿足特定要求的函數( 曲線或曲面 )。
解決方案: 若要求所求曲線(面)通過所給所有數據點,就是插值問題。
3、引例
3.1、引例演示
由 下圖可以看出:3條線的光滑程度 不同,
可以看出:最臨近插值 光滑程度最差;線性插值 次之;樣條插值 最光滑。
4、一維插值定義
各個x*不同。 某函數【y*】:經過所有插值節點--->構造函數!!!
5、一維插值原理
6、一維插值方法
6.1、拉格朗日插值
求一個經過n+1個插值節點的n次多項式函數。
各個Xi的值都不同,Li(X)存在,且唯一。
觀察 公式:分子、分母---X、Xi。
n=2:兩點確定一條直線。
n=3:經過三點,存在一個二次函數。
隨着 插值節點的增多,拉格朗日函數的次數會越來越高。--> 振盪現象(劇烈震盪)--> 誤差增大 --> 分段插值方法
6.2、分段線性插值
一維分段線性插值:每兩個相鄰節點,確定一個一次函數(兩點確定一條直線);存在一條折線,連接n+1個點。
每個點的左右導數不相等,光滑度低,不能滿足實際的工程需要->尋找 光滑性好、次數低的、誤差低的插值函數->三次樣條插值
6.3、三次樣條插值
三次樣條插值---插值函數
1)在每一個小區間,都是一個三次函數;
一階導數值、二階導數值 相等;
端點處的二階導數值 爲 0。
3.2 二維插值方法
1、高維插值的應用背景
在實際的應用領域中,人們經常面臨尋求一個多元解析函數描述並通過高維空間中多維數據(通常是測量值)的任務。
如:天氣預報風雲高壓圖、山川河流的等高線測量 等。對此類問題多采用高維插值方法,數據假定是正確的,要求以某種方法描述數據點之間所發生的情況,以解決實際生產、生活中遇到的問題。其中,最常用的高維插值是二維插值。
2、二維插值的基本原理
二元函數 z=f(x, y)
2.1、規則網格下二維插值
空間點 (x1, y1, z1)、(x2, y2, z2)、 ...、(xn, yn, zn) 在xOy平面投影 得來的散點圖(定義域)。
投影方向 沿x、y軸方向 等距離地 畫出,得到的網格,即爲規則網格(容易尋找規律)。
2.2、散亂節點網格下二維插值
不規則網格查找:僅要求各個節點互不相同。散亂節點無規律,插值難度較大。
3、插值方法
3.1、最鄰近插值法
黑色點:插值節點。
最鄰近插值法:按照 被插值節點 到 各插值節點的距離,最小的插值節點 所對應的函數值,就是 要求的插值結果。
離 被插值節點最近的插值節點 所對應的函數值,即爲 插值。
採用 分片常值函數,一般不連續。
3.2、分片線性插值
分片線性插值:滿足連續性。(整體連續)
將 方格的對角線 連到一塊,分割 方格 爲 2個三角形。
每個方格都這樣處理 --> 可以看作:多個三角形拼接而成。
3個點 分別對應 空間中的3個點的投影。【這3個點不同;空間中的三個點也不同。】
空間中,不共線的3個點 可以唯一確定一個平面 --> 空間曲面可以看成多個三角形空間平面拼接而成。
每個平面對應一個二元線性函數 --> 所以 稱之爲分片線性插值。
3.3、雙線性插值
4個邊界,都是 直線!
3.3 數據擬合方法
數據插值:插值函數 經過 插值節點。插值節點過多 --> 數據插值誤差可能較大 --> 數據擬合方法
1、擬合的應用背景
在大量的應用領域中,人們經常面臨用一個解析函數描述數據(通常是測量值)的任務。對這個問題,人們設法找出某條光滑函數曲線,使它與實際數據誤差儘可能地小,找出最佳擬合實際數據的函數,結果不要求目標函數經過任何數據點。這類方法統稱爲曲線擬合。
2、擬合的問題描述
問題:已知一組(二維)數據,即平面上 n個點(xi, yi) i=1,…,n, 尋求一個函數(曲線)y=f(x), 使 f(x) 在某種準則下與所有數據點最爲接近,即曲線擬合得最好。
解決方案:若不要求曲線(面)通過所有數據點,而是要求它反映 對象整體的變化趨勢,這就是數據擬合,又稱曲線擬合或曲面擬合(三維)
數據量多 --> 數據擬合 --> 反映對象整體(數據)變化趨勢
3、擬合模型分類
線性(直線或平面)擬合 用一次函數或線性函數擬合已知現有數據。
非線性(曲線或曲面)擬合 若線性擬合效果不佳,爲提高精度,可採用曲線(曲面)擬合數據 。常用的非線性擬合函數是二次函數,三次函數等高次多項式函數, 有時也會用到對數、指數、三角函數等。
分段擬合 在不同的數據段上,採用不同的低次多項式進行擬合。
常值---擬合-->最爲簡單。
線性擬合:二維:直線;三維:平面。
分段擬合:誤差較大的情況下,類似於 分段插值的方法,將數據進行分段,在不同的數據段上 採用 不同的低次多項式進行擬合。
4、擬合模型常用解法
4.1、最小二乘法
最小二乘法是一個非常有用的數學方法,它的直接應用是求矛盾線性方程組的最小二乘解。在工程中,它可用來求經驗公式,對實驗數據進行曲線擬合;在統計學中,它可用來求最小二乘估計,多元迴歸等;另外,在數值分析領域,它可用來進行誤差分析。 可以說,隨着我們將來知識的增多,最小二乘法的應用領域將愈來愈大。
求解 擬合多項式的參數、係數
5、最小二乘法
a1,a2,a3,...,am :線性組合
f(xi) - yi :點到曲線的距離。
求得結果 越小越好 --> 擬合結果越好。
6、線性最小二乘法:預備知識
超出定解條件的方程組。
7、線性最小二乘法求解
轉置矩陣R^T
7.1、化爲二次型的形式
T:轉置 列向量
7.2、正規方程的矩陣形式
7.3、算法說明
7.4、關於基函數的選擇
3.4 數據插值的MATLAB實現
1、MATLAB作一維插值函數
x、y:數據點所構成的向量,插值節點對應的數值;
xi:被插值節點、插值向量
method:採用什麼樣的方法實現一維插值功能。
x,y,z:已知的插值節點數據。zi:插值結果。
method:採用什麼樣的方法實現二維插值功能。
常用的4種插值方法。
2、MATLAB作二維插值函數
注意:二維插值中已知數據點集(x0,y0)必須是柵格格式,一般用meshgrid函數產生。interp2要求(x0,y0)必須是嚴格單調的並且是等間距的,如果(x0,y0)不是等間距的,會將且變換爲等間距形式,如果已知是等間距的,可在method參數前加星號,例如:'*cubic' 。
3、MATLAB作高維插值函數
Xi,Yi,Zi:向量組。
3.5 數據擬合的MATLAB實現
1、MATLAB作線性最小二乘擬合
a:多項式係數。
x、y:擬合數據;n:擬合多項式的次數
s:誤差預測結果,將數據代入後 與 實際的差值。
2、MATLAB作非線性最小二乘擬合
2.1、lsqcurvefit
lsqcurvefit、lsqnonlin :curve 刻畫;non 非;lin 線性。
調用格式
2.2、lsqnonlin
3.6 數據插值的案例分析與實踐
1、一維插值的應用
例1
0、代碼彙總
x = 0:2:24; %時間:從0到24,增量爲2
y = [12, 9, 12, 15, 23, 30, 36, 35, 31, 27, 20, 22, 24]; %溫度
xi = 0:1/3600:24; %從0到24,增量爲1/3600 24小時中的每一秒
yi = interp1(x, y, xi, 'nearest'); %interp1:一維多項式插值;x、y:插值數據(插值節點);nearest 最鄰近插值
plot(xi, yi, 'r'); %plot():繪圖命令;r:紅色; 在xi時刻內所對應的插值結果記作yi
xlabel('時刻'), ylabel('溫度'); %在x軸上標註‘時刻’
hold on %保留
x = 0:2:24;
y = [12, 9, 12, 15, 23, 30, 36, 35, 31, 27, 20, 16, 13];
xi = 0:1/3600:24;
yi = interp1(x, y, xi, 'linear');
plot(xi, yi, 'g');
hold on
x = 0:2:24;
y = [12, 9, 12, 15, 23, 30, 36, 35, 31, 27, 20, 16, 13];
xi = 0:1/3600:24;
yi = interp1(x, y, xi, 'spline');
plot(xi, yi, 'b');
hold on
x = 0:2:24;
y = [12, 9, 12, 15, 23, 30, 36, 35, 31, 27, 20, 16, 13];
xi = 0:1/3600:24;
yi = interp1(x, y, xi, 'cubic');
plot(xi, yi, 'y');
hold on
1、nearest(最近插值)
2、linear(線性插值)
3、spline(三次樣條插值)
4、cubic(三次插值)
例2
clc; %清除變量
hours = 1:12; %分割時間
temps = [5 8 9 15 25 29 31 30 22 25 27 24];
h = 1:0.1:12;
t = interp1(hours, temps, h, 'spline');
plot(hours, temps,'+', h, t, hours, temps, 'r');
xlabel('Hour'), ylabel('Degrees Clesius')
2、二維插值的應用
例3
1、散點溫度分佈圖
x = 1:5; y = 1:3; temps = [82 81 80 82 84; 79 63 61 65 81; 84 84 82 85 86]; mesh(x, y, temps)
2、溫度分佈曲面圖
x = 1:5; y = 1:3; temps = [82 81 80 82 84; 79 63 61 65 81; 84 84 82 85 86]; mesh(x, y, temps) xi = 1:0.2:5; yi = 1:0.2:3; zi = interp2(x, y, temps, xi', yi, 'cubic'); mesh(xi, yi, zi)
例4
1、海底曲面圖(考察的海域範圍)
問題求解算法:
1.輸入插值基點數據;
2.在矩形區域(75,200)x(-50,150)進行插值;
3.作海底曲面圖;
4.作出水深小於5的海域範圍,即z=5的等高線。
%插值並作海底曲面圖的程序 x = [129.0 140.0 103.5 88.0 185.5 195.0 105.5 157.5 107.5 77.0 81.0 162.0 162.0 117.5]; y = [7.5 141.5 23.0 147.0 22.5 137.5 85.5 -6.5 -81 3.0 56.5 -66.5 84.0 -33.5]; z = [4 8 6 8 6 8 8 9 9 8 8 9 4 9]; x1 = 75:1:200; y1 = -50:1:150; [x1, y1] = meshgrid(x1, y1); %點陣 z1 = griddata(x, y, z, x1, y1, 'v4'); meshc(x1, y1, z1)
2、水深小於5的海域範圍
%程序二:插值並作出水深小於5的海域範圍。 x1 = 75:1:200; y1 = -50:1:150; [x1, y1] = meshgrid(x1, y1); z1 = griddata(x, y, z, x1, y1, 'v4'); %插值 z1(z1 >= 5) = nan; %將水深大於5的置爲nan,這樣繪圖就不會顯示出來 meshc(x1, y1, z1)
3.6節---代碼彙總
% x = 0:2:24; %時間:從0到24,增量爲2
% y = [12, 9, 12, 15, 23, 30, 36, 35, 31, 27, 20, 22, 24]; %溫度
% xi = 0:1/3600:24; %從0到24,增量爲1/3600 24小時中的每一秒
% yi = interp1(x, y, xi, 'nearest'); %interp1:一維多項式插值;x、y:插值數據(插值節點);nearest 最鄰近插值
% plot(xi, yi, 'r'); %plot():繪圖命令;r:紅色; 在xi時刻內所對應的插值結果記作yi
% xlabel('時刻'), ylabel('溫度'); %在x軸上標註‘時刻’
% hold on %保留
% x = 0:2:24;
% y = [12, 9, 12, 15, 23, 30, 36, 35, 31, 27, 20, 16, 13];
% xi = 0:1/3600:24;
% yi = interp1(x, y, xi, 'linear');
% plot(xi, yi, 'g');
% hold on
% x = 0:2:24;
% y = [12, 9, 12, 15, 23, 30, 36, 35, 31, 27, 20, 16, 13];
% xi = 0:1/3600:24;
% yi = interp1(x, y, xi, 'spline');
% plot(xi, yi, 'b');
% hold on
% x = 0:2:24;
% y = [12, 9, 12, 15, 23, 30, 36, 35, 31, 27, 20, 16, 13];
% xi = 0:1/3600:24;
% yi = interp1(x, y, xi, 'cubic');
% plot(xi, yi, 'y');
% hold on
% clc; %清除變量
% hours = 1:12; %分割時間
% temps = [5 8 9 15 25 29 31 30 22 25 27 24];
% h = 1:0.1:12;
% t = interp1(hours, temps, h, 'spline');
% plot(hours, temps,'+', h, t, hours, temps, 'r');
% xlabel('Hour'), ylabel('Degrees Clesius')
% x = 1:5;
% y = 1:3;
% temps = [82 81 80 82 84; 79 63 61 65 81; 84 84 82 85 86];
% mesh(x, y, temps)
% xi = 1:0.2:5;
% yi = 1:0.2:3;
% zi = interp2(x, y, temps, xi', yi, 'cubic');
% mesh(xi, yi, zi)
%插值並作海底曲面圖的程序
% x = [129.0 140.0 103.5 88.0 185.5 195.0 105.5 157.5 107.5 77.0 81.0 162.0 162.0 117.5];
% y = [7.5 141.5 23.0 147.0 22.5 137.5 85.5 -6.5 -81 3.0 56.5 -66.5 84.0 -33.5];
% z = [4 8 6 8 6 8 8 9 9 8 8 9 4 9];
% x1 = 75:1:200;
% y1 = -50:1:150;
% [x1, y1] = meshgrid(x1, y1); %點陣
% z1 = griddata(x, y, z, x1, y1, 'v4');
% meshc(x1, y1, z1)
%程序二:插值並作出水深小於5的海域範圍。
x1 = 75:1:200;
y1 = -50:1:150;
[x1, y1] = meshgrid(x1, y1); %網格
z1 = griddata(x, y, z, x1, y1, 'v4'); %插值
z1(z1 >= 5) = nan; %將水深大於5的置爲nan,這樣繪圖就不會顯示出來
meshc(x1, y1, z1)
3.7 數據擬合的案例分析與實踐
最小二乘法線性擬合的應用
例1 預測人口的增長情況
人口的增長是當前世界上引起普遍關注的問題,並且我們會發現在不同的刊物預報 同一時間的人口數字不相同,這顯然是由於用了不同的人口模型計算的結果。我國是世界第一人口大國,基本上地球每九個人中就有一箇中國人。有效地控制我國人口的增長是使我國全面進入小康社會、到21世紀中葉建成富強民主文明的社會主義國家的需要。而有效控制人口增長的前提是要認識人口數量的變化規律,建立人口模型,作出較準確的預報。
1949年——1994年,我國人口數據資料如下:
年份xi 1949 1954 1959 1964 1969 1974 1979 1984 1989 1994 人口數yi 5.4 6.0 6.7 7.0 8.1 9.1 9.8 10.3 11.3 11.8
[ 人口數 單位:億!!! ]
建模分析我國人口增長的規律,預報1999年我國人口數。
1、模型(線性增長模型、指數增長模型)
2、Matlab程序and計算結果
% Matlab計算程序如下: x=[1949 1954 1959 1964 1969 1974 1979 1984 1989 1994]; y=[5.4 6.0 6.7 7.0 8.1 9.1 9.8 10.3 11.3 11.8 ]; a=polyfit(x,y,1); x1=[1949:10:1994]; y1=a(2)+a(1)*x1; b=polyfit(x,log(y),1); y2=exp(b(2))*exp(b(1)*x1); plot(x,y,'*') hold on plot(x1,y1,'--r') hold on plot(x1,y2,'-k') legend('原曲線','模型一曲線','模型二曲線')
3、擬合結果與實際結果比較
4、結果比較與分析
例2 假設有一組實測數據...
假設有一組實測數據
xi 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 yi 2.3201 2.647 2.9707 3.2885 3.6008 3.909 4.2147 4.5191 4.8232 5.1275
模型假設:該數據滿足的原型函數
試求出滿足下面數據的最小二乘解的a,b,c,d的值。
採用最小二乘擬合:lsqcurvefit()
建立原型函數:
function y=f1(a,x)
y=a(1)*x+a(2)*x.^2.*exp(-a(3)*x)+a(4);
在命令窗口中輸入:
function y=f1(a,x)
y=a(1)*x+a(2)*x.^2.*exp(-a(3)*x)+a(4);x=[0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0];
y=[2.3201 2.647 2.9707 3.2885 3.6008 3.909 4.2147 4.5191 4.8232 5.1275];
a=lsqcurvefit('f1',[1;2;2;2],x,y)