畢業(yè)論文-線性二次型最優(yōu)控制器的MATLAB實現(xiàn)_第1頁
畢業(yè)論文-線性二次型最優(yōu)控制器的MATLAB實現(xiàn)_第2頁
畢業(yè)論文-線性二次型最優(yōu)控制器的MATLAB實現(xiàn)_第3頁
畢業(yè)論文-線性二次型最優(yōu)控制器的MATLAB實現(xiàn)_第4頁
畢業(yè)論文-線性二次型最優(yōu)控制器的MATLAB實現(xiàn)_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

湖北文理學院物理與電子工程學院

2014屆本科畢業(yè)論文

論文題目線性二次型最優(yōu)控制器的matlab實現(xiàn)

班級

姓名

學號

指導教師(職稱)

線性二次型最優(yōu)控制器的MATLAB實現(xiàn)

摘要:本文從線性二次型最優(yōu)控制器原理出發(fā),對象是現(xiàn)代控制理論中用狀態(tài)空間形式給出的線性系統(tǒng),目標函數(shù)為狀態(tài)和控制輸入的二次型函數(shù)。通過加權(quán)矩陣Q和R的一些選擇規(guī)則,利用MATLAB仿真分析參數(shù)Q和R的變化對最優(yōu)控制系統(tǒng)的影響,然后對其最優(yōu)控制矩陣進行求解。分別介紹了連續(xù)系統(tǒng)線性二次型最優(yōu)控制的MATLAB實現(xiàn),離散系統(tǒng)相形二次型最優(yōu)控制的MATLAB實現(xiàn)和最優(yōu)觀測器的MATLAB實現(xiàn)這三種研究方案,以不同的程序?qū)崿F(xiàn)其功能。

關(guān)鍵詞:MATLAB;線性二次型;最優(yōu)控制;矩陣

ApplyingMATLABtotheDesignoftheLinearQuadraticOptimalController

Abstract:Inthispaper,startingfromtheprincipleofthelinearquadraticoptimalcontroller,theobjectisgiventhelinearsystemusingtheformsofstatespaceinmoderncontroltheory,theobjectivefunctionisthetwotypeoffunctionofstateandcontrolinput.ThroughsomeselectionrulesoftheweightingmatricesQandR,analysisofthechangesofparametersQandRinfluenceontheoptimalcontrolsystembyusingMATLABsimulation,andthentosolvetheoptimalcontrolmatrix.RespectivelyintroducesthecontinuoussystemlinearquadraticoptimalcontrolMATLAB,DiscretesysteminquadraticoptimalcontrolMATLAB,TheoptimalobserverMATLABthesethreeresearchprograms.Realizeitsfunctioninadifferentprogram.

Keywords:MATLAB;Linearquadratic;Theoptimalcontrol;Matrix

目錄

1引言 1

1.1概述 1

1.2課題研究的背景、意義及研究概況 1

1.3本文研究的主要內(nèi)容 3

2最優(yōu)控制的基本概念 4

2.1最優(yōu)控制基本思想 4

2.2最優(yōu)控制問題的求解方法 5

2.3Q、R的選擇原則 6

2.4加權(quán)矩陣的調(diào)整 6

2.4.1廉價控制 6

2.4.2昂貴控制 7

2.5問題的闡述 8

2.6問題的求解 9

2.7利用仿真給定的控制系統(tǒng) 9

3最連續(xù)系統(tǒng)最優(yōu)控制的MATLAB實現(xiàn) 12

3.1連續(xù)系統(tǒng)線性二次型最優(yōu)控制 12

3.2連續(xù)系統(tǒng)線性二次型最優(yōu)控制的MATLAB實現(xiàn) 13

4離散系統(tǒng)線性二次型最優(yōu)控制的MATLAB實現(xiàn) 14

4.1離散系統(tǒng)穩(wěn)態(tài)線性二次型最優(yōu)控制 14

4.2離散系統(tǒng)線性二次型最優(yōu)控制的MATLAB實現(xiàn) 15

5最優(yōu)觀測器的MATLAB實現(xiàn) 16

5.1連續(xù)時不變系統(tǒng)的Kalman濾波 16

5.2Kalman濾波的MATLAB實現(xiàn) 17

4結(jié)論 19

[參考文獻] 2

0

致謝 2

1

1引言

1.1概述

近年來,仿真技術(shù)得到廣泛的應用與發(fā)展,在系統(tǒng)設(shè)計、目標與環(huán)境模擬、人員培訓等方面取得了豐碩成果,隨著計算機技術(shù)的快速發(fā)展,控制系統(tǒng)的計算機輔助設(shè)計與分析得到了廣泛應用,目前已經(jīng)達到了相當高的水平。在以數(shù)字計算機和應用軟件為基礎(chǔ)的數(shù)字仿真領(lǐng)域,以MATLAB為代表的優(yōu)秀系統(tǒng)軟件使得數(shù)字仿真技術(shù)進入到一個嶄新的階段。MATLAB是國際控制界應用最廣泛的計算機輔助設(shè)計與分析工具,它集數(shù)值分析、信號處理和圖形、矩陣運算顯示于一體,構(gòu)成了一個方便的、良好的用戶環(huán)境,其強大的科學計算與可視化功能,還有簡單易用的開放式可編程環(huán)境,使得MATLAB在控制領(lǐng)域的各個方面都得到了廣泛應用[1]。數(shù)字仿真CAD技術(shù)已經(jīng)成為當今工業(yè)自動化專業(yè)人員應該熟練掌握的基本技能?,F(xiàn)代控制理論中處理的問題是多變量問題,向量空間理論和矩陣是其主要的數(shù)學基礎(chǔ),它是對系統(tǒng)的狀態(tài)進行分析和綜合理論。最優(yōu)控制問題是在給定評價函數(shù)和限制條件下,尋找使系統(tǒng)性能指標最優(yōu)的控制問題。這里的評價函數(shù),也就是性能指標,是為了評價系統(tǒng)的優(yōu)劣所規(guī)定的標準,也稱作目標函數(shù);限制條件即約束條件,是物理上對系統(tǒng)所施加的一些限制;要尋找的控制規(guī)律也就是綜合控制器[2]。根據(jù)系統(tǒng)數(shù)學模型,選擇一個容許的控制規(guī)律,在一定條件下,使得控制系統(tǒng)在完成所要求的控制任務時使給定的某一個性能指標達到最優(yōu)值、極小值或極大值[3]。線性二次型最優(yōu)控制是一種廣泛使用的最優(yōu)控制系統(tǒng)設(shè)計方法。使用MATLAB軟件設(shè)計的GUI控制界面實現(xiàn)最優(yōu)控制,有較好的人機交互界面,易于使用[4]。

