MATLAB解决一维搜索
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
double t,d1,d2,s;
double h=1.0,y1,y2,y3,t1=0,t2,t3, /*确定搜索区间所需变量*/
a,b,a1,a2,za,q1,q2,c,k,m,n; /*搜索最优解所需变量*/
d1=aa[i][0]+t*bb[i][0]; d2=aa[i][1]+t*bb[i][1]; /*得到点关于t的坐标表达式*/
}
else
{
b=a2; a2=a1; q2=q1;
a1=b-k*(b-a); t=a1;
q1=4*(aa[i][0]+t*bb[i][0]-5)*(aa[i][0]+t*bb[i][0]-5)+(aa[i][1]+t*bb[i][1]-6)*(aa[i][1]+t*bb[i][1]-6);
}
m=(b-a)/b; if(m<0) m=-m;
s=4*(aa[i][0]+t*bb[i][0]-5)*(aa[i][0]+t*bb[i][0]-5)+(aa[i][1]+t*bb[i][1]-6)*(aa[i][1]+t*bb[i][1]-6); /*该点的函数表达式*/
t=t1;
y1=4*(aa[i][0]+t*bb[i][0]-5)*(aa[i][0]+t*bb[i][0]-5)+(aa[i][1]+t*bb[i][1]-6)*(aa[i][1]+t*bb[i][1]-6);
}
else
{
if(f2<f3)
{
replace2(x,i); /*终点坐标代替始点坐标*/
}
else
{
replace3(x,i); /*反射点坐标代替始点坐标*/
}
}
}
while(s>J);
printf("The distance between point of origin to destination S=%f\n",s);
}
} /*自定义函数12:反射点坐标替代始点坐标*/
main()
{
double x[][M]={{8.0,9.0}}; /*初始点赋值*/
double e[][M]={{1.0,0},{0,1.0}}; /*确定两个初始搜索方向*/
double a; /*定义步长因子*/
double optimunY; /*optimunY为所求最优函数值*/
n=(q2-q1)/q2; if(n<0) n=-n;
}
za=(a+b)/2;
printf("za=%f\n",za); /*输出步长值*/
return za;
} /*自定义函数5:求解步长*/
double maximun(double a[M])
{
int j;
double max;
max=a[0];
四、实验程序(改进的鲍威尔法,精度设为J=0.005)
#include "stdio.h"
#include "math.h"
#define J 0.005
#define M 2
#define N 100
double function(double x[][M],int i)
{
double s;
s=4*(x[i][0]-5)*(x[i][0]-5)+(x[i][1]-6)*(x[i][1]-6);
q2=4*(aa[i][0]+t*bb[i][0]-5)*(aa[i][0]+t*bb[i][0]-5)+(aa[i][1]+t*bb[i][1]-6)*(aa[i][1]+t*bb[i][1]-6);
m=(b-a)/b; if(m<0) m=-m;
n=(q2-q1)/q2; if(n<0) n=-n;
while(y3<y2)
{
h=2*h;
t1=t2; y1=y2; t2=t3; y2=y3;
t3=t2+h; t=t3;
y3=4*(aa[i][0]+t*bb[i][0]-5)*(aa[i][0]+t*bb[i][0]-5)+(aa[i][1]+t*bb[i][1]-6)*(aa[i][1]+t*bb[i][1]-6);
while(m>c&&n>c)
{
if(q1>=q2)
{
a=a1; a1=a2; q1=q2;
a2=a+k*(b-a); t=a2;
q2=4*(aa[i][0]+t*bb[i][0]-5)*(aa[i][0]+t*bb[i][0]-5)+(aa[i][1]+t*bb[i][1]-6)*(aa[i][1]+t*bb[i][1]-6);
}
cut1(x,x,e,i); /*调用函数求始点和终点确定的向量=此题中第三个搜索方向*/
s=distance(e,i); /*调用函数求始点和终点之间的距离s*/
printf("The distance between point of origin to destination S=%f\n",s);
{
if(max<d[j])
{
max=d[j];
mark=(j);
}
}
return mark;
} /*自定义函数7:找最大差值的下标*/
double distance(double e[][M],int i)
{
double s;
int h;
h=i-1;
s=sqrt(e[h][0]*e[h][0]+e[h][1]*e[h][1]);
}
} /*自定义函数2:矩阵加运算*/
double *cut1(double a[][M],double b[][M],double c[][M],int i)
{
int e,h;
h=i-1;
for(e=0;e<M;e++)
{
c[h][e]=a[h][e]-b[0][e];
}
} /*自定义函数3:矩阵减运算1*/
double *cut2(double a[][M],double b[][M],double c[][M],int i)
{
int e,h;
h=i-1;
for(e=0;e<M;e++)
{
c[i][e]=2*a[h][e]-b[0][e];
}
} /*自定义函数4:矩阵减运算2*/
double research(double aa[][M],double bb[][M],int i)
最优解: ,
三、实验原理
(1)鲍威尔基本算法(参见课本P83—84)。
(2)鲍威尔改进算法:在鲍威尔基本算法中,每一轮迭代都用连结始点和终点所产生出的搜索方向去替代原向量组中的第一个向量,而不管它的“好坏”,这是产生向量组线性相关的原因所在。因此在改进的算法中首先判断原向量组是否需要替换。如果需要替换,还要进一步判断原向量组中哪个向量最坏,然后再用新产生的向量替换这个最坏的向量,以保证逐次生成共轭方向。具体步骤详见课本P85。
double *replace1(double x[][M],int i)
{
int j,h;
h=i+1;
for(j=0;j<M;j++)
{
x[0][j]=x[h][j];
}
} /*自定义函数10:最后的X坐标替代始点坐标*/
double *replace2(double x[][M],int i)
{
姓名:楼金波学号:064090316
实验二无约束优化方法(改进的鲍威尔法)
一、实验目的
通过实验,进一步理解无约束优化的概念和各类方法的基本原理,同时锻炼学生运用理论知识解决实际问题的能力。
本次实验重点在于学会运用通用性较强的无约束优化方法——改进的鲍威尔法,来求解实际问题。
二、实验内容
用改进的鲍威尔法编程求解下述问题:
t2=h; t=t2;
y2=4*(aa[i][0]+t*bb[i][0]-5)*(aa[i][0]+t*bb[i][0]-5)+(aa[i][1]+t*bb[i][1]-6)*(aa[i][1]+t*bb[i][1]-6);
c=0.0001; k=0.618; /*变量初始化*/
if(y2>y1)
{
for(j=0;j<M;j++)
{
if(max<a[j])
max=a[j]; /*查找最大数并附值给max*/
}
return max;
} /*自定义函数6:找最大差值*/
int sign(double d[M])
{
int j,mark=0;
double max;
max=d[0];
for(j=0;j<M;j++)
h=-h; t3=t1; y3=y1;
t1=t2; y1=y2; t2=t3; y2=y3; /*换名*/
}
t3=t2+h; t=t3;
y3=4*(aa[i][0]+t*bb[i][0]-5)*(aa[i][0]+t*bb[i][0]-5)+(aa[i][1]+t*bb[i][1]-6)*(aa[i][1]+t*bb[i][1]-6);
{
a=research(x,e,++c); /*调用函数得步长,至此c=2*/
add(x,e,x,a,i); /*调用函数求沿始点和终点连线方向搜索点坐标值*/
replace1(x,i); /*最后点的坐标替代始点的坐标以作为下一轮搜索的起点*/
deldm(e,mark); /*调用函数除去em向量*/
return s;
} /*自定义函数8:求始点和终点间的距离*/
double *deldm(double e[][M],int mark)
{
int i,j,h;
for(i=mark;i<M+1;i++)
{
h=i+1;
for(j=0;j<M;j++)
{
e[i][j]=e[h][j];
}
}
} /*自定义函数9:除去em向量*/
}
a=t1; b=t3;
a1=b-k*(b-a); t=a1;
q1=4*(aa[i][0]+t*bb[i][0]-5)*(aa[i][0]+t*bb[i][0]-5)+(aa[i][1]+t*bb[i][1]-6)*(aa[i][1]+t*bb[i][1]-6);
a2=a+k*(b-a); t=a2;
add(x,e,x,a,i); /*调用函数求搜索点坐标值*/
printf("x1newpoint=%f,x2newpoint=%f\n",x[i][0],x[i][1]); /*输出搜索点坐标*/
y[i]=function(x,i); /*调用函数该搜索点的函数值*/
d[c]=y[c]-y[i]; /*相邻两点函数值之差,程序运行到此后i=3、c=1*/
int j,h;
h=i-1;
for(j=0;j<M;j++)
{
x[0][j]=x[h][j];
}
} /*自定义函数11:终点坐标替代始点坐标*/
double *replace3(double x[][M],int i)
{
int j,h;
h=i;
for(j=0;j<M;j++)
{
x[0][j]=x[h][j];
return s;
} /*自定义函数1:求函数值*/
double *add(double a[][M],double b[][M],double c[][M],double d,int i)
{
int e,ຫໍສະໝຸດ Baidu;
h=i-1;
for(e=0;e<M;e++)
{
c[i][e]=a[h][e]+d*b[h][e];
do
{
k=k+1;
y[0]=function(x,0); /*调用函数得始点函数值*/
i=1;
for(i=1;i<=M;i++)
{
c=i-1;
a=research(x,e,c); /*调用函数得步长*/
printf("e1=%f,e2=%f\n",e[c][0],e[c][1]); /*输出该次搜索的方向*/
cut2(x,x,x,i); /*调用函数求反射点坐标值*/
printf("x1fanshe=%f,x2fanshe=%f\n",x[3][0],x[3][1]); /*输出反射点坐标值***************/
y[i]=function(x,i); /*调用函数求反射点函数值*/
f0=y[0];
f2=y[--i]; i++;
f3=y[i]; /*反射点函数值赋给f3*/
maxd=maximun(d); /*调用函数求最大差值*/
mark=sign(d); /*调用函数求最大差值对应d在内存中的下标*/
if(f3<f0&&(f0-2*f2+f3)*(f0-f2-maxd)*(f0-f2-maxd)<0.5*maxd*(f0-f3)*(f0-f3))
int k=0,i,c,mark; /*mark为最大差值的下标减一,即d的在内存中的下标,k为搜索轮数*/
double y[N]; /*各点函数值*/
double d[M]; /*函数值差*/
double maxd; /*最大函数值之差*/
double f0,f2,f3,s; /*始点、终点、反射点函数值变量,s为一轮搜索中起点和终点之间的距离*/
double t,d1,d2,s;
double h=1.0,y1,y2,y3,t1=0,t2,t3, /*确定搜索区间所需变量*/
a,b,a1,a2,za,q1,q2,c,k,m,n; /*搜索最优解所需变量*/
d1=aa[i][0]+t*bb[i][0]; d2=aa[i][1]+t*bb[i][1]; /*得到点关于t的坐标表达式*/
}
else
{
b=a2; a2=a1; q2=q1;
a1=b-k*(b-a); t=a1;
q1=4*(aa[i][0]+t*bb[i][0]-5)*(aa[i][0]+t*bb[i][0]-5)+(aa[i][1]+t*bb[i][1]-6)*(aa[i][1]+t*bb[i][1]-6);
}
m=(b-a)/b; if(m<0) m=-m;
s=4*(aa[i][0]+t*bb[i][0]-5)*(aa[i][0]+t*bb[i][0]-5)+(aa[i][1]+t*bb[i][1]-6)*(aa[i][1]+t*bb[i][1]-6); /*该点的函数表达式*/
t=t1;
y1=4*(aa[i][0]+t*bb[i][0]-5)*(aa[i][0]+t*bb[i][0]-5)+(aa[i][1]+t*bb[i][1]-6)*(aa[i][1]+t*bb[i][1]-6);
}
else
{
if(f2<f3)
{
replace2(x,i); /*终点坐标代替始点坐标*/
}
else
{
replace3(x,i); /*反射点坐标代替始点坐标*/
}
}
}
while(s>J);
printf("The distance between point of origin to destination S=%f\n",s);
}
} /*自定义函数12:反射点坐标替代始点坐标*/
main()
{
double x[][M]={{8.0,9.0}}; /*初始点赋值*/
double e[][M]={{1.0,0},{0,1.0}}; /*确定两个初始搜索方向*/
double a; /*定义步长因子*/
double optimunY; /*optimunY为所求最优函数值*/
n=(q2-q1)/q2; if(n<0) n=-n;
}
za=(a+b)/2;
printf("za=%f\n",za); /*输出步长值*/
return za;
} /*自定义函数5:求解步长*/
double maximun(double a[M])
{
int j;
double max;
max=a[0];
四、实验程序(改进的鲍威尔法,精度设为J=0.005)
#include "stdio.h"
#include "math.h"
#define J 0.005
#define M 2
#define N 100
double function(double x[][M],int i)
{
double s;
s=4*(x[i][0]-5)*(x[i][0]-5)+(x[i][1]-6)*(x[i][1]-6);
q2=4*(aa[i][0]+t*bb[i][0]-5)*(aa[i][0]+t*bb[i][0]-5)+(aa[i][1]+t*bb[i][1]-6)*(aa[i][1]+t*bb[i][1]-6);
m=(b-a)/b; if(m<0) m=-m;
n=(q2-q1)/q2; if(n<0) n=-n;
while(y3<y2)
{
h=2*h;
t1=t2; y1=y2; t2=t3; y2=y3;
t3=t2+h; t=t3;
y3=4*(aa[i][0]+t*bb[i][0]-5)*(aa[i][0]+t*bb[i][0]-5)+(aa[i][1]+t*bb[i][1]-6)*(aa[i][1]+t*bb[i][1]-6);
while(m>c&&n>c)
{
if(q1>=q2)
{
a=a1; a1=a2; q1=q2;
a2=a+k*(b-a); t=a2;
q2=4*(aa[i][0]+t*bb[i][0]-5)*(aa[i][0]+t*bb[i][0]-5)+(aa[i][1]+t*bb[i][1]-6)*(aa[i][1]+t*bb[i][1]-6);
}
cut1(x,x,e,i); /*调用函数求始点和终点确定的向量=此题中第三个搜索方向*/
s=distance(e,i); /*调用函数求始点和终点之间的距离s*/
printf("The distance between point of origin to destination S=%f\n",s);
{
if(max<d[j])
{
max=d[j];
mark=(j);
}
}
return mark;
} /*自定义函数7:找最大差值的下标*/
double distance(double e[][M],int i)
{
double s;
int h;
h=i-1;
s=sqrt(e[h][0]*e[h][0]+e[h][1]*e[h][1]);
}
} /*自定义函数2:矩阵加运算*/
double *cut1(double a[][M],double b[][M],double c[][M],int i)
{
int e,h;
h=i-1;
for(e=0;e<M;e++)
{
c[h][e]=a[h][e]-b[0][e];
}
} /*自定义函数3:矩阵减运算1*/
double *cut2(double a[][M],double b[][M],double c[][M],int i)
{
int e,h;
h=i-1;
for(e=0;e<M;e++)
{
c[i][e]=2*a[h][e]-b[0][e];
}
} /*自定义函数4:矩阵减运算2*/
double research(double aa[][M],double bb[][M],int i)
最优解: ,
三、实验原理
(1)鲍威尔基本算法(参见课本P83—84)。
(2)鲍威尔改进算法:在鲍威尔基本算法中,每一轮迭代都用连结始点和终点所产生出的搜索方向去替代原向量组中的第一个向量,而不管它的“好坏”,这是产生向量组线性相关的原因所在。因此在改进的算法中首先判断原向量组是否需要替换。如果需要替换,还要进一步判断原向量组中哪个向量最坏,然后再用新产生的向量替换这个最坏的向量,以保证逐次生成共轭方向。具体步骤详见课本P85。
double *replace1(double x[][M],int i)
{
int j,h;
h=i+1;
for(j=0;j<M;j++)
{
x[0][j]=x[h][j];
}
} /*自定义函数10:最后的X坐标替代始点坐标*/
double *replace2(double x[][M],int i)
{
姓名:楼金波学号:064090316
实验二无约束优化方法(改进的鲍威尔法)
一、实验目的
通过实验,进一步理解无约束优化的概念和各类方法的基本原理,同时锻炼学生运用理论知识解决实际问题的能力。
本次实验重点在于学会运用通用性较强的无约束优化方法——改进的鲍威尔法,来求解实际问题。
二、实验内容
用改进的鲍威尔法编程求解下述问题:
t2=h; t=t2;
y2=4*(aa[i][0]+t*bb[i][0]-5)*(aa[i][0]+t*bb[i][0]-5)+(aa[i][1]+t*bb[i][1]-6)*(aa[i][1]+t*bb[i][1]-6);
c=0.0001; k=0.618; /*变量初始化*/
if(y2>y1)
{
for(j=0;j<M;j++)
{
if(max<a[j])
max=a[j]; /*查找最大数并附值给max*/
}
return max;
} /*自定义函数6:找最大差值*/
int sign(double d[M])
{
int j,mark=0;
double max;
max=d[0];
for(j=0;j<M;j++)
h=-h; t3=t1; y3=y1;
t1=t2; y1=y2; t2=t3; y2=y3; /*换名*/
}
t3=t2+h; t=t3;
y3=4*(aa[i][0]+t*bb[i][0]-5)*(aa[i][0]+t*bb[i][0]-5)+(aa[i][1]+t*bb[i][1]-6)*(aa[i][1]+t*bb[i][1]-6);
{
a=research(x,e,++c); /*调用函数得步长,至此c=2*/
add(x,e,x,a,i); /*调用函数求沿始点和终点连线方向搜索点坐标值*/
replace1(x,i); /*最后点的坐标替代始点的坐标以作为下一轮搜索的起点*/
deldm(e,mark); /*调用函数除去em向量*/
return s;
} /*自定义函数8:求始点和终点间的距离*/
double *deldm(double e[][M],int mark)
{
int i,j,h;
for(i=mark;i<M+1;i++)
{
h=i+1;
for(j=0;j<M;j++)
{
e[i][j]=e[h][j];
}
}
} /*自定义函数9:除去em向量*/
}
a=t1; b=t3;
a1=b-k*(b-a); t=a1;
q1=4*(aa[i][0]+t*bb[i][0]-5)*(aa[i][0]+t*bb[i][0]-5)+(aa[i][1]+t*bb[i][1]-6)*(aa[i][1]+t*bb[i][1]-6);
a2=a+k*(b-a); t=a2;
add(x,e,x,a,i); /*调用函数求搜索点坐标值*/
printf("x1newpoint=%f,x2newpoint=%f\n",x[i][0],x[i][1]); /*输出搜索点坐标*/
y[i]=function(x,i); /*调用函数该搜索点的函数值*/
d[c]=y[c]-y[i]; /*相邻两点函数值之差,程序运行到此后i=3、c=1*/
int j,h;
h=i-1;
for(j=0;j<M;j++)
{
x[0][j]=x[h][j];
}
} /*自定义函数11:终点坐标替代始点坐标*/
double *replace3(double x[][M],int i)
{
int j,h;
h=i;
for(j=0;j<M;j++)
{
x[0][j]=x[h][j];
return s;
} /*自定义函数1:求函数值*/
double *add(double a[][M],double b[][M],double c[][M],double d,int i)
{
int e,ຫໍສະໝຸດ Baidu;
h=i-1;
for(e=0;e<M;e++)
{
c[i][e]=a[h][e]+d*b[h][e];
do
{
k=k+1;
y[0]=function(x,0); /*调用函数得始点函数值*/
i=1;
for(i=1;i<=M;i++)
{
c=i-1;
a=research(x,e,c); /*调用函数得步长*/
printf("e1=%f,e2=%f\n",e[c][0],e[c][1]); /*输出该次搜索的方向*/
cut2(x,x,x,i); /*调用函数求反射点坐标值*/
printf("x1fanshe=%f,x2fanshe=%f\n",x[3][0],x[3][1]); /*输出反射点坐标值***************/
y[i]=function(x,i); /*调用函数求反射点函数值*/
f0=y[0];
f2=y[--i]; i++;
f3=y[i]; /*反射点函数值赋给f3*/
maxd=maximun(d); /*调用函数求最大差值*/
mark=sign(d); /*调用函数求最大差值对应d在内存中的下标*/
if(f3<f0&&(f0-2*f2+f3)*(f0-f2-maxd)*(f0-f2-maxd)<0.5*maxd*(f0-f3)*(f0-f3))
int k=0,i,c,mark; /*mark为最大差值的下标减一,即d的在内存中的下标,k为搜索轮数*/
double y[N]; /*各点函数值*/
double d[M]; /*函数值差*/
double maxd; /*最大函数值之差*/
double f0,f2,f3,s; /*始点、终点、反射点函数值变量,s为一轮搜索中起点和终点之间的距离*/