优化课程实验Word文档格式.docx
《优化课程实验Word文档格式.docx》由会员分享,可在线阅读,更多相关《优化课程实验Word文档格式.docx(25页珍藏版)》请在冰点文库上搜索。
2、所选优化方法的基本原理简述。
3、绘制程序框图。
4、程序中变量及参数说明。
5、运行结果分析。
(要求输出迭代过程中搜索区间上下限、迭代次数、极小点和极小值)
#include<
math.h>
stdio.h>
doubleobfunc(doublex)/*目标函数*/
{
doubleff;
ff=pow(x,2)+9*x;
return(ff);
}
voidjts(doublex0,doubleh0,doubles[],intn,doublea[],doubleb[])/*进退法*/
inti;
doublex[3],h,f1,f2,f3;
h=h0;
for(i=0;
i<
n;
i++)
x[0]=x0;
f1=obfunc(x[0]);
i++)x[1]=x[0]+h*s[i];
f2=obfunc(x[1]);
if(f2>
=f1)
{
h=-h0;
x[2]=x[0];
f3=f1;
x[0]=x[1];
x[1]=x[2];
f1=f2;
f2=f3;
for(;
;
)
h=2.0*h;
x[2]=x[1]+h*s[i];
f3=obfunc(x[2]);
if(f2<
f3)
break;
else
if(h<
0)
a[i]=x[2];
b[i]=x[0];
a[i]=x[0];
b[i]=x[2];
printf("
%4d"
n);
}
doublegold(doublea[],doubleb[],doubleeps,intn,doublexx)/*黄金分割法*/
{inti;
doublef1,f2,ff,q,w;
doublex[3];
x[0]=a[i]+0.618*(b[i]-a[i]);
x[1]=a[i]+0.382*(b[i]-a[i]);
do
if(f1>
f2)
{b[i]=x[0];
i++)
x[1]=a[i]+0.382*(b[i]-a[i]);
{for(i=0;
a[i]=x[1];
x[1]=x[0];
f2=f1;
q=0;
for(i=0;
i++)
q=q+(b[i]-a[i])*(b[i]-a[i]);
w=sqrt(q);
}while(w>
eps);
xx=0.5*(a[i]+b[i]);
ff=obfunc(xx);
xx=ff=%5.2f,,,,%5.2f"
xx,ff);
voidmain()
intn=1;
doublea[1],b[1],xx;
doubles[]={1},x0=0;
doubleeps1=0.001,h0=0.1;
jts(x0,h0,s,n,a,b);
gold(a,b,eps1,n,xx);
实验二多维无约束优化
一、实验目的:
1.掌握常用无约束优化方法的基本思想及迭代过程。
2.掌握最速下降法、共轭梯度法、牛顿法、变尺度法、Powell法、单形替换法等的优缺点及程序编制方法。
3.掌握如何合理选择无约束优化方法,保证迭代效率及解题效果。
4.掌握如何保证所得结果为目标函数的全局最优解的一般方法。
二、实验内容
1.求函数f(x)=2x12+3x22-8x1+10的近似无约束最小点X*及最小值f(X*)。
已知初始点X(0)=[1,2]T,ε=0.001。
2.求函数f(x)=1.5x12+0.5x22-x1x2-2x1的近似最小点X*及最小值f(X*)。
已知初始点X(0)=[-2,4]T,ε=0.02。
3.求函数f(x)=x14-2x12x2-2x22-2x1x2+4.5x1-4x2+4的近似最小点X*及最小值f(X*)。
已知初始点X(0)=[-0.2,0.2]T,ε=0.01。
4.求f(x)=x12+2x22–4x1-2x1x2的近似最小点X*及最小值f(X*)。
已知初始点X(0)=[1,1]T,ε=0.01。
5.求f(x)=4(x1-5)2+(x2-6)2的最优解。
已知初始点X(0)=[8,9]T,ε=0.01。
三、实验要求:
1.任选实验内容中之一,自选实验目标2中的一种方法,自编程序;
2.改变初始初始点及精度要求,观察最优解及迭代次数的变化情况。
四、实验报告:
1.写清上机实验的名称及要求。
2.所选优化方法的基本原理简述。
3.绘制程序框图。
4.程序中变量及参数说明。
5.运行结果分析。
6.对所采用的方法的搜索效率及搜索结果进行评价,并提出改进意见及建议。
附:
Powell法的参考程序:
#include"
math.h"
stdio.h"
malloc.h"
doubleobfunc(doublex[])
{doubleff;
ff=x[0]*x[0]+2*x[1]*x[1]-4*x[0]-2*x[0]*x[1];
return(ff);
voidjts(doublex0[],doubleh0,doubles[],intn,doublea[],doubleb[])
{inti;
double*x[3],h,f1,f2,f3;
3;
i++)x[i]=(double*)malloc(n*sizeof(double));
i++)*(x[0]+i)=x0[i];
f1=obfunc(x0);
i++)*(x[1]+i)=*(x[0]+i)+h*s[i];
{h=-h0;
i++)*(x[2]+i)=*(x[0]+i);
i++){*(x[0]+i)=*(x[1]+i);
*(x[1]+i)=*(x[2]+i);
i++)*(x[2]+i)=*(x[1]+i)+h*s[i];
f3)break;
{for(i=0;
{*(x[0]+i)=*(x[1]+i);
i++){a[i]=*(x[2]+i);
b[i]=*(x[0]+i);
i++){a[i]=*(x[0]+i);
b[i]=*(x[2]+i);
i++)free(x[i]);
doublegold(doublea[],doubleb[],doubleeps,intn,doublexx[])
doublef1,f2,ff,q,w,*x[2];
2;
{*(x[0]+i)=a[i]+0.618*(b[i]-a[i]);
*(x[1]+i)=a[i]+0.382*(b[i]-a[i]);
{if(f1>
i++){b[i]=*(x[0]+i);
*(x[0]+i)=*(x[1]+i);
for(i=0;
i++)*(x[1]+i)=a[i]+0.382*(b[i]-a[i]);
f2=obfunc(x[1]);
i++){a[i]=*(x[1]+i);
*(x[1]+i)=*(x[0]+i);
f2=f1;
i++)*(x[0]+i)=a[i]+0.618*(b[i]-a[i]);
f1=obfunc(x[0]);
i++)q=q+(b[i]-a[i])*(b[i]-a[i]);
i++)xx[i]=0.5*(a[i]+b[i]);
doubleoneoptim(doublex0[],doubles[],doubleh0,doubleepsg,intn,doublex[])
double*a,*b,ff;
a=(double*)malloc(n*sizeof(double));
b=(double*)malloc(n*sizeof(double));
ff=gold(a,b,epsg,n,x);
free(a);
free(b);
doublepowell(doublep[],doubleh0,doubleeps,doubleepsg,intn,doublex[])
inti,j,m;
double*xx[4],*ss,*s;
doublef,f0,f1,f2,f3,fx,dlt,df,sdx,q,d;
ss=(double*)malloc(n*(n+1)*sizeof(double));
s=(double*)malloc(n*sizeof(double));
for(j=0;
j<
j++)*(ss+i*(n+1)+j)=0;
*(ss+i*(n+1)+i)=1;
4;
xx[i]=(double*)malloc(n*sizeof(double));
*(xx[0]+i)=p[i];
{
*(xx[1]+i)=*(xx[0]+i);
x[i]=*(xx[1]+i);
}
f0=f1=obfunc(x);
dlt=-1;
for(j=0;
j++)
{
for(i=0;
{
*(xx[0]+i)=x[i];
*(s+i)=*(ss+i*(n+1)+j);
}
f=oneoptim(xx[0],s,h0,epsg,n,x);
df=f0-f;
if(df>
dlt)
dlt=df;
m=j;
sdx=0.0;
sdx=sdx+fabs(x[i]-(*(xx[1]+i)));
if(sdx<
eps)
free(ss);
free(s);
free(xx[i]);
return(f);
*(xx[2]+i)=x[i];
f2=f;
*(xx[3]+i)=2.0*(*(xx[2]+i)-(*(xx[i]+i)));
x[i]=*(xx[3]+i);
fx=obfunc(x);
f3=fx;
q=(f1-2*f2+f3)*(f1-f2-dlt)*(f1-f2-dlt);
d=0.5*dlt*(f1-f3)*(f1-f3);
if((f3<
f1)||(q<
d))
{if(f2<
=f3)
*(xx[0]+i)=*(xx[2]+i);
else
*(xx[0]+i)=*(xx[3]+i);
{for(i=0;
{*(ss+(i+1)*(n+1))=x[i]-(*(xx[1]+i));
*(s+1)=*(ss+(i+1)*(n+1));
f=oneoptim(xx[0],s,h0,epsg,n,x);
*(xx[0]+i)=x[i];
for(j=m+1;
=n;
*(ss+i*(n+1)+j-1)=*(ss+i*(n+1)+j);
voidmain()
{inti;
intdimen=2;
doublespoint[]={1,1};
doubleff,x[20];
doubleh0=0.3;
doublefepsl=0.001;
doublesepsl=0.0001;
ff=powell(spoint,h0,fepsl,sepsl,dimen,x);
dimen;
i++)printf("
x%d%5.2f\n"
i,x[i]);
optimum=%5.2f"
ff);
实验三约束优化方法实验
一、实验目的
1、掌握常用多维约束优化方法的基本思想及特点;
2、掌握约束优化问题的一般求解方法;
3、掌握常用优化方法程序的使用方法;
4、通过上机练习,了解约束优化方法的搜索效率,搜索效果及解的可靠性。
1、任选一种约束优化方法,根据程序框图编写程序,上机调试并运行,对运行结果进行分析。
1)用随机方向法求下面具有不等式约束的优化问题
minf(x)=(x1-8)2+(x2-8)2
S.T.g1(x)=-x1≤0
g2(x)=1-x2≤0
g3(x)=x1+x2-11≤0
的最优解。
已知:
=0.4,
=0.01,
=[2,3]T,[a,b]=[0.0,11.0]。
2)用复合形法求约束最优解,目标函数及约束函数同1题。
3)用惩罚函数法求下面具有不等式及等式约束的优化问题:
minf(x)=4x1-x22-12
S.T.g1(x)=34-10x1-10x2+x12+x22≤0
g2(x)=-x1≤0
g3(x)=-x2≤0
h(x)=x12+x22-25=0
=[3.0,3.0]T,r0=1.0,c=0.2,
=0.00005,[a1,b1]=[0.0,6.0],[a2,b2]=[0.0,8.0]。
2、改变化初始值,分析最优解的变化。
选择间接法(惩罚函数法、拉格朗日乘子法)和直接法(随机方向发、复合形法、可行方向法)中的一种,理解基本原理和程序框图,考虑用选择的语言如何实现。
MATLAB是“矩阵实验室(Matrixlaboratory)”的缩写,是由美国Mathworks公司推出的一种以矩阵运算为基础,集通用数学运算、图形交互、程序设计和系统建模为一体的著名软件,它具有功能强、使用简单、容易扩展等优点。
与其他计算机语言相比,MATLAB表达方式与人们在数学、工程计算中常用的书写格式十分相似,它以解释方式工作,输入程序后就可得结果.人机交互性好,易于调试,用户学习和使用它都极为方便。
MATLAB的基本部分有:
矩阵运算和各种变换,代数和超越方程的求解,数据处理和傅里叶变换,数值积分等:
除此之外,为了支持不同专业领域的用户,MATLAB还提供了大量的面向专业领域的工具箱,工具箱(toolbox)包含一系列专用的MATLAB函数库,以解决特定领域的问题。
工具箱主要有:
通讯工具箱(Communicationtoolbox)、控制系统工具箱(ControlSystemtoolbox)、信号处理工具箱(Signalprocessingtoolbox)、图像处理上具箱(Imaginetoolbox)、系统辨识工具箱(SystemIdentificationToolbox)、模糊逻辑工具箱(FuzzyLogictoolbox)、遗传算法最优化工具箱(geneticA1gorithmoptimizationToolbox)、最优化工具箱(optimizationToolbox)、数理统计工具箱(StatisticsToolbox)、小波分桥工具箱(waveletToo1box)等等。
这些工具箱通常表现为M文件和高级MATLAB语言的集合形式,允许用户修改函数的源代码或增加新的函数来适应自己的应用,允许用户方便地综合使用不同工具箱中的技术来设计针对某个问题的用户解决方案。
使用MATLAB语言和MATLAB工具箱,用户可以专注于算法研究,编程只需要几行就可以完成,而且可以很快的画出图形,从而迅速地进行多种算法的比较,从中找出最好的方案。
MATLAB被广泛用于研究和解决各种具体的工程问题,它不光已成为欧美等发达国家各设计单位和科研部门的基本工具,也成为了各高等院校大学生、硕士生和博士生必须掌握的工具。
优化上具箱(optimizationToolbox)涉及函数的最小化和最大化问题,也就是函数的极值问题。
MATLAB的优化工具箱内一些对普通非线性函数求解最小化成最大化极值的函数和解决诸如线性规划等标准矩阵问题的函数组成。
下面简单地对优化上具箱中的基本函数作一介绍。
优化工具箱中求非线性函数极小值的函数如下表所示。
表一求非线性函数极小值的函数列表
类型
含义
调用格式
无条件标量问题
,其中x为标量
x=fmin(‘f’,x)
无限定条件矩阵问题
,其中x为矩阵
x=fminu(‘f’,x)
有限定条件问题
,条件为
x=constr(‘fg’,x)
目标条件问题
goal
x=attgoal(‘f’,x,goal,w)
最大最小极值
条件为
x=minimax(‘fg’,x)
非线性二次平方极值
x=leastsq(‘f’,x)
非线性方程
x=fsolve(‘f’,x)
半无穷条件
X=seminf(‘ft’,n,x)
问题的原形算法是Nelder-Mead单纯形搜索方法和BFGS拟牛顿(qusi-Newton)方法。
限定条件下的最小、最大最小、目标法和半无穷优化等问题,所用的原理算法是二次规划法,非线件二次平方问题的原理算法是Gausss-Newton法和Levenberg—Marquardt法。
非线性最小和非线性二次平方问题,可进行线性搜索策略的选择,线件搜索策略使用的是二次或三次内插和外插方法。
优化上具箱处能解决几类求矩阵的极小值问题,此时仅需要将相应的系数矩陈和向量传递到函数中。
MATLAB系统能解决的矩阵问题如表所示。
语法
非负二次平方问题
,条件为x>
x=nnls