共轭梯度法 1

题目:

用共轭梯度法求解f (x 1, x 2) =x 12+x 22-x 1x 2-10x 1-4x 2+60 的极小值, ε≤0.001。 要求: 1、需编写一维搜索方法(进退法、黄金分割法);

2、在使用共轭梯度法梯度法进行搜索时可以调用一维搜索方法。

程序:

//***************************************************************************** //function: min f=x1*x1+x2*x2-x1*x2-10*x1-4*x2+60 //eps=0.001

//method:gradient

//***************************************************************************** #include #include #include //原函数

#define f(x1,x2) x1*x1+x2*x2-x1*x2-10*x1-4*x2+60 //梯度模

#define tdm(x1,x2) sqrt((2*x1-x2-10)*(2*x1-x2-10)+(2*x2-x1-4)*(2*x2-x1-4)) //x1的偏导数

#define G1(x1,x2) 2*x1-x2-10 //x2的偏导数

#define G2(x1,x2) 2*x2-x1-4

//一维搜索

//进退法求搜索区间

const float eps=0.001; //eps为计算精度;

double HJFC(double x1[],double s1[]) {

int k=1,i,j; double a0=1,b0=0.5,a1,b1,a[3],f[3],y[3][2],m,n,ak2,c; //a0为初始步长,b0为初始步长增量;a1,b1为进退法确定的最终区间; a[0]=a0; a[1]=a0+b0; for(i=0;i

f[i]=f(y[i][0],y[i][1]); if(f[0]>f[1]) while(k) { b0=2*b0; a[2]=a[1]+b0; for(j=0;jf[1]) { m=a[0]; n=a[2]; k=0; } else { k=1; a[1]=a[2]; f[1]=f[2]; } } else while(k) { b0=2*b0; a[2]=a[0]-b0; for(j=0;jf[0]) { m=a[2]; n=a[1]; k=0; } else { k=1; a[0]=a[2]; f[0]=f[2]; } }

//黄金分割法求最佳步长

a1=m; b1=n;

a[0]=n-0.618*(n-m); a[1]=m+0.618*(n-m); for(i=0;i

f[i]=f(y[i][0],y[i][1]); do {

if(f[0]

a[0]=n-0.618*(n-m); for(j=0;jeps); ak2=(m+n)/2; return ak2; }

//共轭梯度法

void main() {

double x[2],s[2],g[4],bita,arph; //x数组为函数解的转置矩阵;s 数组为搜索方向的转置矩阵;g 数组为梯度转置矩阵;arph 为最优步长; int k=1; //k为迭代次数; //赋初值; printf("请输入初始x1、x2:\n\n"); scanf("%d %d",&x[0],&x[1]); printf("过程如下:\n\n"); g[0]=G1(x[0],x[1]); g[1]=G2(x[0],x[1]); while (tdm(x[0],x[1])>eps) //迭代终止准则; { if(k==1) {

s[0]=-g[0]; s[1]=-g[1]; bita=0; } else {

bita=(g[0]*g[0]+g[1]*g[1])/(g[2]*g[2]+g[3]*g[3]); s[0]=-g[0]+bita*s[0]; s[1]=-g[1]+bita*s[1]; } arph=HJFC(x,s); x[0]=x[0]+arph*s[0]; x[1]=x[1]+arph*s[1]; g[2]=g[0]; g[3]=g[1];

g[0]=G1(x[0],x[1]); g[1]=G2(x[0],x[1]);

printf("第%d次迭代:\n\n",k); printf("步长steplength=%f\t",arph); printf("bb=%f\t\n",bita);

printf("x[0]=%f\tx[1]=%f\n\n\n",x[0],x[1]); k++; } k--;

printf("最后结果为:\n");

printf("最优解为: \nx[0]=%f\nx[1]=%f\n最小值为:min=%f\n迭代次数为:n=%d\n",x[0],x[1],f(x[0],x[1]),k); }

界面截图:

题目:

用共轭梯度法求解f (x 1, x 2) =x 12+x 22-x 1x 2-10x 1-4x 2+60 的极小值, ε≤0.001。 要求: 1、需编写一维搜索方法(进退法、黄金分割法);

2、在使用共轭梯度法梯度法进行搜索时可以调用一维搜索方法。

程序:

//***************************************************************************** //function: min f=x1*x1+x2*x2-x1*x2-10*x1-4*x2+60 //eps=0.001

//method:gradient

//***************************************************************************** #include #include #include //原函数

#define f(x1,x2) x1*x1+x2*x2-x1*x2-10*x1-4*x2+60 //梯度模

#define tdm(x1,x2) sqrt((2*x1-x2-10)*(2*x1-x2-10)+(2*x2-x1-4)*(2*x2-x1-4)) //x1的偏导数

#define G1(x1,x2) 2*x1-x2-10 //x2的偏导数

#define G2(x1,x2) 2*x2-x1-4

//一维搜索

//进退法求搜索区间

const float eps=0.001; //eps为计算精度;

double HJFC(double x1[],double s1[]) {

int k=1,i,j; double a0=1,b0=0.5,a1,b1,a[3],f[3],y[3][2],m,n,ak2,c; //a0为初始步长,b0为初始步长增量;a1,b1为进退法确定的最终区间; a[0]=a0; a[1]=a0+b0; for(i=0;i

f[i]=f(y[i][0],y[i][1]); if(f[0]>f[1]) while(k) { b0=2*b0; a[2]=a[1]+b0; for(j=0;jf[1]) { m=a[0]; n=a[2]; k=0; } else { k=1; a[1]=a[2]; f[1]=f[2]; } } else while(k) { b0=2*b0; a[2]=a[0]-b0; for(j=0;jf[0]) { m=a[2]; n=a[1]; k=0; } else { k=1; a[0]=a[2]; f[0]=f[2]; } }

//黄金分割法求最佳步长

a1=m; b1=n;

a[0]=n-0.618*(n-m); a[1]=m+0.618*(n-m); for(i=0;i

f[i]=f(y[i][0],y[i][1]); do {

if(f[0]

a[0]=n-0.618*(n-m); for(j=0;jeps); ak2=(m+n)/2; return ak2; }

//共轭梯度法

void main() {

double x[2],s[2],g[4],bita,arph; //x数组为函数解的转置矩阵;s 数组为搜索方向的转置矩阵;g 数组为梯度转置矩阵;arph 为最优步长; int k=1; //k为迭代次数; //赋初值; printf("请输入初始x1、x2:\n\n"); scanf("%d %d",&x[0],&x[1]); printf("过程如下:\n\n"); g[0]=G1(x[0],x[1]); g[1]=G2(x[0],x[1]); while (tdm(x[0],x[1])>eps) //迭代终止准则; { if(k==1) {

s[0]=-g[0]; s[1]=-g[1]; bita=0; } else {

bita=(g[0]*g[0]+g[1]*g[1])/(g[2]*g[2]+g[3]*g[3]); s[0]=-g[0]+bita*s[0]; s[1]=-g[1]+bita*s[1]; } arph=HJFC(x,s); x[0]=x[0]+arph*s[0]; x[1]=x[1]+arph*s[1]; g[2]=g[0]; g[3]=g[1];

g[0]=G1(x[0],x[1]); g[1]=G2(x[0],x[1]);

printf("第%d次迭代:\n\n",k); printf("步长steplength=%f\t",arph); printf("bb=%f\t\n",bita);

printf("x[0]=%f\tx[1]=%f\n\n\n",x[0],x[1]); k++; } k--;

printf("最后结果为:\n");

printf("最优解为: \nx[0]=%f\nx[1]=%f\n最小值为:min=%f\n迭代次数为:n=%d\n",x[0],x[1],f(x[0],x[1]),k); }

界面截图:


相关文章

  • 机器学习中的梯度下降法
  • 最优化问题是机器学习算法中非常重要的一部分,几乎每一个机器学习算法的核心都是在处理最优化问题. 本文中我讲介绍一些机器学习领域中常用的且非常掌握的最优化算法,看完本篇文章后你将会明白: * 什么是梯度下降法?  * 如何将梯度下降法运用到线 ...查看


  • 功能梯度材料1217020321
  • 功能梯度材料的制备.应用与发展状况及展望 摘要:近年来,功能梯度材料(Functionally Gradient Materials ,FGM) 由于其优异的性能和特殊的功能,得到了迅速发展,展现出极大的应用价值.FGM 的制备方法主要有粉 ...查看


  • 功能梯度材料
  • 功能梯度材料(Functionally Graded Material,简称FGM)是以计算机辅助设计为基础,采用先进的材料制备技术,使材料的组成,结构沿厚度方向呈梯度变化.从而使材料的性能也呈梯度变化的一种新型材料.他是1987年由日本学 ...查看


  • 磁共振成像的基本原理和概念
  • 磁共振成像的基本原理和概念 我是新手,不知如何发帖 第一节 磁共振成像仪的基本硬件 医用MRI仪通常由主磁体.梯度线圈.脉冲线圈.计算机系统及其他辅助设备等五部分构成. 一.主磁体 主磁体是MRI仪最基本的构件,是产生磁场的装置.根据磁场产 ...查看


  • 四种作用力
  • 引起空气微团运动的四种作用力及其在风的形成过程 中所起的作用 摘要:引发空气微团运动的四种作用力在风的形成中起了重要的作用,这些作用通过相互的影响并与自然界的温度,凹凸物等产生空气相对地面所形成的运动. 关键字:空气微团作用力气压 空气微团 ...查看


  • 区域梯度教育结构与对口支援西部高校的反梯度
  • 第27卷总第117期2009年第4期 科学・经济・社会V01.27-SumNo.117 No.4.2009 SC皿NCE・ECoNOMY・SoC玎£TY 区域梯度教育结构与对口支援西盎R吉日I)同校的反梯度 董海军,曾东霞 (中南大学公共管 ...查看


  • 梯度移民政策
  • 多予放活 有序流动 全力促进我县农村人口梯度转移 "四个流动"改革试点工作稳步推进 --访县农村人口梯度转移办公室主任李继安 我县从4月下旬开始,全面启动了农村人口梯度转移" 四个流动" 改革试点工作 ...查看


  • 压力梯度力
  • 压力梯度力 一.压力梯度力的基本概念 影响大气运动的作用力有很多,大体上可划分为基本力(牛顿力)和视示力(外观力),具体见下表: 压力梯度力 基本力(牛顿力) 地心引力 摩擦力 作用于空气的力 惯性向心力 视示力(外观力) 地转偏向力 其中 ...查看


  • 高梯度磁分离技术在环境保护中的应用_颜幼平
  • 总第93期 环 境 保 护 科 学 V o l . 25 N o 13 1999 ・水污染防治・ 高梯度磁分离技术在环境保护中的应用 A pp lica tion of GH MS Te chno logy fo r Env ironm e ...查看


  • 高梯度磁分离技术的应用
  • 高梯度磁分离技术的应用 作者:一新祥宇 高梯度磁分离技术在废水处理中的应用范围非常广泛,几乎涉及到所有水处理领域,这是由于它比传统的废水处理技术有许多独特的优点.该技术广泛应用于造纸废水.糖蜜酒精废水[20].城市污水.含油废水.电镀废水. ...查看


热门内容