潘隆武B09310524機(jī)制095鮑威爾法_第1頁
潘隆武B09310524機(jī)制095鮑威爾法_第2頁
潘隆武B09310524機(jī)制095鮑威爾法_第3頁
潘隆武B09310524機(jī)制095鮑威爾法_第4頁
潘隆武B09310524機(jī)制095鮑威爾法_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、鮑威爾共軛方向法實(shí)驗(yàn)報(bào)告姓名: 潘隆武 學(xué)號(hào):B09310534 班級(jí):機(jī)制09-5(2+2)一、 實(shí)驗(yàn)?zāi)康?. 加深對(duì)鮑威爾法的基本理論和算法步驟的理解。2. 培養(yǎng)獨(dú)立編制、調(diào)試計(jì)算機(jī)程序的能力。3. 掌握常用優(yōu)化程序的使用方法。4. 培養(yǎng)靈活運(yùn)用優(yōu)化設(shè)計(jì)方法解決工程實(shí)際問題的能力。二、 實(shí)驗(yàn)要求1. 明確鮑威爾法基本原理及程序框圖。2. 編制鮑威爾法程序。三實(shí)驗(yàn)內(nèi)容計(jì)算實(shí)例:用鮑威爾法求函數(shù)的極小值步驟一:利用matlab先畫出函數(shù)的圖線,并標(biāo)出關(guān)鍵點(diǎn),以備檢驗(yàn)程序的運(yùn)行結(jié)果是否正確,如圖a。圖a步驟二:通過編制鮑威爾法C語言程序求函數(shù)極小值.鮑威爾法基本原理簡述 任選一初始點(diǎn)X0,再選兩

2、個(gè)線性無關(guān)的向量。從X0出發(fā),順次沿e1、e2作一維搜索得、,兩點(diǎn)連線得一新方向d1,用d1代替e1形成兩個(gè)線性無關(guān)向量e2、d1,作為下一輪搜索方向。再從出發(fā),沿d1作一維搜索得點(diǎn),作為下一輪迭代的初始點(diǎn)。從X1出發(fā),順次沿e2、d1作一維搜索,得到點(diǎn)、,兩點(diǎn)的連線得一新方向d2。、兩點(diǎn)是從不同點(diǎn)X0、出發(fā),分別沿d1方向進(jìn)行一維搜索而得到的極小點(diǎn)。再從出發(fā),沿d2作一維搜索得點(diǎn)X2,即是二維問題的極小點(diǎn)X*。、程序的流程圖結(jié)束 i=n ? 判別條件是否滿足? 開始給定 .編制鮑威爾法程序#include "stdio.h"#include "stdlib.h&

3、quot;#include "math.h"double objf(double x) /*目標(biāo)函數(shù)子程序 */double ff; /*定義目標(biāo)函數(shù)*/ff=pow(10*(x1+x0-5),2)+pow(x1-x0),2);return(ff); /*返回目標(biāo)函數(shù)的計(jì)算值*/void jtf(double x0,double h0,double s,int n,double a,double b) /*確定搜索區(qū)間的進(jìn)退法(外推法)子程序*/int i;double *x3,h,f1,f2,f3;for(i=0;i<3;i+)xi=(double *)malloc

