梯度下降法

西安电子科技大学

——电子工程学院

最优化方法及应用(1)

上机报告

题 目: 最速下降法求最优解 任课老师:_____ ___xxxxxx__ _______________ 姓 名:_________ xxxxxx___ _______________

学 号:_________ _xxxxxxxx_______ _________ 班 级:________ 02951_____ _ ___________

一、问题叙述: 编程求解函数:

f(X)(x110x2)25(x3x4)2(x22x3)410(x1x4)4

的最小值点及最小值。

二、问题分析

实现方法:最速下降法(C语言) 其中一维线性搜索用黄金分割法。

三、代码

//

//用最速下降法求解

minf(X)=minf(x)=(x1+10*x2)^2+5(x3-x4)^2+(x2-2*x3)^4+10(x1-x4)^4,e=0.001。

#include "stdafx.h" #include #include using namespace std; #define _accuracy 0.001

//plusx() /*

void plusx(float x[4],float g[4],float t){ x[0] += t*g[0];

x[1] += t*g[1]; x[2] += t*g[2]; x[3] += t*g[3];

// 1_Steep.cpp : Defines the entry point for the console application.

}*/

/********** f() *********/ float f(float x[4]){ float sum = 0.0; } //

void plusx(float x1[4],float x0[4],float g[4],float t){ x1[0] = x0[0]+t*g[0]; x1[1] = x0[1]+t*g[1];

sum += (x[0]+10*x[1])*(x[0]+10*x[1]);

sum += 5*(x[2]-x[3])*(x[2]-x[3]);

sum += (x[1]-2*x[2])*(x[1]-2*x[2])*(x[1]-2*x[2])*(x[1]-2*x[2]); sum += 10*(x[0]-x[3])*(x[0]-x[3])*(x[0]-x[3])*(x[0]-x[3]); return sum;

x1[2] = x0[2]+t*g[2];

x1[3] = x0[3]+t*g[3]; }

//searchRange()

void searchRange(float &a,float &b,float x[4],float g[4]){ }

float t0=10,t1=10,t2=2; float h=1; float xi=2; float f0,f1; float x1[4]; int k=0;

while (1)

{ f0 = f(x); }

t2 = t1+h;

plusx(x1,x,g,t2); f1 = f(x1); if (f1

h = xi*h; t0 = t1; t1 = t2; f0 = f1; k++;

continue;

}

else if(0==k) { }

h = -h; t0 = t2; continue;

