国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于MATLAB GUI的天然河道過水斷面面積計算

2017-08-08 10:56呂良軍李峰郝振莉
關鍵詞:坐標軸控件水深

呂良軍,李峰,郝振莉

(黃河水利職業(yè)技術學院,河南開封475004)

基于MATLAB GUI的天然河道過水斷面面積計算

呂良軍,李峰,郝振莉

(黃河水利職業(yè)技術學院,河南開封475004)

以MATLAB GUI系統(tǒng)為平臺,實現(xiàn)人機交互,研究智能可視化操作界面的結(jié)構(gòu)設計、控件的選擇布局和功能實現(xiàn)方法。以數(shù)學模型為依托,通過天然河道過水斷面計算面積與水深的具體案例,探討了MATLAB GUI在復雜水力計算問題的設計應用。

MATLABGUI;水力計算;天然河道;數(shù)學模型;系統(tǒng)平臺

0 引言

在進行水利工程分析計算時,由于存在諸多不確定因素,所以需要大量的試算。為提高工作效率,減輕設計人員的工作量,可以借助計算機來完成。用Microsoft Excel進行水力計算,簡單快捷,但缺乏數(shù)據(jù)可視化功能[1~2]。

MATLAB軟件是目前國際上最流行、應用最廣泛的科學工程軟件,它集成了數(shù)值計算、矩陣計算和圖形繪制等功能,廣泛應用于研究解決各種數(shù)學及工程計算問題。將MATLAB數(shù)值計算方法與水力計算相結(jié)合,可以大大縮短計算時間,提高計算精度和工作效率,并且可以使數(shù)據(jù)可視化。但是,其計算只能在命令窗口中運行,每次調(diào)用都需要修改程序,不方便多次重復使用,并且還要求工程人員對程序有一定的理解[3]。MATLAB圖形用戶界面(Graph User Interface,簡稱GUI)是由窗口、光標、按鍵、菜單、文字說明等對象構(gòu)成的一個用戶界面。用戶可以通過鼠標或鍵盤選擇、激活這些圖形對象,使計算機產(chǎn)生某種動作或變化,比如實現(xiàn)計算、繪圖等[4]。MATLAB GUI平臺實現(xiàn)了人機交互,使計算更加簡捷明了。本文試以在MATLAB環(huán)境中實現(xiàn)各種數(shù)值計算方法為主線,以天然河道的過水斷面面積計算為范例,研究系統(tǒng)的可視化操作界面的結(jié)構(gòu)設計、功能設計以及控件的選擇和布局、控件功能的GUI實現(xiàn)。

1 數(shù)學模型的建立

如圖1所示,設某河道寬為L,在橫斷面上測量了離左岸距離為xi點的水深為yi,試計算該河道過水斷面面積與離左岸距離任意點的水深。

圖1 過水河道斷面Fig.1 River course cross-section

1.1 任意點的水深計算模型

1.1.1 一維插值法

未知函數(shù)y=f(x)在區(qū)間[a,b]上n+1個不同點處的函數(shù)值yi=f(xi)(i=0,1,…,n),要使n次多項式φn(x)=a0+a0x+…+a0xn在給定點處與f(x)有相同的值,需要滿足如式(1)所示的插值條件。

式中:φn(x)為插值多項式;xi(i=0,1,…,n)為插值節(jié)點,簡稱節(jié)點;[a,b]為插值區(qū)間。

從幾何上看,n次多項式插值就是作一條過n+1個點(xi,f(xi))(i=0,1,…,n)的多項式曲線y=φn(x),用它近似代替函數(shù)曲線y=f(x)。

在MATLAB的一維插值函數(shù)interp1(x,y)中,有線性插值、三次樣條插值、立方插值和最鄰近插值4種插值方法供選擇,其調(diào)用格式為yi=interp1(x,y,xi,‘method’)。其中,x、y為觀測數(shù)據(jù)點,xi為插值(自變量)向量,yi為xi點的函數(shù)值,‘method’表示采用的插值方法,包括鄰近插值(nearest)、線性插值(linear)、三次樣條插值(spline)、立方插值(cubic)4種。缺省時,表示線性插值。

本文采用三次樣條函數(shù)進行插值。以左岸為原點,離左岸距離xi點的水深為yi(i=1,2,…,n)。所以,以xi為插值節(jié)點構(gòu)造三次樣條函數(shù)y=S(x)。在區(qū)間[0,L]上,有n個互不相同的結(jié)點,函數(shù)y=S(x)需滿足以下條件[5]:(1)S(xi)=yi(i=0,1,…,n-1);(2)在每個小區(qū)間[xj,xj+1](j=0,1,…,n-1)中,S(x)是不超過三次的多項式,記為Sj(x);(3)S(x)在[0,L]上二階連續(xù)可導。