1.2課題研究的背景、意義及研究概況

最優(yōu)控制理論是50年代中期在空間技術(shù)的推動下開始形成和發(fā)展起來的。美國學者Behrman.R.E1957年提出的動態(tài)規(guī)劃和前蘇聯(lián)學者列夫?特里亞金1958年提出的極大值原理,兩者的創(chuàng)立只相差一年左右。對最優(yōu)控制理論的形成和發(fā)展起到了重要的作用[5]。線性系統(tǒng)在二次型性能指標下的最優(yōu)控制問題則是美國數(shù)學家和電氣工程師卡爾曼,R.E.在60年代初提出和解決的[6]。

在古典控制理論中,反饋控制系統(tǒng)的傳統(tǒng)設(shè)計方法有特別多的局限性,其中,最主要的缺點就是方法不嚴密,只是大量的靠試探。這種設(shè)計方法對于多輸入-多輸出系統(tǒng)和復雜系統(tǒng),不能得到令人滿意的設(shè)計結(jié)果[7]。另一方面,近年來,因為對控制系統(tǒng)質(zhì)量的要求越來越高,還有計算機在控制領(lǐng)域的應用越來越廣泛,因此最優(yōu)控制系統(tǒng)受到了很大的重視。最優(yōu)控制的目的是使系統(tǒng)的某種性能指標達到最佳,也就是說,利用控制作用可按照人們的意愿選擇一條達到目的地的最佳途徑。因此最優(yōu)是以選定的性能指標最優(yōu)為依據(jù)的??刂茊栴}包括控制對象、容許控制(輸入)的集合所要達到的控制目標。一般來說,達到一個目標的控制方式有很多,但實際上的時間、經(jīng)濟、環(huán)境、制造等方面有各種限制,所以可以實行的控制方式是有限的。當需要實行具體控制時,有必要選擇某一種控制方式,使得性能指標達到最優(yōu)值,這樣的問題就叫做最優(yōu)控制[8]。

最優(yōu)控制理論與航空、航天的制導、導航和控制技術(shù)密不可分。原因在于線性二次型問題的最優(yōu)解可以寫成統(tǒng)一的解析表達式和實現(xiàn)求解過程的規(guī)范化,并且可以簡單地利用狀態(tài)線性反饋控制律構(gòu)成閉環(huán)最優(yōu)控制系統(tǒng),能夠兼顧多項性能指標,工程和計算實現(xiàn)都非常簡單,因所以得到特別的重視,為

現(xiàn)代控制理論

中發(fā)展比較成熟的一部分[9]。LQR最優(yōu)控制利用廉價成本就可以使原系統(tǒng)達到較好的性能指標,并且方法簡單,便于實現(xiàn),同時利用Matlab強大的功能體系容易對系統(tǒng)實現(xiàn)仿真。隨著航天﹑航海﹑導航和控制技術(shù)不斷深入研究,系統(tǒng)的最優(yōu)化問題已經(jīng)成為一個重要的問題。

LQR(linearquadraticregulator)即線性二次型調(diào)節(jié)器,它的對象是現(xiàn)代控制理論以狀態(tài)空間形式給出線性系統(tǒng),而目標函數(shù)對象是狀態(tài)和控制輸入二次型函數(shù)。LQR最優(yōu)設(shè)計是指設(shè)計出的狀態(tài)反饋控制器K要使二次型目標函數(shù)J取最小值,而K由權(quán)矩陣Q與R唯一決定,所以Q、R的選擇尤為重要。圖形用戶界面GUI(GraphicalUserInterface)作為用戶與軟件交互的一種主要手段,已經(jīng)成為現(xiàn)代軟件的重要組成部分。

LQR理論是

現(xiàn)代控制理論

中發(fā)展最早也是最為成熟的一種狀態(tài)空間設(shè)計法。這種方法具有計算簡單,便于調(diào)整等優(yōu)點,特別可貴的是,LQR可得到狀態(tài)線性反饋的最優(yōu)控制規(guī)律,易于構(gòu)成閉環(huán)最優(yōu)控制。而且Matlab的應用為LQR理論仿真提供了條件,更為我們實現(xiàn)準、穩(wěn)、快的控制目標提供了方便[10]。對于線性系統(tǒng)的控制器設(shè)計問題,如果其性能指標是狀態(tài)變量和(或)

控制變量

的二次型函數(shù)的積分,那么這種動態(tài)系統(tǒng)的最優(yōu)化問題被稱為線性系統(tǒng)二次型性能指標的最優(yōu)控制問題,簡稱為線性二次型最優(yōu)控制問題或線性二次問題。

1.3本文研究的主要內(nèi)容

線性系統(tǒng)二次型最優(yōu)控制可以使系統(tǒng)的某些性能達到最優(yōu),在工程上用得比較廣泛,也是現(xiàn)代控制理論課程教學的重點和難點。但它的理論性較強,而且設(shè)計中運算量很大,這使得學生很難掌握設(shè)計思想的精髓。如果我們能夠利用MATLAB的強大計算功能和仿真能力,就能十分輕松的得到設(shè)計結(jié)果并且畫出系統(tǒng)的輸出響應曲線[11],這就大大提高了課程教學,分析研究的效率。本論文將以線性二次型為性能指標。

首先,本文將概述二次型最優(yōu)控制器在當今控制工程領(lǐng)域中的發(fā)展狀況與實際意義。

其次,本文將敘述最優(yōu)控制的理論部分,引入最優(yōu)控制的性能指標J,其中Q和R分別為對狀態(tài)變量和輸入變量的加權(quán)矩陣,矩陣S對控制系統(tǒng)的終值也給出某種約束。

最后,本文將研究Q和R矩陣參數(shù)對最優(yōu)控制器設(shè)計的影響,進行求解,仿真。

2最優(yōu)控制的基本概念

2.1最優(yōu)控制基本思想

假設(shè)線性時不變系統(tǒng)的狀態(tài)空間描述為:

2-1

線性二次型(LQ)最優(yōu)控制器的任務是設(shè)計u(t),使線性二次型最優(yōu)控制指標2-2

最小。其中Q(t)和R(t)分別是對狀態(tài)變量和輸入向量的加權(quán)矩陣,tf是控制作用的終止時間。矩陣S對控制系統(tǒng)的終值也給出某種約束,這樣的控制問題就叫做線性二次型(LinearQuadratic,簡稱LQ)最優(yōu)控制問題。對最優(yōu)控制來說,R(t)為對稱的正定矩陣,Q(t)為對稱的半正定矩陣。為了方便于工程應用,加權(quán)矩陣一般取為對角陣,則其對稱性自然滿足[12]。

為了求解LQ問題,取Hamilton函數(shù)

2-3

應用變分原理推導出LQ解滿足的必要條件:

