資源描述:
《數(shù)學(xué)規(guī)劃 (最速下降法,c語言編程)》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、數(shù)學(xué)規(guī)劃課程設(shè)計題目:用最速下降法求解無約束非線性規(guī)劃問題姓名:學(xué)號:成績:2011年6月8用最速下降法求解無約束非線性規(guī)劃問題摘要:無約束非線性規(guī)劃問題是一類重要的數(shù)學(xué)規(guī)劃問題。文主要研究了用最速下降法也就是梯度法對無約束非線性規(guī)劃問題進行求解。對于一個無約束非線性規(guī)劃利用最速下降法求解,首先需要確定其優(yōu)化方向,此優(yōu)化方向應(yīng)該選擇為f在當(dāng)前點處的負(fù)梯度方向,利用一維搜索法找出沿此方向上的最小值及其對應(yīng)點,此后將該點作為新的出發(fā)點重復(fù)上述過程,直到達到允許的誤差為止。本文最后利用c++語言編程得到滿足允許
2、誤差內(nèi)的最優(yōu)解。本文主要對一個無約束非線性規(guī)劃問題的實例,首先利用上述迭代的方法,計算出各迭代點的函數(shù)值,梯度及其模。然后應(yīng)用c++語言編程,得到精確地最優(yōu)解,需迭代六次才使得,得到的最優(yōu)解為,。關(guān)鍵詞:最速下降法無約束非線性規(guī)劃最優(yōu)解8一、問題重述用最速下降法求解無約束非線性規(guī)劃問題:,設(shè)初始點取為,迭代到滿足允許誤差=0.01為止的精確解。二、問題分析2.1無約束非線性問題的最優(yōu)條件該問題是一個無約束非線性規(guī)劃問題,利用最少下降法求解該問題,無約束非線性規(guī)劃問題的最優(yōu)解所要滿足的必要條件和充分條件是我
3、們設(shè)計算法的依據(jù),為此有以下幾個定理。定理1設(shè)f:在點處可微,若存在,使,則向量p是f在點處的下降方向。定理2設(shè)f:在點處可微,若是無約束問題的局部最優(yōu)解,則有數(shù)學(xué)分析中我們已經(jīng)知道,使的點x為函數(shù)f的駐點或平穩(wěn)點。函數(shù)f的一個駐點可以是極小值點;也可以是極大值點;甚至也可能既不是極小值點也不是極大值點,因此稱它為函數(shù)f的鞍點,以上定理告訴我們,是無約束問題的局部最優(yōu)解的必要條件是:是其目標(biāo)函數(shù)f的駐點。定理3設(shè)f:在點處的Hesse矩陣存在,若,并且正定,則是無約束非線性問題的嚴(yán)格局部最優(yōu)解。一般而言,
4、無約束非線性問題的目標(biāo)函數(shù)的駐點不一定是無約束非線性問題的最優(yōu)解,但對于其目標(biāo)函數(shù)是凸函數(shù)的無約束凸規(guī)劃,下面定理證明了它的目標(biāo)函數(shù)的駐點就是它的整體最優(yōu)解。定理4設(shè)f:,,f是上的可微凸函數(shù)。若有,則是無約束問題的整體最優(yōu)解。2.2最速下降法的基本思想8最速下降法又稱為梯度法,是1847年由著名數(shù)學(xué)家Cauchy給出的,他是解析法中最古老的一種,其他解析方法或是他的變形,或是他的啟發(fā)得到的,因此它是最優(yōu)化方法的基礎(chǔ)。設(shè)無約束非線性規(guī)劃問題中的目標(biāo)函數(shù)f:在點處可微。最速下降法的基本思想是:從當(dāng)前點出發(fā),
5、取函數(shù)在點處下降最快的方向作為我們收索方向,由的Taylor展示知,略去的高階無窮小項不計,可見取時,函數(shù)值下降的最多,于是,我們可以夠造出最速下降法的迭代步驟。2.3無約束非線性規(guī)劃問題的迭代步驟解無約束非線性規(guī)劃問題的最速下降法計算步驟第1步選取初始點,給定終止誤差>0,令k=0;第2步計算,若,停止迭代,輸出,否則進行第3步;第3步?。坏?步進行一維搜索,求,使得,令,k=k+1。轉(zhuǎn)第2步。由以上計算步驟可知,最速下降法迭代終止時,求得的是目標(biāo)函數(shù)駐點的一個近似點。三、問題求解3.1對原無約束非線性
6、規(guī)劃迭代首先進行第一次迭代8則令,即=0,解得:所以,此時,又因為則進行第二次迭代則令,代入即可解得:所以此時,又因為則進行第三次迭代則令,代入即可解得:所以此時,又因為則進行第四次迭代8則令,代入即可解得:所以此時,又因為以上仍然沒有達到要求,即還需繼續(xù)迭代,直到滿足為止。3.2對原無約束非線性規(guī)劃進行c++語言編程求解就這樣無限的迭代下去,直到為止,為此,我們可以用c++語言編程得到,其算法設(shè)計如下圖(圖3-1)停取,k:=0計算是否求令k:=k+18圖(3-1)利用c++語言編程(源代碼如下):#i
7、nclude#includedoublelambda(doublex[2],doublep[2],doublea[2]){doublelam1,lam2;lam1=4*(pow(a[0],3)*x[0]*x[0]+pow(a[1],3)*x[1]*x[1]);lam2=-4*(pow(a[0]*x[0],2)+pow(a[1]*x[1],2));doubles;s=-lam2/(2*lam1);returns;}voidmain(){doublelamb,x[2],
8、a[2],p[2],g[2],e=0.01,y;inti=0;x[0]=4.0;x[1]=4.0;cout<<"輸入函數(shù)的系數(shù):a[0],a[1]:"<>a[i];p[0]=2*a[0]*x[0];p[1]=2*a[1]*x[1];g[0]=-p[0];g[1]=-p[1];i=0;//開始迭代將次數(shù)賦值為0cout<