在區(qū)間[xk,xk+1]上,S(x)是不超過三次的多項式,故S″(x)是線性函數(shù)。令mk=S″(xk),k=0,1,…,n-1,由拉格朗日線性插值公式求得S″(x)如式(2)所示。

由此可見,只要能求出mk,S(x)就能完全確定。

1.1.2 多項式擬合法

已知某函數(shù)y=φ(x1,x2,…,xm)的一組測試數(shù)據(jù)為(x1i,x2i,…,xmi,yi)(i=1,2,…,n),要尋求一個函數(shù)f(x1,x2,…,xm),使f(x1,x2,…,xm)對上述測試數(shù)據(jù)的誤差較小,則φ(x1,x2,…,xm)≈f(x1,x2,…,xm)。對于一元函數(shù),這就是曲線擬合問題。

已知一組二維數(shù)據(jù)(xi,yi)(i=1,2,…,n),xi互不相同,要尋求一個函數(shù)y=f(x),使曲線f(x)在某種準則下與所有數(shù)據(jù)點最為接近,即曲線擬合得最好。擬合示意圖如圖2所示。圖2中,“+”表示數(shù)據(jù)點,δi表示點(xi,yi)到曲線y=f(x)的距離。一般以點到曲線的距離的平方和最小為度量標準,即數(shù)據(jù)擬合的最小二乘問題。

圖2 擬合示意圖Fig.2 Fitting diagram

不難看出,多項式最小二乘擬合問題就是求解關于ak(k=0,1,…,m)的超定方程組。根據(jù)函數(shù)極值的必要條件,令=0,k=0,1,…,m,可以得到正規(guī)方程組,如式(8)所示。

在MATLAB軟件中,提供了現(xiàn)成的多項式擬合函數(shù):a=polyfit(x0,y0,m)。其中,輸入?yún)?shù)x0、y0為要擬合的數(shù)據(jù)向量,m為擬合多項式的次數(shù),輸出參數(shù)a為擬合多項式y(tǒng)=a0+a1x+…+amxm的系數(shù),a=(a0,a1,…,am)。多項式在x處的值y可用函數(shù)y=polyval(a,x)計算。

1.2 過水斷面面積計算模型

2 河道過水斷面計算的GUI設計[6~7]

MATLAB GUI開發(fā)環(huán)境提供了一套可視化的創(chuàng)建圖形窗口的工具,方便用戶在此環(huán)境下開發(fā)界面,并可快捷地創(chuàng)建GUI應用程序。它可以根據(jù)用戶設計的GUI布局,自動生成M文件的框架,用戶可在這一框架編制自己的應用程序。

2.1 構(gòu)思草圖布置控件

在布局編輯器中布置控件時,使用幾何位置排列工具對控件的位置進行調(diào)整。(1)建立3個坐標軸對象,分別用于顯示河道、示圖、插值和擬合圖像。(2)建立3個按鈕,用來繪圖、求解和結(jié)束程序。(3)建立7個靜態(tài)文本標簽,用于提示相應控件和顯示計算結(jié)果。(4)建立6個可編輯文本框,用來輸入和輸出參數(shù)值。界面設計布局如圖3所示。

2.2 設置控件的相關屬性

控件的標識Tag用于對各控件的識別。在創(chuàng)建每個控件時,都會由開發(fā)環(huán)境自動產(chǎn)生一個標識。在程序設計中,為了編輯、記憶和維護的方便,一般為控件設置相對應的標識,便于程序的調(diào)試。

2.3 編寫代碼,實現(xiàn)控件的功能

圖3 設計布局界面Fig.3 Design layout interface

完成程序中變量的賦值、輸入、輸出及繪圖等工作,打開editor,在相應的按鈕命令后面添加相應代碼。

2.3.1 初始數(shù)據(jù)的讀取程序

I1=imread(‘hd.jpg’,‘jpg’);//讀取河道圖片

axes(handles.a(chǎn)xes1);//打開坐標軸1

image(I1);//在坐標軸1顯示河道圖片

axis off//不顯示坐標軸

I2=imread(‘hdst.jpg’,‘jpg’);//讀取河道示圖

axes(handles.a(chǎn)xes2);//打開坐標軸2