其中,較為簡便的一種解法是:

而將對的求解轉(zhuǎn)換為對函數(shù)矩陣P(t)的求解,將代入上述公式中,可得函數(shù)矩陣P(t)應滿足的微分方程為

2-4

對它的求解可利用成熟的Euler方法。假設(shè)方程(1)的唯一對稱半正定解P(t),則LQ問題的解u(t)可以由下式給出:

2-5

上述LQ問題的一個特例是動態(tài)方程為定常的情形。在線性二次型指標J的表達式中,末值項表示在控制過程結(jié)束以后,對系統(tǒng)末態(tài)跟蹤誤差的要求;積分項表示在系統(tǒng)控制過程中,對系統(tǒng)動態(tài)跟蹤誤差加權(quán)平方和積分要求,是系統(tǒng)在控制過程中動態(tài)跟蹤誤差的總度量;積分項定量地刻畫了在整個控制過程中所消耗的控制能量[13]。

在輸入信號無約束時,最優(yōu)控制為線性,其表達式為:

2-6

式中K(t)是狀態(tài)反饋系數(shù)矩陣,它可以用下面的式子表示:2-7

對于線性定常系統(tǒng),當tf終值時間時,P(t)趨向于常數(shù)矩陣,也就是(d/dt)P(t)=0,因此它可以通過下面的代數(shù)Riccati方程解得,

2-8

此時,線性二次型指標J的表達式中不包含末值項,其最優(yōu)控制為:

2-9

式中反饋系數(shù)矩陣K為常數(shù)矩陣。

2.2最優(yōu)控制問題的求解方法

1.解析法

當性能指標與約束條件是顯示解析表達式時,適合用解析法。一般是用求導方法或變分方法解出最優(yōu)控制的必要條件,進而得到一組方程式或不等式,然后求解這組方程或不等式,最后得到最優(yōu)控制的解析解[14]。

2.數(shù)值計算法

當性能指標比較復雜或者不能用變量的顯函數(shù)表示時,可以采用試探法,就是直接搜索,逐步逼近,經(jīng)過若干次迭代,逐步逼近到最優(yōu)點。

3.梯度型法

這是一種解析與數(shù)值計算相結(jié)合的方法。

2.3Q、R的選擇原則

由原理可知,要求出最優(yōu)控制作用u,除了求解ARE方程外,加權(quán)矩陣的選擇也是非常重要的。而Q、R選擇沒有一般規(guī)律可循,一般取決于設(shè)計者的經(jīng)驗,常用的所謂試行錯誤法,就是選擇不同的Q、R代入計算比較結(jié)果來確定。這里只提供幾個選擇的一般原則:

1)Q、R都應該是對稱矩陣,Q為正半定矩陣,R為正定矩陣。

2)通常選用Q和R為對角線矩陣,實際應用中,一般將R值固定,然后改變Q的數(shù)值,最優(yōu)控制的確定通常在經(jīng)過仿真或?qū)嶋H比較后得到。當控制輸入只有一個時,R成為一個標量數(shù)(一般可直接選R=1)。

3)Q的選擇不唯一。這表明當?shù)玫降目刂破飨嗤瑫r,可以有多種Q值的選擇,其中總有一個對角線形式的Q[15]。

2.4加權(quán)矩陣的調(diào)整

系統(tǒng)的性能嚴重依賴于加權(quán)矩陣的選擇,所以說,事實上最優(yōu)性是針對當前加權(quán)矩陣選擇而言的,在一組Q和R矩陣下的最優(yōu)解并不能保證在其它Q和R矩陣下也有較好的結(jié)果。所以在這種設(shè)計方法中,所謂的“最優(yōu)”控制,還有許多人為的因素。

加權(quán)矩陣的選擇方法有廉價控制、昂貴控制、邊界控制和穩(wěn)定度設(shè)計等[16]。

2.4.1廉價控制

這里的“廉價控制”一詞是指控制作用的成本是很低的,所以為追求比較好的動態(tài)控制效果,可以使用任意大的控制信號。在這種情況下,對輸入信號的加權(quán)可以取得很小。也就是可以任意減小R的值。當然,單純從控制效果而言,我們希望有較好的動態(tài)控制效果,即系統(tǒng)的響應越快,振蕩越少越好。假設(shè)取R=0.001,Q不變,控制效果如圖1、圖2。

圖1實際控制力

圖2系統(tǒng)閉環(huán)階躍響應

由圖1和圖2可見,系統(tǒng)閉環(huán)階躍響應很快,而且沒有出現(xiàn)振蕩,但是系統(tǒng)的最大控制力卻要達到8000N。所以,控制效果和控制力是一對矛盾,選擇加權(quán)矩陣的目的就是要解決這個矛盾,就在滿足控制效果的條件下,使控制力也能符合要求,在本文中就是使控制力在2000N以下。

2.4.2昂貴控制

昂貴控制是指控制本身的成本很大,所以在實際控制中應減小控制量u(t)。在這種情況下,應該引入一個較大的R矩陣。本文所討論的問題應該是一個昂貴控制問題。經(jīng)過反復試算,最終取R=0.5,Q仍然為6階單位陣,結(jié)果如圖3、圖4所示。此時的控制效果比較理想,調(diào)節(jié)時間大約8s,而最大控制力也在2000N以下。

圖3系統(tǒng)實際控制力

圖4系統(tǒng)閉環(huán)階躍響應

此外,還有邊界控制和穩(wěn)定度設(shè)計。邊界控制是指在動態(tài)最優(yōu)控制問題中,加權(quán)矩陣S趨向于無窮大,這將約束邊界值出現(xiàn)的誤差。解決這樣問題的一種行之有效的方法是將S矩陣由Q代替,而Q為較大的數(shù)值。當Q→∞時,Q=0,這時的Riccati微分方程可以簡化成2-10

穩(wěn)定度設(shè)計是指使系統(tǒng)的閉環(huán)極點都位于S-平面的S=-α線左側(cè),其中α>0,這種控制策略稱作“-α穩(wěn)定度設(shè)計”[17]。

2.5問題的闡述

設(shè)系統(tǒng)為:2-11

而控制信號為u(t)=-Kx(t),試求最優(yōu)反饋增益矩陣K使二次性能指標:

極小,并仿真,輸出x1、x2、J的波形。

2.6問題的求解

根據(jù)系統(tǒng)的狀態(tài)空間方程,可以看出A=[01;00],B=[0;1],Q=[10;01],R=[1]。

控制系統(tǒng)工具箱供了lqr()函數(shù),用來依照給定的加權(quán)矩陣設(shè)計LQ最優(yōu)控制器,該函數(shù)的調(diào)用格式為:

[K,P]=lqr(A,B,Q,R)

