最速下降法 C语言

最速下降法 C语言

ID:39498527

大小:285.01 KB

页数:11页

时间:2019-07-04

最速下降法 C语言_第1页
最速下降法 C语言_第2页
最速下降法 C语言_第3页
最速下降法 C语言_第4页
最速下降法 C语言_第5页
资源描述:

《最速下降法 C语言》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、1.最速下降法#include"stdio.h"#include"math.h"doublefun1(doublex1,doublex2)/*定义函数fun1为目标函数*/{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;/*定义起始点为x1=0,x2=1,并定义精度为e=0.01*/g[0]=2*x1-2*x2+1;/*目标函数对x1求偏导*/g[1]=(-2)*x1+8*x2-3;/*目标函数对x2求偏导*/

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)/*判断,当m>e时进行以下循环*/{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]);/*根据梯度法(最速下降法),利用梯度和海赛矩阵*/x1=x1-g[0]*t;/*求步长t。根据步长和梯度方向求出新的x1,x2*/x2=x2-g[1]*t;printf("迭代次数%d

3、",k);printf("搜索方向-%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]));/*计算新的m*/printf("新的负梯度的模%f",m);k++;}y=fun1(x1,x2);/*当m不满足m>e的时候退出循环,并计算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)/*定义函数fun1为目标函数*/{doubley;y=x1*x1-2*x1*x2+4*x2*x2+x1-3*x2;returny;}doublefun2(doubleg[],doubled[])/*定义函数fun2为求步长的函数*/{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;/*定义起始点为x1=0,x2=1,并定义精度为e=0.01*/intk=1;g[0]=2*x1-2*x2+1;/*目标函数对x1求偏导*/g[1]=(-2)*x1+8*x2-3;/*目标函数对x2求偏导,求梯度*/m=(sqrt(g[0]*g[0]+g[1]*g[1]));/*对g[0]*g[0]+g[1]*g[1]求开方,将值赋给m*/while(m>e&&k<=200)/*判断,当m>e时进行以下循环

6、*/{if(k==1){d[0]=-g[0];d[1]=-g[1];beta=0;}/*计算因子beta*/else{beta=(g[0]*g[0]+g[1]*g[1])/(g[2]*g[2]+g[3]*g[3]);/*计算因子beta*/d[0]=-g[0]+beta*d[0];d[1]=-g[1]+beta*d[1];}t=fun2(g,d);/*计算步长*/x1=x1+d[0]*t;/*根据步长和搜索方向求出新的x1,x2*/x2=x2+d[1]*t;printf("迭代次数为%d",k);printf("梯度%f,%f,梯度的模%f",g[0],g

7、[1],m);printf("搜索方向%f,%f,计算因子%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;/*根据得到的x1,x2求出新的梯度,并将值*/g[1]=(-2)*x1+8*x2-3;/*赋给g[0],g[1],*/m=double(sqrt(g[0]*g[0]+g[1]*g[1]));/*计算新的m*/printf("新的负梯度的模%f",m);k++;}y=fun1(x1,x2);/*当m不满足m>e的时候退出

8、循环,并计

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。