用最速下降法求解无约束非线性规划问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
运
筹
学
实
习
报
告
姓名: xxxxxxxxxx 学号: xxxxxxxxxxx 专业班级: xxxxxxxxxxxx 2 0 1 3年 7 月 0 4 日
题目:用最速下降法求解无约束非线性规划问题
摘要:
无约束最优化问题的求解方法分为解析法和直接法两大类。解析法需要计
算函数的梯度,其中最速下降法就属于解析法中的一种。对于一个无约束非线性规划利用最速下降法求解,首先需要确定其优化方向,此优化方向应该选择为f 在当前点处的负梯度方向,利用一维搜索法找出沿此方向上的最小值及其对应点,此后将该点作为新的出发点重复上述过程,直到达到允许的误差为止。本文通过理论的计算方法,进一步分析,最后用c++编程实现求出允许误差内的最优解。此编程可用于计算符合下列形式的函数求最优解过程:
f(x)=a[0]x1*x1+a[1]x2*x2+a[2]x1*x2+a[3]x1+a[4]x2+a[5]其中:a[i] (i=0,1,2,3,4,5) 为函数的系数。
本文以“ 李占利 主编,中国矿业大学出版社出版”的《最优化理论与方法》 第五章 “无约束最优化方法,5.1 最速下降法 ”例5—1为实例,首先利用上述迭代的方法,计算出各迭代点的函数值,梯度及其模。然后应用c++语言编程,得到在精度范围内的精确最优解。
C++编程计算的最优解为 : T
x x ]0329218.0,00823045.0[)3(*-==。
即转化为分数结果为:⎥⎦
⎤⎢⎣⎡-==412432)
3(*x
x 。 满足精度要求的模为:
101
0736154.0||||)3(=
<=εp 。
关键词:无约束非线性规划 解析法 最速下降法 梯度 模 最优解
一、算法思想
无约束最优化方法中的最速下降法首先需要确定其优化方向,此优化方向应该选择为f 在当前点处的负梯度方向,利用一维搜索法找出沿此方向上的最小值及其对应点,此后将该点作为新的出发点重复上述过程,直到达到允许的误差为止。主要依据解无约束非线性规划问题的最速下降法计算步骤进行设计算法。 具体步骤如下:
第1步 选取初始点0
x ,给定终止误差 ε>0,令k=0;
第2步 计算()k f x ∇,若()k f x ε∇≤,停止迭代,输出k x ,否则进行第3
步;
第3步 取
()k k
p f x =-∇; 第4步 进行一维搜索,求k λ,使得0
()min ()k k k k k k f x p f x p λλ≥+=+,令
1k k k
k x x p λ+=+,k=k+1。转第2步。
由以上计算步骤可知,最速下降法迭代终止时,求得的是目标函数驻点的一个近似点。 依据以上步骤就可以用C++编程实现最速下降法求解最优解的算法。
二、算法流程图
三、程序代码
#include
double lamda(double x[2],double p[2],double a[2]) { double lam1,lam2; lam1=(pow(a[0],3)*x[0]*x[0]+pow(a[1],3)*x[1]*x[1]); lam2=-(pow(a[0]*x[0],2)+pow(a[1]*x[1],2)); double s;
停
()
k x x *=取(0)
x
,1.0=ε
k:=0
计算()
()()k k p
f x =-∇
()
?
k p
ε≤是
否
求()
k λ
()
()()()()0
()()min k k k k k f x p f x p λ
λλ≥+=+
令(1)
()()()k k k k x x p λ+=+
k:=k+1
s=-lam2/(2*lam1);
return s;
}
void main()
{
cout<<"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"< cout<<"@@ 最速下降法求解最优解程序运行结果@@"< cout<<"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"< cout< double lamd,x[3],a[6]; double p[2],g[2],e,y,m,n; int i=0; cout<<"请输入精度e"< cin>>e; cout<<"请输入初始点x[0],x[1]的值:\n"< cin>>m; cin>>n; x[0]=m; x[1]=n; cout<<"函数通式为f(x)=a[0]x1*x1+a[1]x2*x2+a[2]x1*x2+a[3]x1+a[4]x2+a[5]"< cout<<"请依次输入函数的系数:a[0]、a[1]、a[2]、a[3]、a[4]、a[5]:"< for(i=0;i<6;i++) cin>>a[i]; p[0]=(2*a[0]*x[0]+a[2]*x[1]+a[3]); p[1]=(2*a[1]*x[1]+a[2]*x[0]+a[4]); g[0]=-p[0]; g[1]=-p[1]; i=0; cout< while(sqrt(g[0]*g[0]+g[1]*g[1])>e&&i<=200) { lamd=lamda(x,g,a); x[0]=x[0]+lamd*g[0]; x[1]=x[1]+lamd*g[1];