式中:(A,B)為給定的的對象狀態(tài)方程模型;(Q,R)分別為加權(quán)矩陣Q和R;返回的向量K為狀態(tài)反饋向量,也就是控制器,P為Riccati代數(shù)方程的解。

在本題中,可用下面的MATLAB代碼求解K和P:

clear

A=[01;00];

B=[0;1];

Q=[10;01];

R=[1];

[K,P]=lqr(A,B,Q,R)

解得:K=[1.00001.7321]

因此,最優(yōu)控制信號為

2-12

2.7利用仿真給定的控制系統(tǒng)

將給定的控制系統(tǒng)進行變形,如下:

2-13根據(jù)以上方程組,利用SIMULINK對系統(tǒng)進行仿真,其中u(t)用x1(t),x2(t)負

反饋表示,.最終可做出仿真系統(tǒng),如圖5所示。

根據(jù)狀態(tài)空間方程,利用SIMULINK可畫出如圖1所示的仿真圖。

圖1仿真圖

當K=[1.00001.7321],即取最優(yōu)控制時,運行該仿真,求得J=7.61,并得出

圖5仿真圖

當K=[1.00001.7321],即取最優(yōu)控制時,運行該仿真,求得J=7.61,并得出了x1(t)、x2(t)、J的波形,如圖6,圖7,圖8所示。

圖6x1(t)的波形圖7x2(t)的波形

圖8J的波形

由圖6和圖7可知,系統(tǒng)的狀態(tài)向量[x1(t),x2(t)]T最終趨于0,而二次性能指標J同時趨于穩(wěn)定值7.61。至此,線性二次型最優(yōu)控制系統(tǒng)已經(jīng)仿真完成。

3最連續(xù)系統(tǒng)最優(yōu)控制的MATLAB實現(xiàn)

3.1連續(xù)系統(tǒng)線性二次型最優(yōu)控制

設(shè)線性連續(xù)定常系統(tǒng)的狀態(tài)方程為:

3-1

式中,維狀態(tài)向量;維控制向量,且不受約束;A為維常數(shù)矩陣,維常數(shù)矩陣。

系統(tǒng)的性能指標為:

3-2

式中,終端時間無限;維數(shù)適當?shù)某?shù)矩陣(常取維常數(shù)矩陣);為維數(shù)適當?shù)某?shù)矩陣,。若下列條件之一滿足:

(1)完全可控;

(2)為任意矩陣。

則有最優(yōu)反饋矩陣:

3-3

與唯一的最優(yōu)控制:

3-4

以及最優(yōu)性能指標:

3-5

式中,P為常值正定矩陣,它是以下黎卡提代數(shù)方程的唯一解:

3-6

閉環(huán)系統(tǒng):

3-7

是漸近穩(wěn)定的,其解為最優(yōu)軌線。

3.2連續(xù)系統(tǒng)線性二次型最優(yōu)控制的MATLAB實現(xiàn)

在MATLAB系統(tǒng)里,有特別提供的函數(shù)來求解連續(xù)系統(tǒng)線性二次型狀態(tài)調(diào)節(jié)器問題。其函數(shù)有l(wèi)qr()、lqr2()與lqry()。函數(shù)的調(diào)用格式為:

[K,S,E]=lqr(A,B,Q,R,N)

[K,S]=lqr2(A,B,Q,R,N)

[K,S,E]=lqry(sys,Q,R,N)

其中,輸入?yún)⒘縮ys為系統(tǒng)的模型;A為系統(tǒng)的狀態(tài)矩陣;B為系統(tǒng)的輸入矩陣;Q為給定的半正定實對稱矩陣;R為給定的正定實對稱矩陣;N代表更一般化性能指標中交叉乘積項的加權(quán)矩陣;輸出參量K為最優(yōu)反饋增益矩陣;S為對應Riccati方程的唯一正定解P(若矩陣A-BK是穩(wěn)定矩陣,則總有P的正定解存在);E為A-BK的特征值。

函數(shù)lqry()用來求解二次型狀態(tài)調(diào)節(jié)器的特例,是用輸出反饋替代狀態(tài)反饋,即有:

3-8

其性能指標則為:3-9

這種二次型輸出反饋控制稱為次優(yōu)(或準最優(yōu))控制。

4離散系統(tǒng)線性二次型最優(yōu)控制的MATLAB實現(xiàn)

4.1離散系統(tǒng)穩(wěn)態(tài)線性二次型最優(yōu)控制

設(shè)完全可控線性離散系統(tǒng)的狀態(tài)方程為:

4-1

式中,維狀態(tài)向量;控制向量,且不受約束;A為維非奇異矩陣,。

系統(tǒng)的性能指標為:

4-2

式中,維正定或半正定實對稱矩陣;正定實對稱矩陣;維正定或半正定實對稱矩陣。

最優(yōu)控制作用與最優(yōu)反饋矩陣可以有幾種不同的表達式。其中最有反饋矩陣之一為:

4-3

與之對應的最優(yōu)控制序列:

4-4

以及性能指標:

4-5

以上幾式中,P(k)為正定矩陣,它是以下黎卡提差分方程的正定解:

4-6

若控制步數(shù)N為無限值,即令,系統(tǒng)最優(yōu)控制的解成為穩(wěn)態(tài)解。系統(tǒng)的性能指標則改為:

4-7

4-8

4-9

對應的最優(yōu)控制序列為:

4-10

閉環(huán)系統(tǒng)的狀態(tài)方程為:

以及最優(yōu)性能指標仍為:

4-11

4.2離散系統(tǒng)線性二次型最優(yōu)控制的MATLAB實現(xiàn)

在MATLAB的工具箱里,有特別提供的函數(shù)來求解離散系統(tǒng)穩(wěn)態(tài)線性二次型狀態(tài)調(diào)節(jié)器問題。其函數(shù)有dlqr()與dlqry()。函數(shù)的調(diào)用格式為:

其中,輸入?yún)⒘緼為系統(tǒng)的狀態(tài)矩陣;B為系統(tǒng)的輸入矩陣;Q為給定的正定或半正定實對稱矩陣;R為給定的正定實對稱矩陣;N代表更一般化性能指標中交叉乘積項的加權(quán)矩陣。輸出參量K為離散最優(yōu)反饋增益矩陣;S為Riccati方程的唯一正定解P;E為A-BK的特征解。

函數(shù)dlqry()用來求解二次型狀態(tài)調(diào)節(jié)器的特例,這個特例就是用輸出反饋替代狀態(tài)反饋,即有:

4-12

其性能指標為:

4-13

5最優(yōu)觀測器的MATLAB實現(xiàn)