image(I2);//在坐標軸2顯示河道示圖

axis off//不顯示坐標軸

set(handles.x_edit,‘string’,‘x1x2…xn’);//顯示離左岸距離的初始數(shù)據(jù)

set(handles.y_edit,‘string’,‘y1y2…yn’);//顯示水深的初始數(shù)據(jù)

set(handles.n_edit,‘string’,‘n’);//顯示初始插入點數(shù)

set(handles.x0_edit,‘string’,‘m’);//顯示初始擬合次數(shù)

2.3.2 在插值計算按鈕添加程序

x=str2num(get(handles.x_edit,‘string’));//讀取x的數(shù)據(jù)

x0=str2num(get(handles.x0_edit,‘string’));//讀取x0的數(shù)據(jù)

y=str2num(get(handles.y_edit,‘string’));//讀取y的數(shù)據(jù)

n=str2num(get(handles.n_edit,‘string’));//讀取n的數(shù)據(jù)

axes(handles.a(chǎn)xes3);//在坐標軸3下畫圖

plot(x,y,‘k:’,‘Marker’,‘o’);//畫初始數(shù)據(jù)圖

hold on//保持圖像

xx=linspace(min(x),max(x),n);//產(chǎn)生n個離左岸距離數(shù)據(jù)

yy=spline(x,y,xx);//三次樣條插值

y0=spline(x,y,x0);//計算x0處水深

set(handles.y0_edit,‘string’,strcat(num2str(y0)));//顯示計算結(jié)果

plot(xx,yy,‘r-*’);//畫插值數(shù)據(jù)圖

plot([min(x),max(x)],[0,0],‘d-’);//畫水面線

plot([x0,x0],[0,y0],‘m.-’);//畫水深線

plot([0,x0],[y0,y0],‘m.-’);//畫水平線

legend(‘測量數(shù)據(jù)’,‘插值數(shù)據(jù)’,‘水面線’,4)//圖例

grid on//顯示網(wǎng)格線

hold off//關閉圖像

area=abs(trapz(xx,yy));//計算斷面面積

set(handles.s_edit,‘string’,strcat(‘S=’,num2str(area)));//顯示計算斷面面積

2.3.3 在擬合計算按鈕后添加程序:

x=str2num(get(handles.x_edit,‘string’));//讀取x的數(shù)據(jù)

y=str2num(get(handles.y_edit,‘string’));//讀取y的數(shù)據(jù)

m=str2num(get(handles.m_edit,‘string’));//讀取n的數(shù)據(jù)

axes(handles.a(chǎn)xes3);//在坐標軸3下畫圖

plot(x,y,‘k:’,‘Marker’,‘o’);//畫初始數(shù)據(jù)圖

hold on//保持圖像

a=polyfit(x,y,m);//進行m次多項式擬合

xx=min(x):0.5:max(x);//產(chǎn)生間隔為0.5m離左岸距離數(shù)據(jù)

yy=polyval(a,xx);//計算擬合后各點處的水深

plot(xx,yy,‘r-*’);//畫擬合數(shù)據(jù)圖

plot([min(x),max(x)],[0,0],‘d-’);//畫水面線

legend(‘測量數(shù)據(jù)’,‘擬合數(shù)據(jù)’,‘水面線’,4);//圖例

grid on//顯示網(wǎng)格線

hold off//關閉圖像

area2=abs(trapz(xx,yy));//計算斷面面積

set(handles.ss_edit,‘string’,strcat(‘S=’,num2str(area2)));//顯示計算結(jié)果

3 實例應用

3.1 基本條件

某河道寬21 m,在橫斷面上測量了11個點的水深(數(shù)據(jù)如表1所示)。請設計一個GUI系統(tǒng),計算河道過水斷面面積與任意點的水深。

表1 河道斷面測點水深Tab.1 Measurement point water depth of river course cross-section

3.2 計算結(jié)果

單擊“插值計算”按鈕后,求得水深,并給出測量數(shù)據(jù)與插值數(shù)據(jù)示圖,運行結(jié)果如圖4所示。

圖4 插值計算運行界面Fig.4 Operation interface of interpolation calculation

單擊“擬合計算”按鈕后,求得水深,并給出測量數(shù)據(jù)與擬合數(shù)據(jù)示圖,運行結(jié)果如圖5所示。

圖5 擬合計算運行界面Fig.5 Fitting calculation operation interface

如果需要求某一處的水深,只要輸入坐標,單擊“計算水深”按鈕,就能得到所要求的水深,并用線段表示(運行結(jié)果如圖6所示)。