else { a=(t0

b=(t0

//gold()

void gold(float &a,float &b,float x[4],float g[4]){

float t1,t2;

float x1[4],x2[4]; t2=a+0.382*(b-a);

}

plusx(x2,x,g,t2); t1=a+b-t2;

plusx(x1,x,g,t1); float f1,f2; f1=f(x1); f2=f(x2);

if(f1f2) b=t1; else {a=t2;b=t1;}

/*********************** grad() *****************************/ int grad(float X[4],float g[4]){ g[0]=2*(X[0]+10*X[1])+40*(X[0]-X[3])*(X[0]-X[3])*(X[0]-X[3]); }

/******************** linesearch() *********************/ int linesearch(float Xk1[4],float Xk0[4],float g[4]){ float mina,maxb,Lanbuda; /* searchRange(mina,maxb,Xk0,g);*/ mina = -100;

maxb =100;

while (maxb-mina>_accuracy) { }

Lanbuda = (mina+maxb)/2; plusx(Xk1,Xk0,g,Lanbuda);

gold(mina,maxb,Xk0,g);

g[1]=20*(X[0]+10*X[1])+4*(X[1]-2*X[2])*(X[1]-2*X[2])*(X[1]-2*X[2]); g[2]=10*(X[2]-X[3])-8*(X[1]-2*X[2])*(X[1]-2*X[2])*(X[1]-2*X[2]); g[3]=0-10*(X[2]-X[3])-40*(X[0]-X[3])*(X[0]-X[3])*(X[0]-X[3]); /*float sum = g[0]+g[1]+g[2]+g[3]; g[0] = g[0]/sum; g[1] = g[1]/sum; g[2] = g[2]/sum; g[3] = g[3]/sum;*/ return 0;

return 0; }

/************************main()*****************************/

int main(int argc, char* argv[]) { }

float X0[4]={10,10,10,10},X1[4]={10,10,10,10}; float f0,f1,g[4]; f0=f(X0); grad(X0,g); int k=0;

while(1){ if(0==g[0]*g[0]+g[1]*g[1]+g[2]*g[2]+g[3]*g[3]) break;

linesearch(X1,X0,g); f1=f(X1); grad(X1,g);

if (_accuracy>=g[0]*g[0]+g[1]*g[1]+g[2]*g[2]+g[3]*g[3]) break; X0[0] = X1[0]; X0[1] = X1[1]; X0[2] = X1[2]; X0[3] = X1[3]; /*if(k

printf("minf(X)=%.3f\n",f1);

数%d:\tX=[%.3f,%.3f,%.3f,%.3f]\t",++k,X0[0],X0[1],X0[2],X0[3]);

}*/

printf("迭代次数%d:\tX=[%.3f,%.3f,%.3f,%.3f]\t",++k,X0[0],X0[1],X0[2],X0[3]); printf("minf(X)=%.3f\n",f1); f0=f1; }

printf("target:X=[%.3f,%.3f,%.3f,%.3f]\n",X0[0],X0[1],X0[2],X0[3]); printf("minf(X)=%.3f\n",f1); // cout.unsetf(ios::scientific); // //

cout

return 0;

四、运行结果及分析

运行结果:

函数f(X)(x110x2)25(x3x4)2(x22x3)410(x1x4)4 精度:0.001

起始X=[10,10,10,10] 前20次迭代:

共迭代493次:

可见最速下降法迭代次数很多,收敛速度较慢。

西安电子科技大学

——电子工程学院

最优化方法及应用(1)

上机报告

题 目: 最速下降法求最优解 任课老师:_____ ___xxxxxx__ _______________ 姓 名:_________ xxxxxx___ _______________

学 号:_________ _xxxxxxxx_______ _________ 班 级:________ 02951_____ _ ___________

一、问题叙述: 编程求解函数:

f(X)(x110x2)25(x3x4)2(x22x3)410(x1x4)4

的最小值点及最小值。

二、问题分析

实现方法:最速下降法(C语言) 其中一维线性搜索用黄金分割法。

三、代码

//

//用最速下降法求解

minf(X)=minf(x)=(x1+10*x2)^2+5(x3-x4)^2+(x2-2*x3)^4+10(x1-x4)^4,e=0.001。

#include "stdafx.h" #include #include using namespace std; #define _accuracy 0.001

//plusx() /*

void plusx(float x[4],float g[4],float t){ x[0] += t*g[0];

x[1] += t*g[1]; x[2] += t*g[2]; x[3] += t*g[3];

// 1_Steep.cpp : Defines the entry point for the console application.

}*/

/********** f() *********/ float f(float x[4]){ float sum = 0.0; } //

void plusx(float x1[4],float x0[4],float g[4],float t){ x1[0] = x0[0]+t*g[0]; x1[1] = x0[1]+t*g[1];

sum += (x[0]+10*x[1])*(x[0]+10*x[1]);

sum += 5*(x[2]-x[3])*(x[2]-x[3]);

sum += (x[1]-2*x[2])*(x[1]-2*x[2])*(x[1]-2*x[2])*(x[1]-2*x[2]); sum += 10*(x[0]-x[3])*(x[0]-x[3])*(x[0]-x[3])*(x[0]-x[3]); return sum;

x1[2] = x0[2]+t*g[2];

x1[3] = x0[3]+t*g[3]; }

//searchRange()

void searchRange(float &a,float &b,float x[4],float g[4]){ }

float t0=10,t1=10,t2=2; float h=1; float xi=2; float f0,f1; float x1[4]; int k=0;

while (1)

{ f0 = f(x); }

t2 = t1+h;

plusx(x1,x,g,t2); f1 = f(x1); if (f1

h = xi*h; t0 = t1; t1 = t2; f0 = f1; k++;

continue;

}

else if(0==k) { }

h = -h; t0 = t2; continue;

else { a=(t0

b=(t0

//gold()

void gold(float &a,float &b,float x[4],float g[4]){

float t1,t2;

float x1[4],x2[4]; t2=a+0.382*(b-a);

}

plusx(x2,x,g,t2); t1=a+b-t2;

plusx(x1,x,g,t1); float f1,f2; f1=f(x1); f2=f(x2);

if(f1f2) b=t1; else {a=t2;b=t1;}

/*********************** grad() *****************************/ int grad(float X[4],float g[4]){ g[0]=2*(X[0]+10*X[1])+40*(X[0]-X[3])*(X[0]-X[3])*(X[0]-X[3]); }

/******************** linesearch() *********************/ int linesearch(float Xk1[4],float Xk0[4],float g[4]){ float mina,maxb,Lanbuda; /* searchRange(mina,maxb,Xk0,g);*/ mina = -100;

maxb =100;

while (maxb-mina>_accuracy) { }

Lanbuda = (mina+maxb)/2; plusx(Xk1,Xk0,g,Lanbuda);

gold(mina,maxb,Xk0,g);

g[1]=20*(X[0]+10*X[1])+4*(X[1]-2*X[2])*(X[1]-2*X[2])*(X[1]-2*X[2]); g[2]=10*(X[2]-X[3])-8*(X[1]-2*X[2])*(X[1]-2*X[2])*(X[1]-2*X[2]); g[3]=0-10*(X[2]-X[3])-40*(X[0]-X[3])*(X[0]-X[3])*(X[0]-X[3]); /*float sum = g[0]+g[1]+g[2]+g[3]; g[0] = g[0]/sum; g[1] = g[1]/sum; g[2] = g[2]/sum; g[3] = g[3]/sum;*/ return 0;

return 0; }

/************************main()*****************************/

int main(int argc, char* argv[]) { }

float X0[4]={10,10,10,10},X1[4]={10,10,10,10}; float f0,f1,g[4]; f0=f(X0); grad(X0,g); int k=0;

while(1){ if(0==g[0]*g[0]+g[1]*g[1]+g[2]*g[2]+g[3]*g[3]) break;

linesearch(X1,X0,g); f1=f(X1); grad(X1,g);

if (_accuracy>=g[0]*g[0]+g[1]*g[1]+g[2]*g[2]+g[3]*g[3]) break; X0[0] = X1[0]; X0[1] = X1[1]; X0[2] = X1[2]; X0[3] = X1[3]; /*if(k

printf("minf(X)=%.3f\n",f1);

数%d:\tX=[%.3f,%.3f,%.3f,%.3f]\t",++k,X0[0],X0[1],X0[2],X0[3]);

}*/

printf("迭代次数%d:\tX=[%.3f,%.3f,%.3f,%.3f]\t",++k,X0[0],X0[1],X0[2],X0[3]); printf("minf(X)=%.3f\n",f1); f0=f1; }

printf("target:X=[%.3f,%.3f,%.3f,%.3f]\n",X0[0],X0[1],X0[2],X0[3]); printf("minf(X)=%.3f\n",f1); // cout.unsetf(ios::scientific); // //

cout

return 0;

四、运行结果及分析

运行结果:

函数f(X)(x110x2)25(x3x4)2(x22x3)410(x1x4)4 精度:0.001

起始X=[10,10,10,10] 前20次迭代:

共迭代493次:

可见最速下降法迭代次数很多,收敛速度较慢。


相关文章

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


  • 线性方程组的最速下降法与共轭梯度法
  • 西京学院数学软件实验任务书 [实验课题] 线性方程组的最速下降法与共轭梯度法 [实验目的] 学习和掌握线性方程组的最速下降法与共轭梯度法的求解方法. [实验内容] 1.问题重述 对于线性方程组AX=b,即: ⎧a11x1+a12x2+ +a ...查看


  • 共轭梯度计算函数法
  • 机械优化设计大作业 --共轭梯度法计算函数 班级: 姓名: 学号: 指导老师: 1, 问题分析: 此问题为无约束优化问题,为了克服最速下降法的锯齿现象以提高其收敛速度,发展了一类共轭方向法,共轭梯度法是在共轭方向法的基础上改进的,是共轭方向 ...查看


  • 数种蓝宝石晶体生长方法
  • 蓝宝石晶体的生长方法 自1885年由Fremy.Feil和Wyse利用氢氧火焰熔化天然红宝石粉末与重铬酸钾而制成了当时轰动一时的"日内瓦红宝石",迄今人工生长蓝宝石的研究已有100多年的历史.在此期间,为了适应科学技术的 ...查看


  • 梯度双回波同相位和反相位肝脏MR成像
  • 梯度双回波同相位和反相位肝脏MR 成像 摘要:一个有用的工具,不仅局限于评价脂肪浸润或肝岛 梯度回波同相位和反相位T1加权序列已成为肝脏MR 成像的常规检查.这个序列主要用于发现一些常见病,如弥散性或局灶性的脂肪变性和肝岛,但由于运用了双回 ...查看


  • 机器学习理论篇1:机器学习的数学基础
  • 一.概述 我们知道,机器学习的特点就是:以计算机为工具和平台,以数据为研究对象,以学习方法为中心:是概率论.线性代数.数值计算.信息论.最优化理论和计算机科学等多个领域的交叉学科.所以本文就先介绍一下机器学习涉及到的一些最常用的的数学知识. ...查看


  • BP神经网络算法
  • 神经网络技术及其应用作业 题目:BP神经网络算法及应用 姓名: 学号: 2013020456 学院:管理科学学院 专业:基 础 数 学 BP神经网络算法及应用 第一部分 人工神经网络的发展历史 人工神经网络(Artificial Neura ...查看


  • 梯度下降与最小二乘法
  • 梯度下降与最小二乘法 #include "stdafx.h" #include "cv.h" #include "cxcore.h" #include "highgui. ...查看


  • 神经网络工具箱
  • 神经网络工具箱 版本6.0.4(R2010a版本)25-JAN-2010 图形用户界面的功能. nctool - 神经网络分类的工具. nftool - 神经网络拟合工具. nprtool - 神经网络模式识别工具. nntool - 神经 ...查看


  • 飞行员经典准则
  • 经典准则:高度每变化1000′,气压计压力就会随之变化大约1″. 例如:标准海平面压力=29.92″或1013mb 高度在1000′时的压力=28.92″或976mb 推论:高度每变化29英尺,气压计压力就会随之变化大约1mb . 经典准则 ...查看


热门内容