系統(tǒng)的Kalman濾波器就是最優(yōu)觀測器。對于帶有系統(tǒng)噪聲與量測噪聲的實際系統(tǒng),抑制或濾掉噪聲對系統(tǒng)的干擾及影響,對系統(tǒng)的狀態(tài)做出充分精確的估計。利用Kalman濾波器對系統(tǒng)進行最優(yōu)控制是非常有效的。

5.1連續(xù)時不變系統(tǒng)的Kalman濾波

給定系統(tǒng)的狀態(tài)方程與量測方程分別為:

5-1

5-2

式中,維狀態(tài)向量;控制向量,維量測向量;A為維非奇異矩陣,,維常數(shù)矩陣;為隨機噪聲干擾輸入,它是零均值的p維白噪聲過程;假定為隨機量測噪聲,是零均值的q維白噪聲過程。兩噪聲過程均平穩(wěn)且互不相關(guān)。即有:

此式中的為常數(shù)矩陣(叫做模型噪聲的協(xié)方差矩陣)。

。

此式中的為常數(shù)矩陣(叫做量測噪聲的協(xié)方差矩陣)。

令為狀態(tài)向量估計值與狀態(tài)向量的估計誤差值,為狀態(tài)向量的理論值,則有:

5-3

除上述假設(shè)外,還假定{C,A}是完全可觀測的。在這些假定均成立的條件下,使估計誤差平方和的期望值最?。ㄗ钚》讲钲E準則濾波估計)既有:

5-4

其最優(yōu)估計器為:

5-5

式中

5-6

其中為以下方程的解:

5-7

可以證明:方程的解就是估計誤差的協(xié)方差,而此協(xié)方差的跡()即為誤差方差。如是有:

5-8

5.2Kalman濾波的MATLAB實現(xiàn)

在MATLAB的工具箱里提供了函數(shù)來求解系統(tǒng)的kalman濾波器,函數(shù)的調(diào)用格式為:

其中,輸入?yún)⒘繛檫B續(xù)或離散系統(tǒng)帶擾動的狀態(tài)空間模型,當模型有兩個時,,;為模型噪聲的協(xié)方差矩陣;為量測噪聲的協(xié)方差矩陣;為可選項,它對應模型噪聲與量測噪聲的相關(guān)項。輸出參量為濾波器的狀態(tài)估計器,其狀態(tài)方程如下:

5-9

5-10

為濾波器的增益矩陣:為對應的方程的解,即估計誤差的協(xié)方差。

在MATLAB老版本的工具箱里,還提供了兩個配合使用的函數(shù)與來求解系統(tǒng)的濾波器。函數(shù)的調(diào)用格式為:

其中,輸入?yún)⒘?,為系統(tǒng)式中的對應參量;為模型噪聲的協(xié)方差矩陣;為量測噪聲的協(xié)方差矩陣;為可選項,它對應模型噪聲與量測噪聲的相關(guān)項;輸出參量為濾波器的增益矩陣;為對應的方程的解,即估計誤差的協(xié)方差;為估計器的閉環(huán)特征值。

函數(shù)的調(diào)用格式為:

這個函數(shù)用來生成連續(xù)系統(tǒng)的濾波器,即系統(tǒng)的狀態(tài)估計器。輸入?yún)⒘繛檫B續(xù)系統(tǒng)帶擾動的狀態(tài)空間模型,輸入?yún)⒘繛楹瘮?shù)求出的濾波器的增益矩陣。

對于連續(xù)系統(tǒng),用函數(shù)計算的濾波器的狀態(tài)估計器與用函數(shù)求出的濾波器,兩者應相等。

6結(jié)論

最優(yōu)控制是現(xiàn)代控制理論中的以狀態(tài)空間為理論的最優(yōu)控制算法,是當前振動控制中采用最普遍的控制器設(shè)計方法。它能解決的主要對象是結(jié)構(gòu)參數(shù)模型比較準確、激勵和測量的信號,使控制系統(tǒng)的性能指標實現(xiàn)最優(yōu)化的基本條件和綜合方法。相對于經(jīng)典控制來說,最優(yōu)控制有它顯著的優(yōu)勢,應用最優(yōu)理論設(shè)計的多輸入—多輸出與高階系統(tǒng),往往能得到比經(jīng)典控制設(shè)計的結(jié)果要滿意得多,此外,現(xiàn)代的諸多新型而又復雜的控制系統(tǒng)設(shè)計都需要在狀態(tài)空間模型下建立最優(yōu)控制策略。

本設(shè)計介紹了如何利用MATLAB提供的函數(shù),快捷而又方便地設(shè)計一個線性二次型最優(yōu)控制器的一般方法。有機地將LQ控制器算法與MATLAB仿真結(jié)合起來,實現(xiàn)以狀態(tài)空間形式為線性系統(tǒng)的設(shè)計和仿真。從線性二次型最優(yōu)控制的基本原理出發(fā),并給定了一個具體的控制系統(tǒng),利用MATLAB軟件對其最優(yōu)控制矩陣進行了求解,最后用SIMULINK對所求解的系統(tǒng)進行了仿真。通過仿真實驗,設(shè)計所得到的線性二次型最優(yōu)控制效果比較好,達到了設(shè)計的目的。這個方法能大大減輕設(shè)計者的工作量,而且參數(shù)修改也十分方便。仿真結(jié)果表明:該控制器能降低衰減率、改善控制系統(tǒng)的動態(tài)性能、穩(wěn)態(tài)輸出,控制效果良好,增強了其實用性。如果需要研究某參數(shù)變化對系統(tǒng)的影響時,還可以利用繪圖函數(shù)實現(xiàn)仿真,從而使控制器的設(shè)計、仿真和控制結(jié)果的顯示和分析都能快速而有效地完成。

[參考文獻]

[1]李國勇,最優(yōu)控制理論與應用.北京:國防工業(yè)出版社,2008

[2]王孝武,現(xiàn)代控制理論基礎(chǔ).第2版,北京:機械工業(yè)出版社,2006

[3]吳受章,最優(yōu)控制理論與運用.北京:機械工業(yè)出版社,2008

[4]涂健.控制系統(tǒng)的數(shù)字仿真與計算機輔助設(shè)計.武漢:華中工學院出版社,1985

[5]吳旭光,王新明.計算機仿真技術(shù)與運用.西安:西北工業(yè)大學出版社,1998

[6]肖田元,張燕云,陳加棟.系統(tǒng)仿真導論.北京:清華大學出版社,2007

[7]胡壽松.自動控制原理.北京:科學出版社,2007

[8]王沫然.MATLAB與科學計算.北京:電子工業(yè)出版社,2004

[9]熊光愣.控制系統(tǒng)仿真.北京:清華大學出版社,2000

[10]吳旭光,楊惠珍,王新明.計算機仿真技術(shù).北京:化學工業(yè)出版社,2005

