資源描述:
《最速下降法 C語言》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、1.最速下降法#include"stdio.h"#include"math.h"doublefun1(doublex1,doublex2)/*定義函數(shù)fun1為目標(biāo)函數(shù)*/{doubley;y=x1*x1-2*x1*x2+4*x2*x2+x1-3*x2;returny;}voidmain(){doublet,x1=1,x2=1,e=0.01,g[2],y,m;intk=1;/*定義起始點(diǎn)為x1=0,x2=1,并定義精度為e=0.01*/g[0]=2*x1-2*x2+1;/*目標(biāo)函數(shù)對x1求偏導(dǎo)*/g[1]=(-2)*x1+8*x2-3;/*目標(biāo)函數(shù)對x2求偏導(dǎo)*/
2、m=(sqrt(g[0]*g[0]+g[1]*g[1]));/*對g[0]*g[0]+g[1]*g[1]求開方,將值賦給m*/while(m>e&&k<=200)/*判斷,當(dāng)m>e時(shí)進(jìn)行以下循環(huán)*/{t=((2*g[1]-2*g[0])*x1+(2*g[0]-8*g[1])*x2-g[0]+3*g[1])/(4*g[0]*g[1]-2*g[0]*g[0]-8*g[1]*g[1]);/*根據(jù)梯度法(最速下降法),利用梯度和海賽矩陣*/x1=x1-g[0]*t;/*求步長t。根據(jù)步長和梯度方向求出新的x1,x2*/x2=x2-g[1]*t;printf("迭代次數(shù)%d
3、",k);printf("搜索方向-%f,-%f,負(fù)梯度的模%f,步長%f",g[0],g[1],m,t);printf("x的值%f,%f",x1,x2);g[0]=2*x1-2*x2+1;g[1]=(-2)*x1+8*x2-3;m=(sqrt(g[0]*g[0]+g[1]*g[1]));/*計(jì)算新的m*/printf("新的負(fù)梯度的模%f",m);k++;}y=fun1(x1,x2);/*當(dāng)m不滿足m>e的時(shí)候退出循環(huán),并計(jì)算fun1,*/printf("分別輸出x1,x2%f,%f",x1,x2);/*將值賦給y,并輸出。*/printf
4、("極小值y%f",y);}2.FR共軛梯度法#include"stdio.h"#include"math.h"doublefun1(doublex1,doublex2)/*定義函數(shù)fun1為目標(biāo)函數(shù)*/{doubley;y=x1*x1-2*x1*x2+4*x2*x2+x1-3*x2;returny;}doublefun2(doubleg[],doubled[])/*定義函數(shù)fun2為求步長的函數(shù)*/{doublebuchang;buchang=-(g[0]*d[0]+g[1]*d[1])/(d[0]*(2*d[0]-2*d[1])+d[1]*((-2)*d[0]
5、+8*d[1]));returnbuchang;}voidmain(){doublet,beta,x1=1,x2=1,d[2],g[4],y,m,e=0.01;/*定義起始點(diǎn)為x1=0,x2=1,并定義精度為e=0.01*/intk=1;g[0]=2*x1-2*x2+1;/*目標(biāo)函數(shù)對x1求偏導(dǎo)*/g[1]=(-2)*x1+8*x2-3;/*目標(biāo)函數(shù)對x2求偏導(dǎo),求梯度*/m=(sqrt(g[0]*g[0]+g[1]*g[1]));/*對g[0]*g[0]+g[1]*g[1]求開方,將值賦給m*/while(m>e&&k<=200)/*判斷,當(dāng)m>e時(shí)進(jìn)行以下循環(huán)
6、*/{if(k==1){d[0]=-g[0];d[1]=-g[1];beta=0;}/*計(jì)算因子beta*/else{beta=(g[0]*g[0]+g[1]*g[1])/(g[2]*g[2]+g[3]*g[3]);/*計(jì)算因子beta*/d[0]=-g[0]+beta*d[0];d[1]=-g[1]+beta*d[1];}t=fun2(g,d);/*計(jì)算步長*/x1=x1+d[0]*t;/*根據(jù)步長和搜索方向求出新的x1,x2*/x2=x2+d[1]*t;printf("迭代次數(shù)為%d",k);printf("梯度%f,%f,梯度的模%f",g[0],g
7、[1],m);printf("搜索方向%f,%f,計(jì)算因子%f,步長%f",d[0],d[1],beta,t);printf("x的值%f,%f",x1,x2);g[2]=g[0];g[3]=g[1];g[0]=2*x1-2*x2+1;/*根據(jù)得到的x1,x2求出新的梯度,并將值*/g[1]=(-2)*x1+8*x2-3;/*賦給g[0],g[1],*/m=double(sqrt(g[0]*g[0]+g[1]*g[1]));/*計(jì)算新的m*/printf("新的負(fù)梯度的模%f",m);k++;}y=fun1(x1,x2);/*當(dāng)m不滿足m>e的時(shí)候退出
8、循環(huán),并計(jì)