圖6 任意點水深計算運行界面Fig.6 Water depth calculation operation interface of any point

4 結(jié)語

本文在GUI界面中設計了示圖顯示軸,實現(xiàn)了數(shù)據(jù)的可視化,用戶可以根據(jù)示圖效果來調(diào)整精度。在每次使用中,只需在相應的編輯文本框中輸入實測數(shù)值、單擊相應按鈕,就可實現(xiàn)對應求解。該方法簡單明了,真正實現(xiàn)了人機交互功能,十分方便工程人員多次重復使用。

借助于MATLAB GUI系統(tǒng)提供的操作功能,通過自行設置參數(shù)和設計GUI界面,不僅可以加深對數(shù)學模型的直觀認識,還可以體驗創(chuàng)造的樂趣。在MATLAB工具箱中,帶有很多數(shù)學函數(shù)程序,用戶能方便地調(diào)用它們,并可以編寫適用自己的各種應用程序,以節(jié)省大量的工作量。以MATLAB GUI為人機交互界面,建立完整的水力計算的數(shù)值計算系統(tǒng),可以解決各種復雜的水力計算問題。由于數(shù)值計算方法的通用性,該方法也具備解決諸多領域工程計算問題的能力。

[1]張宇華.MicrosoftExcel在水力計算中的應用[J].黃河水利職業(yè)技術學院學報,2009(10):16-19.

[2]羅全勝,王勤香.水力分析與計算[M].鄭州:黃河水利出版社,2011:111-113.

[3]霍倩.Matlab數(shù)值計算方法及其在水力計算中的應用[M].北京:中國建筑工業(yè)出版社,2013:138-139.

[4]呂良軍,郝振莉.MATLAB GUI在水力計算中的應用[J].黃河水利職業(yè)技術學院學報,2015(7):47-50.

[5]葉其孝,沈永歡.實用數(shù)學手冊[M].2版.北京:科學出版社,2006:63-79.

[6]呂良軍,梁童,張兵,等.梯形明渠特征水深計算的GUI實現(xiàn)[J].河南科學,2016(5):726-731.

[7]陳垚光,毛濤濤,王正林,等.精通MATLAB GUI設計[M].北京:電子工業(yè)出版社,2011:221-223.

[責任編輯 楊明慶]

Calculation of Natural River Course Cross-section of River Area Based on MATLAB GUI

Lu Liangjun,Li Feng,Hao Zhenli
(Yellow River Conservancy Technical Institute,Kaifeng 475004,Henan,China)

Based on MATLAB GUI system,it makes the man-machine interaction come true,researches the intelligent visual interface structure design,widget selection layout and function.Relying on the mathematical model,by the detail case of natural river course cross-section of river area calculation and depth,it discusses the design application of MATLAB GUI in complicated hydraulic calculation.

MATLAB GUI;hydraulic calculation;natural river course;mathematical model;system platform

TV131.4

A

10.13681/j.cnki.cn41-1282/tv.2017.03.004

2017-01-10

黃河水利職業(yè)技術學院科學技術項目:水力學計算的MATLAB數(shù)學實驗系統(tǒng)設計研究(2015KXJS011)。

呂良軍(1969-),男,浙江寧波人,副教授,主要從事高?;A數(shù)學教學與研究工作。

猜你喜歡
坐標軸控件水深
書法靜水深流
基于水深分段選擇因子的多光譜影像反演水深
多波束海底地形水深注記抽稀軟件對比
用坐標軸平移妙解斜率和(或積)為定值問題
基于.net的用戶定義驗證控件的應用分析
關于.net控件數(shù)組的探討
巧用仿射變換妙解高考解析幾何題
GPS RTK技術在水深測量中的應用
基于嵌入式MINIGUI控件子類化技術的深入研究與應用
數(shù)學問答
建水县| 临邑县| 栾城县| 鄢陵县| 宜黄县| 介休市| 平果县| 会昌县| 乌拉特中旗| 观塘区| 旬邑县| 广平县| 金溪县| 子长县| 肇州县| 茂名市| 班戈县| 崇信县| 太保市| 响水县| 上高县| 龙岩市| 来凤县| 上犹县| 敦化市| 军事| 兴业县| 远安县| 广昌县| 卢龙县| 大竹县| 阿城市| 武隆县| 木兰县| 铜梁县| 隆林| 神池县| 涿州市| 乌兰浩特市| 内江市| 桂阳县|