[11]樓順天,于衛(wèi),閆華梁.MATLAB程序設(shè)計語言.西安電子科技大學出版社,1997

[12]熊光愣.連續(xù)系統(tǒng)仿真與離散事件系統(tǒng)仿真.北京:清華大學出版社,1991

[13]張若清,羅學科,王民.控制工程基礎(chǔ)及MATLAB實踐.北京:高等教育出版社,2008

[14]姚俊,馬松輝.Simulink建模與仿真.西安:西安電子科技大學出版社,2002

[15]劉衛(wèi)國.MATLAB程序設(shè)計與應用.北京:高等教育出版社,2006

[16]宋志安,徐瑞銀.MATLAB程序設(shè)計與應用.北京:高等教育出版社,2008

[17]黃忠霖,黃京.控制系統(tǒng)MATLAB計算及仿真.北京:國防工業(yè)出版社,2009

致謝

在論文完成之際,首先感謝指導老師宋立新教授對我的悉心指導和親切關(guān)懷。論文的寫作是枯燥艱辛但是又富有挑戰(zhàn)的。從論文的選題、文獻的采集、框架的設(shè)計和結(jié)構(gòu)的布局到最終的論文定稿,從內(nèi)容到格式,從標題到標點,宋老師給予了很多寶貴的意見和建議。在做畢業(yè)設(shè)計的這段時間,宋老師不厭其煩地幫助我解決設(shè)計中遇到的問題,糾正出現(xiàn)的錯誤,并為我每一步的前進指明方向,給予我很大的支持和鼓勵。在宋老師的嚴格要求和幫助下,我的研究工作才得以保質(zhì)保量地順利進行。

宋老師治學嚴謹,學識淵博,工作兢兢業(yè)業(yè),生活中平易近人,這不僅使我在學術(shù)上受益匪淺,更是讓我懂得了很多做人的道理。她的教誨必將令我終生銘記。在這次設(shè)計中,學生的動手能力和資料搜集能力在設(shè)計中也得到提升。有很多公式、數(shù)值、計算方法都需要我們?nèi)ツ托牡夭殚啎?,瀏覽資料,設(shè)計中需要用到輔助設(shè)計軟件的地方,也需要我們耐心的學習。掌握使用的要領(lǐng),運用到設(shè)計中去。最后匯總的時候,需要將之前各個階段的工作認真整理。畢業(yè)設(shè)計不僅能幫助學生檢驗大學四年的學習成果,更多的是畢業(yè)設(shè)計能幫助我們更加清楚的認識自我,磨練學生的意志與耐性,這將會為學生以后的工作和生活帶來很大的幫助。

畢業(yè)論文暫告收尾,這也意味著我在大學學習生活即將結(jié)束。回首過往,自己一生最寶貴的時光在這樣的校園當中,能在眾多學富五車、才華橫溢的老師們的熏陶下度過,特別榮幸。在這四年的時間里,我在思想上和學習上都受益匪淺。這除了自身努力外,還與各位老師、同學和朋友的關(guān)心、支持和鼓勵是分不開的。四年的大學生活,物電系的各位老師不僅在學業(yè)上給與我精心指導,同時還在思想、生活上給我以無微不至的關(guān)懷,在此謹向物電系的所有老師致以誠摯的謝意和崇高的敬意!我還要感謝那些和我一起度過四年大學生活的所有同學和朋友,四年的時間里,我們互相學習,互相幫助,和她們一起,我度過了快樂而充實的大學生活。正是由于她們的幫助和支持,我才能一步步走到今天,與她們一起的日子是我終生的財富。

最后,再次對給予我極大幫助的師長和同學們表示衷心感謝!附錄資料:不需要的可以自行刪除

Pascal/C/C++語句對比(補充版)

一、Helloworld

先看三種語言的樣例:

Pascal

begin

writeln(‘Helloworld’);

end.

C

#include<stdio.h>

intmain()

{

printf("Helloworld!\n");

return0;

}

C++

#include<iostream>

usingnamespacestd;

intmain()

{

cout<<"Helloworld!"<<endl;

return0;

}

從這三個程序可以看到一些最基本的東西。在Pascal中的begin和end,在C/C++里就是{};Pascal主程序沒有返回值,而C/C++返回0(好像在C中可以為NULL)。在C/C++中,main函數(shù)以前的是頭文件,樣例中C為stdio.h,C++除了iostream還有第二行的usingnamespacestd,這個是打開命名空間的,NOIP不會考這個,可以不管,只要知道就行了。

此外說明注釋單行用//,段落的話Pascal為{},C/C++為/**/。

**常用頭文件(模板)

#include<iostream>

#include<cstdio>

#include<cstdlib>

#include<cmath>

#include<ctime>

#include<string>

usingnamespacestd;

intmain()

{

……

system(“pause”);

return0;

}

二、數(shù)據(jù)類型及定義

這里只列出常用的類型。

1、整型

Pascal

C/C++

范圍

shortint

-

-128…127

integer

short

-32768…32767

longint

Int

-2147483648…2147483647

int64

longlong

-9223372036854775808…9223372036854775807

byte

-

0…255

word

unsignedshort

0…65535

longword

unsignedint

0…4294967295

qword

unsignedlonglong

0…18446744073709551615

**當對longlong變量賦值時,后要加LL

Longlongx=6327844632743269843LL

**如果位移x<<2LL

**Linux:printf(“%lld\n”,x);

**Windows:printf(“%I64d\n”,x);

2、實型

Pascal

C/C++

范圍

real

float

2.9E-39…1.7E38

single

-

1.5E-45…3.4E38

double

double

5.0E-324…1.7E308

3、字符即字符串

字符在三種語言中都為char,C里沒有字符串,只有用字符數(shù)組來代替字符串,Pascal和C++均為string。Pascal中字符串長度有限制,為255,C++則沒有。

字符串和字符在Pascal中均用單引號注明,在C/C++中字符用單引號,字符串用雙引號。

4、布爾類型

Pascal中為boolean,C/C++為bool。值均為True或False。C/C++中除0外bool都為真。

5、定義

常量的定義均為const,只是在C/C++中必須要注明常量的類型。在C/C++中還可以用宏來定義常量,此時不注明類型。

Pascal

C/C++

const

a=60;

b=-a+30;

d=‘‘;

constinta=60;

constintb=-a+30;

conststringd=“”;

defineMAXN501//這個是宏

**宏定義其實就是直接在程序相應的位置替換:

#definerandomizesrand(unsignedtime(NULL))

#definewaitfor(intw=0;w<100000;w++)

變量的定義,C/C++在定義的同時可以賦值:

Pascal

C/C++

var

a,b:integer;

c:char;

d:string;

inta,b=50;

charc=‘A’;

stringd;

boolflag;

三、輸入輸出

C/C++中沒有以回車作為結(jié)束的讀入方式(就本人所知)。”\n”表示換行。常規(guī)輸入輸出:

Pascal

C

C++

read(a);//讀入變量a

readln(a);//讀入變a,回車結(jié)束

write(a);//輸出a

writeln(a);//輸出a并換行

scanf(“%d”,&a);

printf(“%d”,a);

printf(“%d\n”,a);

cin>>a;

cout<<a;

cout<<a<<endl;

特別說明C++中cin一個字符的話會自動跳過空格和回車,Pascal和C則會讀入空格和回車。在Pascal中writeln(a:n:m)表示在n個字符寬的輸出域上輸出a保留m位小數(shù)。

例如:pascalwrite(a:6)c/c++printf(“%6d”,a)

Pascalwrite(a:6:2)c/c++printf(“%6.2f”,a)

C++如果用cout?(繁瑣??!)

需要加頭文件#inlude<iomanip>

cout<<setprecision(2)<<a;//作用永久

cout<<setw(6)<<a;//作用臨時

以下三個進制設(shè)定都是永久作用:

cout<<dec<<a;相當printf(“%d”,a);//十進制

cout<<hex<<a;相當printf(“%X”,a);//十六進制

cout<<oct<<a;相當printf(“%o”,a);//八進制

例如:cout<<12<<hex<<12<<oct<<12<<12<<endl;

輸出:12c1414

C的輸入輸出里面的字符串中%表示變量,%后面的字目表示變量類型。下面是類型表:

%hd

1個short型整數(shù)

%d

1個int型整數(shù)

%u

1個unsignedint型整數(shù)

%I64d

1個longlong型整數(shù)

%c

1個字符

%s

1個C字符串

%f

1個float型實數(shù)

%lf

1個double型實數(shù)

%10.4f

輸出1個總寬度為10,保留4位小數(shù)的實數(shù)

文件輸入輸出:

Pascal

assign(input,‘test.in’);

assign(output,‘test.out’);

reset(input);

rewrite(output);

read(a,b);

writeln(a,b);

close(input);

close(output);

C

FILE*fin=fopen(“test.in”,“r”);

FILE*fout=fopen(“test.out”,“w”);

fscanf(fin,“%d%d”,&a,&b);

fprintf(fout,“%d%d”,a,b);

fclose(fin);

fclose(fout);

C++

#include<fstream>

usingnamespacestd;

ifstreamfin(“test.in”);

ofstreamfout(“test.out”);

fin>>a>>b;

fout<<a<<b<<endl;

fin.close();

fout.close();

因為C++的讀入較慢,個人建議C++的話使用C的輸入方式。當然也有人用C的讀入,C++的輸出的,這種方式我們稱之為城鄉(xiāng)結(jié)合。

**中國計算機學會競賽須知發(fā)布的C讀寫程序:

(C++也能用,cin,cout,scanf,printf可混用)

#include<stdio.h>

intmain()

{

inta,b;

freopen(“sum.in”,”r”,stdin);

freopen(“sum.out”,”w”,stdout);

scanf(“%d%d”,&a,&b);

printf(“%d\n”,a+b);

return0;

}

或者:

freopen(“sum.in”,”r”,stdin);

freopen(“sum.out”,”w”,stdout);

ios::sync_with_stdio(false);\\取消同步,cin,cout的速度就不慢了??!

cin>>a>>b;

cout<<a+b<<endl;

return0;

以下擴充c/c++混用是可行的:

#include<iostream>

#include<cstdio>

usingnamespacestd;

intmain()

{

inta,b,c,d;

freopen("sum.in","r",stdin);

freopen("sum.out","w",stdout);

scanf("%d%d",&a,&b);

cin>>c>>d;

printf("%d\n",a+b);

cout<<a+b+c+d<<endl;

return0;

}

**如何判斷文件結(jié)束(EOF)?

C++

while(cin>>s>>n)

{

...

}

C

while(scanf(%s%d",s,&n)!=EOF)

{

...

}

四、賦值語句及運算符號

一一對應的關(guān)系

Pascal

C/C++

賦值運算

賦值

:=

=

基本運算

+

+

-

-

*

*

除(實數(shù))

/

/(double)

除法

取整

div

(int)/(int)

取余

mod

%

比較

等于

=

==

不等于

<>

!=

大于

>

>

大于等于

>=

>=

小于

<

<

小于等于

<=

<=

邏輯

and

&&

or

||

not

!

位運算

左移(*2)

shl

<<

右移(/2)

shr

>>

and

&

or

|

not

~

異或

xor

^

其他

增一

inc(x)

x++

減一

dec(x)

x--

在C/C++中對某個變量自身進行運算可以簡寫為

變量名運算符號=改變量

如x+=8就表示x=x+8,即inc(x,8)。

在C/C++里還存在一種三目運算

變量名=條件?值A(chǔ):值B

如x=x>0?x:-x;//表示若x>0則取x,否則取–x,

同ifx>0thenx:=xelsex:=-x;

五、條件語句

1、if

C/C++中if語句的條件必須要用括號括起來,后面不使用then。

Pascal

C/C++

ifa>bthenflag:=true

elseflag:=false;

if(a>b)flag=true;

elseflag=false;

2、多種分支

C/C++中為switch,Pascal為case:

Pascal

C/C++

casexof

1:inc(x);

2:dec(x);

elsex:=x*x;

end;

switch(x)

{

case1:x++;break;

case2:x--;break;

default:x*=x;

}

切記C/C++中一定要寫break,后果你可以去掉break,運行看看就知道了。

六、循環(huán)語句

1、for

Pascal

C/C++

for變量名:=初始值to(downto)終止值do

for(變量名=初始值;條件;改變方式)

fori:=5to10dodec(a);

//終止值大于初始值用to

fori:=5downto1dodec(a);

//終止值小于于初始值用downto

for(i=5;i<=10;i++)a--;

for(i=5;i>=1;i--)a--;

/*只要i滿足條件就會一直循環(huán)。

C/C++中i是實數(shù)、指針都可以*/

C/C++中for的特殊用法:

//變量為實數(shù)

for(doublei=1;i<=2;i*=1.01)

k++;

//變量為指針,->符號為間接引用,后面會提到。

for(type1*p=head->next;p;p=p->next)

printf(“%d”,p->k);

2、while

Pascal

C/C++

while條件do

while(條件)

whilei<>0dodec(i);

while(i!=0)i--;

//也可寫作while(i)i--;

//在C/C++中非0即為真。

3、repeat-until&do-while

Pascal

C/C++

repeat語句until結(jié)束條件;

do{}while(運行條件)

repeatint(i)untili>100;

do{i++;}while(i<=100);

七、數(shù)組

Pascal中數(shù)組的下標可以隨意定義,而C/C++下標始終為從0開始到(數(shù)組大小–1)。

Pascal

C/C++

定義

a:array[1..100]ofinteger;

b:array[1..10,1..10]ofint64;

inta[100];

intb[10][10];

含義

a為大小為100的integer數(shù)組,合法下標為1到100

b為大小為10*10的int64數(shù)組,合法下標為1,1到10,10

a為大小為100的int數(shù)組,合法下標為0到99

b為大小為10*10的int數(shù)組,合法下標為0,0到9,9;

使用

inc(a[21]);

b[2,2]:=b[1,1]+b[1,2]+b[2,1];

a[21]++;

b[1][1]=b[0][1]+b[0][0]+b[1][0];

數(shù)組清零

Pascal

C/C++

Fillchar(a,sizeof(a),0);

memset(a,0,sizeof(a));

//頭文件包含string.h

**如果要填最大:memset(a,127,sizeof(a))(但達不到INT_MAX)

如果要填最小:memset(a,128,sizeof(a))(但達不到INT_MIN)

如果填0:memset(a,0,sizeof(a))

如果填-1:memset(a,-1,sizeof(a))

八、字符串

C風格的字符串就是字符數(shù)組。

C++和Pascal的字符串使用基本相同,只是C++中字符串下標以0開始,Pascal以1開始。字符串處理很多這里不一一列舉,只寫最常用的幾個。

Pascal

C(包含<string.h>)

定義用:chars[]

C++(包含<string>)

定義用:strings

輸入

Readln(s);

Writeln(s);

Scanf(“%s”,s);

Printf(“%s\n”,s);

注:不能輸入輸出c++的字符串

Cin>>s;

Cout<<s<<endl;

注:可以輸入輸出c的字符串

查找

pos(‘a(chǎn)’,s);//不存在返回0

沒有

s.find(‘a(chǎn)’);//不存在返回-1

len=length(s);

Strlen(s)

len=s.size();或

Len=s.length();

復制

copy(st,pos,num);

st:=‘a(chǎn)bcde’;

s:=copy(st,3,2);

//s=‘cd’

Strcpy(s1,s2)

全部復制

Strncpy(s1,s2,n)

前n個復制

但沒有從第幾個開始的!

substr(pos,n)//返回從pos開始的長度為n的子串;

strings1=“abcde”,s2;

s2=s1.substr(2,2);

//s2=“cd”

插入

insert(obj,target,pos);

st:=‘helloworld’;

st:=insert(‘‘,st,6);

//st=‘helloworld’

沒有

insert(pos,s)//在pos位置處插入字符串s;

strings1=“0123”;

s1.insert(1,“XYZ”);//s1=“0XYZ123”

刪除

delete(st,pos,num);

st:=‘helloworld’;

st:=delete(st,6,1);

//st=‘helloworld’

沒有

erase(pos,n)//從pos位置開始刪除n個字符;

strings1="abcdefghi";

s1.erase(5,3);//得到"abcdei"

C++還有以下功能:

用s.replace(2,2,"ttt")可以部分替換

用s.empty()判斷是否為空

可訪問s[i],位置從0算起

可以s1+s2

可以s1=s2

可以比較s1==s2當然><=>=<=!=都可以比較。

C++字符串整串讀入:

getline(cin,s)和cin>>s的區(qū)別:

getline(cin,s)

cin>>s

一次性整行讀入,直至行末尾。

只讀入一個“單詞”,遇空格和行末停止。

例如輸入;Howareyou?

s=”Howareyou?”

讀入整串含空格

例如輸入;Howareyou?

s=”How”

如果三個都讀:cin>>s1>>s2>>s3

**C++數(shù)字與數(shù)值之間的轉(zhuǎn)換:

#include<iostream>

#include<string>

#include<sstream>//必須加入

usingnamespacestd;

intmain()

{

stringtext="152";

intnumber;

stringstreamss;

ss<<text;//可以是其他數(shù)據(jù)類型

ss>>number;//string->int

cout<<number+100<<endl;

ss<<number;//int->string

stringstr=ss.str();

return0;

}

九、過程和函數(shù)

1、過程

在C/C++中沒有過程,但可以把返回值為“空”的函數(shù)理解為過程。

Pascal

C/C++

無參過程

procedure過程名;

說明部分

begin語句部分end;

//說明部分、begin、end語句部分統(tǒng)稱為過程體

void函數(shù)名();

{

主體部分;

return;

}

帶參過程

procedure過程名(形參表)

過程體

void函數(shù)名(形參表)

過程體

值傳和址傳:當一個參數(shù)是值傳時,形參在子過程中相當于一個局部變量,對它的改變不影響實在的參數(shù)值。址傳則會影響。下例中a為值傳,b為址傳。初始a=5,b=5,運行后a=5,b=10;

Pascal

C/C++

vara,b:integer;

proceduredoit(a:integer;varb:integer);

begin

b:=a+b;

a:=a+b;

end;

begin

a:=5;

b:=5;

doit(a,b);

writeln(a,‘‘,b);

end.

voiddoit(inta,int&b)

{

\\a

認為值參,b認為變量傳參

b+=a;

a+=b;

return;

}

intmain()

{

inta=5,b=5;

doit(a,b);

cout<<a<<‘‘<<b;

return0;

}

**用若干地址傳參可以給調(diào)用者傳回若干值

Voidtryit(int&x,int&y,int&z)

調(diào)用時:tryit(a,b,c),可以傳回a,b,c的值。

**用數(shù)組名(也是地址)傳參可以傳回整組的數(shù)據(jù)

Voidtryit(inta[])

調(diào)用時:tryit(x),可以傳回整個數(shù)組。

例如:

voidtryit(inta[])

{

for(inti=0;i<=10;i++)a[i]=i*2;

return;

}

intmain()

{

intx[10];

tryit(x);

for(inti=0;i<=10;i++)

cout<<x[i]<<endl;

system("pause");

return0;

}

**用指向函數(shù)的指針作為參數(shù),可以執(zhí)行指定的函數(shù)。(略)

STL的兩個應用:

**C++快排函數(shù)

#include<algorithm>

Boolcom(inta,intb)

{

Returna>b;

}

Intmain()

{

Inta[10]={5,7,3,2,6,8,4,3,5,7};

Sort(a,a+10,com);//如果升序可以省略com.

For(inti=0;i<10;i++)

Cout<<a[i]<<”“;

}

**優(yōu)先隊列(以堆排為例)

#include<iostream>

#include<queue>

usingnamespacestd;

priority_queue<int>Q;

intmain()

{

intn,a;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論