4、(n*sizeof(double); /*分配n個(gè)double型存儲(chǔ)單元,并將首地址存儲(chǔ)到指針變量xi中*/ h=h0; /*把初始步長h0賦給h*/for(i=0;i<n;i+) /*將初始點(diǎn)賦給x0*/*(x0+i)=x0i;f1=objf(x0); /*計(jì)算x0處的函數(shù)值*/for(i=0;i<n;i+) /*根據(jù)步長h正向搜索*/*(x1+i)=*(x0+i)+h*si;f2=objf(x1);if(f2>=f1) /*若f2>f1,則步長變號(hào),反向搜索*/ h=-h0; for(i=0;i<n;i+) *(x2+i)=*(x0+i); f3=f1; fo

5、r(i=0;i<n;i+) *(x0+i)=*(x1+i); *(x1+i)=*(x2+i); f1=f2; f2=f3; for(;) /*步長乘2繼續(xù)向前搜索直到函數(shù)值再次上升為止*/ h=2*h; for(i=0;i<n;i+) *(x2+i)=*(x1+i)+h*si; f3=objf(x2); if(f2<f3) break; else for(i=0;i<n;i+) *(x0+i)=*(x1+i); *(x1+i)=*(x2+i); f1=f2; f2=f3; if(h<0) /*搜索結(jié)束,根據(jù)h的正負(fù)把搜索得到的區(qū)間左、右端點(diǎn)分別賦給a、b*/ fo

6、r(i=0;i<n;i+) ai=*(x2+i); bi=*(x0+i); else for(i=0;i<n;i+) ai=*(x0+i); bi=*(x2+i); for(i=0;i<3;i+) free(xi); /*釋放x存儲(chǔ)單元的內(nèi)存*/double gold(double a,double b,double eps,int n,double xx) /*黃金分割法子程序*/int i;double f1,f2,*x2,ff,q,w;for(i=0;i<2;i+)xi=(double *)malloc(n*sizeof(double); /*分配n個(gè)double

7、型存儲(chǔ)單元,并將首地址存儲(chǔ)到指針變量xi中*/ for(i=0;i<n;i+) /*計(jì)算初始兩試點(diǎn)*/ *(x0+i)=ai+0.618*(bi-ai); /*計(jì)算右試點(diǎn)x0*/ *(x1+i)=ai+0.382*(bi-ai); /*計(jì)算左試點(diǎn)x1*/f1=objf(x0); /*計(jì)算初始右試點(diǎn)的函數(shù)值*/f2=objf(x1); /*計(jì)算初始左試點(diǎn)的函數(shù)值*/ do if(f1>f2) /*根據(jù)的f1、f2大小關(guān)系判斷消去區(qū)間*/ for(i=0;i<n;i+) /*消去左區(qū)間*/ bi=*(x0+i); *(x0+i)=*(x1+i); f1=f2; for(i=0;i

8、<n;i+) *(x1+i)=ai+0.382*(bi-ai); f2=objf(x1); else /*消去右區(qū)間*/ for(i=0;i<n;i+) ai=*(x1+i); *(x1+i)=*(x0+i); f2=f1; for(i=0;i<n;i+) *(x0+i)=ai+0.618*(bi-ai); f1=objf(x0); q=0;for(i=0;i<n;i+) q=q+(bi-ai)*(bi-ai);w=sqrt(q);while(w>eps); /*如果誤差不滿足收斂精度eps,進(jìn)行循環(huán)迭代,直到滿足收斂精度eps為止*/for(i=0;i<n

9、;i+) xxi=0.5*(ai+bi); /*輸出極小點(diǎn),即最小區(qū)間的中點(diǎn)作為極小值點(diǎn)的數(shù)值xxi*/ff=objf(xx); /*計(jì)算極小值點(diǎn)的函數(shù)值*/for(i=0;i<2;i+)free(xi); /*釋放xi所占的存儲(chǔ)單元的空間*/return(ff); /*返回運(yùn)行黃金分割法子程序的最終結(jié)果,即函數(shù)的極小值*/ double oneoptim(double x0,double s,double h0,double epsg,int n,double x) /*一維搜索子程序*/double *a,*b,ff;a=(double *)malloc(n*sizeof(doubl

10、e); /*分配n個(gè)double型存儲(chǔ)單元,并將首地址存儲(chǔ)到指針變量a中*/ b=(double *)malloc(n*sizeof(double); /*分配n個(gè)double型存儲(chǔ)單元,并將首地址存儲(chǔ)到指針變量b中*/ jtf(x0,h0,s,n,a,b); /*調(diào)用進(jìn)退法程序jtf( )確定搜索區(qū)間a,b*/ff=gold(a,b,epsg,n,x); /*調(diào)用黃金分割法程序gold( )確定每一個(gè)點(diǎn)的函數(shù)值*/free(a); /*釋放ai所占的存儲(chǔ)單元的空間*/free(b); /*釋放bi所占的存儲(chǔ)單元的空間*/return (ff); /*返回一維搜索子程序oneoptim( )的

11、最終結(jié)果,即函數(shù)的極小值*/ double powell(double p,double h0,double eps,double epsg,int n,double x) /*鮑威爾法子程序Powell()*/int i,j,m;double *xx4,*ss,*s;double f,f0,f1,f2,f3,fx,dlt,df,sdx,q,d;ss=(double *)malloc(n*(n+1)*sizeof(double); /*分配n*(n+1)個(gè)的double型存儲(chǔ)單元,并將首地址存儲(chǔ)到指針變量ss中*/ s=(double *)malloc(n*sizeof(double); /*

12、分配n個(gè)double型存儲(chǔ)單元,并將首地址存儲(chǔ)到指針變量s中*/ for(i=0;i<n;i+) for(j=0;j<=n;j+) /*確定搜索方向*/ *(ss+i*(n+1)+j)=0; *(ss+i*(n+1)+i)=1;for(i=0;i<4;i+)xxi=(double *)malloc(n*sizeof(double); /*分配n個(gè)double型存儲(chǔ)單元,并將首地址存儲(chǔ)到指針變量xxi中*/ for(i=0;i<n;i+)*(xx0+i)=pi; /*將給定的初始點(diǎn)賦給xx0*/for(;)for(i=0;i<n;i+) /*將給定的初始點(diǎn)賦給x*/

13、 *(xx1+i)=*(xx0+i); xi=*(xx1+i); f0=f1=objf(x); /*計(jì)算在初始點(diǎn)函數(shù)值*/ dlt=-1; for(j=0;j<n;j+) for(i=0;i<n;i+) /*依次按每個(gè)方向搜索*/ *(xx0+i)=xi; /*確定每次的搜索方向*/ *(s+i)=*(ss+i*(n+1)+j); f=oneoptim(xx0,s,h0,epsg,n,x); /*調(diào)用一維搜索子程序oneoptim()并返回每次搜索后求得的極小值*/ df=f0-f; /*計(jì)算函數(shù)下降值*/ if(df>dlt) /*如果函數(shù)下降值大于-1則交換j與m*/ d

14、lt=df; /*交換m與m的值*/ m=j; sdx=0; for(i=0;i<n;i+) /*計(jì)算誤差*/ sdx=sdx+fabs(xi-(*(xx1+i); if(sdx<eps) /*如果滿足精度要求*/ free(ss); free(s); for(i=0;i<4;i+) free(xxi); return(f); for(i=0;i<n;i+) *(xx2+i)=xi; f2=f; /*將終點(diǎn)的函數(shù)值賦給f2*/ for(i=0;i<n;i+) /*計(jì)算映射點(diǎn)*/ *(xx3+i)=2*(*(xx2+i)-(*(xx1+i); xi=*(xx3+i)

15、; fx=objf(x); /*計(jì)算映射點(diǎn)的函數(shù)值*/ f3=fx; /*將映射點(diǎn)的函數(shù)值賦給f3*/ q=(f1-2*f2+f3)*(f1-f2-dlt)*(f1-f2-dlt); d=0.5*dlt*(f1-f3)*(f1-f3); if(f3<f1)|(q<d) /*判斷是否需要換方向*/ /*不需要換*/ if(f2<=f3) /*判斷將終點(diǎn)還是將映射點(diǎn)賦給下一輪始點(diǎn)*/ for(i=0;i<n;i+) /*將終點(diǎn)賦給下一輪始點(diǎn)*/ *(xx0+i)=*(xx2+i); else /*將映射點(diǎn)賦給下一輪始點(diǎn)*/ for(i=0;i<n;i+) *(xx0+

16、i)=*(xx3+i); else /*去掉第r+1個(gè)方向,其它方向前移*/ for(i=0;i<n;i+) *(ss+(i+1)*(n+1)=xi-(*(xx1+i); *(s+i)=*(ss+(i+1)*(n+1); f=oneoptim(xx0,s,h0,epsg,n,x); /*按新方向搜索一次*/ for(i=0;i<n;i+) /*將映射點(diǎn)賦給下一輪始點(diǎn)*/ *(xx0+i)=xi; for(j=m+1;j<=n;j+) for(i=0;i<n;i+) *(ss+i*(n+1)+j-1)=*(ss+i*(n+1)+j); void main() /*主程序*

17、/ double p=1,2; /*設(shè)定使用鮑威爾法時(shí)的初始點(diǎn)為p(1,2)*/ double ff,x2; ff=powell(p,0.002,0.00000001,0.00000001,2,x); /*調(diào)用鮑威爾法子程序計(jì)算最終函數(shù)的極小值,并同時(shí)設(shè)定使用鮑威爾法時(shí)的初始點(diǎn)為p(1,2),外推法的初始步長h0為0.002, 鮑威爾法的精度為0.00000001,黃金分割法的精度為0.00000001,目標(biāo)函數(shù)的變量n為2個(gè),變量為x */ printf("n所求函數(shù)是:f(x)=10(x1+x2-5)2+(x1-x2)2"); printf("n使用鮑威爾法時(shí)的迭代初始點(diǎn)為:p(1,2)"); printf("n鮑威爾法的精度為:0.00000001"); printf("n外推法的初始步長:ho為0.002"); printf("n黃金分割法的精度為:0.00000001"); printf("n求得極值點(diǎn)坐標(biāo)為:x0=%f,x1=%f;極小值是:f(%f,%f

溫馨提示

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

評(píng)論

0/150

提交評(píng)論