利用已知數據擬合三維圖以及等高線 matlab 數學建模


Description


 

  給定所有三維的離散坐標(xi, yi, zi)的數據集,如國賽2011年A題附件1 [1] ,請繪制出三維圖

 

思路


 

  因為給定的是離散點求解三維地勢圖,如果只用 plot3() 的話只能得到三維曲線,並不能擬合成曲面圖,所以需要先插值再曲面擬合。

  對於插值方面,interp2() 只能處理網格型數據。所以對於離散點數據,我選擇的插值方法是 griddata(x, y, z, XI, YI),其中XI,YI是期望的插值位置,與[XI, YI] = meshgrid(XI, YI) 效果相同。

  griddata 的語法為 [...] = griddata(..., method),method指定的是插值使用的算法,其值可以是以下幾種類型:(1)nearest:線性最近項插值  (2)linear:線性插值(默認)  (3)cubic:雙三次插值  (4)v4:MATLAB 4.0 版本中提供的插值算法

  得到了插值點集合,繪制曲面圖的話可以用 mesh()、surf(),前者得到的是網格划分的三維曲面圖,后者得到的是平滑着色的三維曲面圖。在這里我選擇surf(),用mesh()也是可以的。

  之后是繪制等高線、城區分類與圖例。

  難點是在繪制圖例,我采用的辦法是使用函數 legend() 。首先利用 plot() 繪制五個線條並返回創建的圖線條對象。然后,legend()通過將第一個輸入參數指定為要包含的圖線條對象的向量,創建一個只包括其中兩個線條的圖例。更多圖例方法請參考 [2] 。

  以國賽2011年A題附件1 [1] 為例,matlab腳本代碼如下:

clear all,clc;
data = load('data1.txt');
x = data(:, 1);
y = data(:, 2);
z = data(:, 3);
d = data(:, 4);
[X,Y,Z] = griddata(x,y,z,linspace(min(x),max(x))',linspace(min(y),max(y)),'v4'); %插值
subplot(1,2,1); 
surfc(X,Y,Z); %三維曲面
xlabel('X'); ylabel('Y'); zlabel('海拔/m');
title('地勢圖')
axis tight
N = 15;
subplot(1,2,2); 
[c, h] = contour(X, Y, Z, [0:30:308]);
clabel(c, h); xlabel('X'); ylabel('Y');
hold on
for i = 1:1:length(x)
    switch d(i)
        case 1
            p1 = plot(x(i), y(i), 'ro');
        case 2
            p2 = plot(x(i), y(i), 'khexagram');      
        case 3
            p3 = plot(x(i), y(i), 'g^'); 
        case 4
            p4 = plot(x(i), y(i), 'y*');
        case 5
            p5 = plot(x(i), y(i), 'gx'); 
    end     
end
legend([p1, p2, p3, p4, p5], '生活區', '工業區', '山區', '交通區', '公園綠地區', 'Location', 'northeastoutside');
hold off
title('等高線以及城區分類')

 

  效果如下:

 

  

              國賽2011年A題附件1插值擬合出來的三維地勢圖

 

   

           國賽2011年A題附件1的等高線以及城市分區

 

參考


 

  [1]:國賽2011年A題下載網址:http://www.matlabsky.com/thread-19740-1-1.html

       [2]:利用 legend() 添加圖例:https://ww2.mathworks.cn/help/matlab/ref/legend.html#bt6ef_q-2_1

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM