最优化 马昌凤 第二章作业.docx

上传人:b****1 文档编号:20157846 上传时间:2023-04-25 格式:DOCX 页数:31 大小:60.35KB
下载 相关 举报
最优化 马昌凤 第二章作业.docx_第1页
第1页 / 共31页
最优化 马昌凤 第二章作业.docx_第2页
第2页 / 共31页
最优化 马昌凤 第二章作业.docx_第3页
第3页 / 共31页
最优化 马昌凤 第二章作业.docx_第4页
第4页 / 共31页
最优化 马昌凤 第二章作业.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

最优化 马昌凤 第二章作业.docx

《最优化 马昌凤 第二章作业.docx》由会员分享,可在线阅读,更多相关《最优化 马昌凤 第二章作业.docx(31页珍藏版)》请在冰豆网上搜索。

最优化 马昌凤 第二章作业.docx

最优化马昌凤第二章作业

 

最优化方法及其Matlab程序设计

习题作业暨实验报告

 

学院:

数学与信息科学学院

班级:

12级信计一班

姓名:

李明

学号:

1201214049

 

第二章线搜索技术

1、上机问题与求解过程

1、用0.618法求解

初始区间

,区间精度为

.

解:

当初始时不限制近似迭代函数值得大小,编写程序运行结果为:

极小点(s)

迭代次数

搜索区间误差

函数值误差

0.5016

9

0.0426

0.0006

从结果可以看出迭代次数为

次,极小点为

,极小点的函数值为

根据人工手算,极小值点应该为

,所以在设计程序的时候添加函数值误差范围,并取范围为

编写的设计函数程序并调试改正如下:

function[s,fs,k,G,FX,E]=gold(f,a,b,H,F)

%输入:

%f:

目标函数,a:

搜索区间左侧端点;b:

搜索区间右侧端点;

%H:

搜索区间允许范围;F:

搜索区间函数值允许范围;

%输出:

%s:

近似极小值点:

fa:

近似极小点数值;k:

迭代次数:

%FX:

近似迭代函数值;E=[h,fh],h为近似区间误差,fh为函数值误差

t=(sqrt(5)-1)/2;h=b-a;

p=a+(1-t)*h;q=a+t*h;

fa=feval(f,a);fb=feval(f,b);

fp=feval(f,p);fq=feval(f,q);

k=1;G(k,:

)=[a,p,q,b];

%初始时错误语句:

G(1,:

)=[a,p,q,b];

%初始调试的时候没有注意到后面需要开辟k行空间

FX(k,:

)=[fa,fp,fq,fb];

while(abs(fa-fb)>F)((b-a)>H)

if(fp

b=q;fb=fq;q=p;fq=fp;h=b-a;p=a+(1-t)*h;fp=feval(f,p);

%初始时错误语句:

b=q;fb=fq;h=b-a;q=a+t*h;fq=feval(f,q);

%初始调试的时候对0.618方法没有充分理解所以出现错误

else

a=p;fa=fp;p=q;fp=fq;h=b-a;q=a+t*h;fq=feval(f,q);

%初始时错误语句:

a=p;fa=fp;h=b-a;p=a+(1-t)*h;fp=feval(f,p);

%初始调试的时候对0.618方法没有充分理解所以出现错误

end

k=k+1;G(k,:

)=[a,p,q,b];

%初始时错误语句:

G(1,:

)=[a,p,q,b];

%初始调试的时候没有注意到前面已经开辟k行空间

FX(k,:

)=[fa,fp,fq,fb];

end

if(fp

s=p;fs=fp;

else

s=q;fs=fq;

end

h=b-a;fh=abs(fb-fa);

%选取试探点最小的数值为近似点,并且计算出以上为搜索区间的的最后误差以及函数值误差

E=[h,fh];

在命令窗口内输入如下命令:

[s,fs,k,G,FX,E]=gold(inline('s^2-s-1'),-1,1,0.05,1e-10)

回车之后得到如下数据结果:

极小点

极小点数值

迭代次数

搜索区间误差

函数值误差

0.500

-1.2500

24

附:

在窗口中输出的结果如下

>>[s,fs,k,G,FX,E]=gold(inline('s^2-s-1'),-1,1,0.05,1e-10)

s=

0.5000

fs=

-1.2500

k=

24

G=

-1.0000-0.23610.23611.0000

-0.23610.23610.52791.0000

0.23610.52790.70821.0000

0.23610.41640.52790.7082

0.41640.52790.59670.7082

0.41640.48530.52790.5967

0.41640.45900.48530.5279

0.45900.48530.50160.5279

0.48530.50160.51160.5279

0.48530.49530.50160.5116

0.49530.50160.50540.5116

0.49530.49920.50160.5054

0.49530.49770.49920.5016

0.49770.49920.50010.5016

0.49920.50010.50060.5016

0.49920.49970.50010.5006

0.49970.50010.50030.5006

0.49970.50000.50010.5003

0.49970.49990.50000.5001

0.49990.50000.50000.5001

0.50000.50000.50000.5001

0.50000.50000.50000.5000

0.50000.50000.50000.5000

0.50000.50000.50000.5000

FX=

1.0000-0.7082-1.1803-1.0000

-0.7082-1.1803-1.2492-1.0000

-1.1803-1.2492-1.2067-1.0000

-1.1803-1.2430-1.2492-1.2067

-1.2430-1.2492-1.2406-1.2067

-1.2430-1.2498-1.2492-1.2406

-1.2430-1.2483-1.2498-1.2492

-1.2483-1.2498-1.2500-1.2492

-1.2498-1.2500-1.2499-1.2492

-1.2498-1.2500-1.2500-1.2499

-1.2500-1.2500-1.2500-1.2499

-1.2500-1.2500-1.2500-1.2500

-1.2500-1.2500-1.2500-1.2500

-1.2500-1.2500-1.2500-1.2500

-1.2500-1.2500-1.2500-1.2500

-1.2500-1.2500-1.2500-1.2500

-1.2500-1.2500-1.2500-1.2500

-1.2500-1.2500-1.2500-1.2500

-1.2500-1.2500-1.2500-1.2500

-1.2500-1.2500-1.2500-1.2500

-1.2500-1.2500-1.2500-1.2500

-1.2500-1.2500-1.2500-1.2500

E=

1.0e-04

*0.31210.0000

2、用0.618法求解

的近似最优解,初始搜索区间为

,区间精度为

.

解:

当初始时不限制近似迭代函数值得大小,编写程序运行结果为:

极小点(s)

迭代次数

搜索区间误差

函数值误差

0.8115

8

0.1003

0.0040

从结果可以看出迭代次数为

次,极小点为

,极小点的函数值为

由第一题目可以发现当增加函数值限制时,最小近似值的误差会减小,所以在设计程序的时候添加函数值误差范围,并取范围为

具体源程序与上一题相同,在此处不做详细列出。

在命令窗口内输入如下命令:

>>[s,fs,k,G,FX,E]=gold(inline('s^3-2*s+1'),0,3,0.15,1e-10)

回车之后得到如下数据结果:

极小点

极小点数值

迭代次数

搜索区间误差

函数值误差

0.8165

-0.0887

26

附:

在窗口中输出的结果如下

>>[s,fs,k,G,FX,E]=gold(inline('s^3-2*s+1'),0,3,0.15,1e-10)

s=

0.8165

fs=

-0.0887

k=

26

G=

01.14591.85413.0000

00.70821.14591.8541

00.43770.70821.1459

0.43770.70820.87541.1459

0.70820.87540.97871.1459

0.70820.81150.87540.9787

0.70820.77210.81150.8754

0.77210.81150.83590.8754

0.77210.79650.81150.8359

0.79650.81150.82080.8359

0.81150.82080.82660.8359

0.81150.81730.82080.8266

0.81150.81510.81730.8208

0.81510.81730.81860.8208

0.81510.81640.81730.8186

0.81510.81590.81640.8173

0.81590.81640.81680.8173

0.81590.81620.81640.8168

0.81620.81640.81660.8168

0.81640.81640.81650.8166

0.81640.81650.81650.8166

0.81640.81650.81650.8165

0.81650.81650.81650.8165

0.81650.81650.81650.8165

0.81650.81650.81650.8165

FX=

1.00000.21293.665622.0000

1.0000-0.06120.21293.6656

1.00000.2085-0.06120.2129

0.2085-0.0612-0.08000.2129

-0.0612-0.0800-0.01990.2129

-0.0612-0.0886-0.0800-0.0199

-0.0612-0.0839-0.0886-0.0800

-0.0839-0.0886-0.0877-0.0800

-0.0839-0.0877-0.0886-0.0877

-0.0877-0.0886-0.0886-0.0877

-0.0886-0.0886-0.0884-0.0877

-0.0886-0.0887-0.0886-0.0884

-0.0886-0.0887-0.0887-0.0886

-0.0887-0.0887-0.0887-0.0886

-0.0887-0.0887-0.0887-0.0887

-0.0887-0.0887-0.0887-0.0887

-0.0887-0.0887-0.0887-0.0887

-0.0887-0.0887-0.0887-0.0887

-0.0887-0.0887-0.0887-0.0887

-0.0887-0.0887-0.0887-0.0887

E=

1.0e-04*

0.17880.0000

3、用抛物线法求

的近似极小点,给定初始点

,初始步长

解:

运用书上的算法框架,进行自我编写程序,并输出近似极小点值与近似极小点函数值,程序调制修改后如下:

function[s,fs,k,G,E]=paowu1(f,s0,h0,H,F)

%输入:

%f:

目标函数;s0:

初始迭代点;h0:

初始选择步长;

%H:

搜索区间容许误差值;F:

函数值容许误差值;

%输出:

%s:

近似极小数值点;fs:

近似极小点函数值;k:

迭代次数;

%G:

k行4列矩阵;E[hb,fc,m]分别为最终步长、搜索函数值误差、搜索区间误差

s1=s0+h0;s2=s0+2*h0;h=h0;

fs0=feval(f,s0);fs1=feval(f,s1);fs2=feval(f,s2);

k=1;G(k,:

)=[s0,s1,s2];

if((fs1

fprintf('itiserror,pleasechangeanotheranableh0');

else

fprintf('itisOK,pleasegoon');

end

%调试错误分析:

调试时候将书中的数据进行带入,改变函数输入步长,发现不同步长的

%结果不一样,并且误差较大。

后来发现在一开始的时候,步长较短不能保证

%三个插值函数点中间低两边高,所以在进行测验时,特此编写此判断控制语句。

%如果正确,则可运用此结果;反之,则改变原来输入数值。

if(abs(s2-s0)

sb=s1;fsb=fs1;hb=h0;

k=1;G(k,:

)=[s0,s1,s2];

else

%调试错误分析:

在进行第二次调试的时候,发现没有考虑当初始的时候,搜索区间初始值

%小于给定搜索区间数值,即:

2倍的步长小于给定区间允许误差,所以在此

%处特此加入判断语句,进行改正。

while(abs(fs0-fs2)>F)|(abs(s0-s2)>H)

sb=s0+(((3*fs0-4*fs1+fs2)*h)/(2*(fs0-2*fs1+fs2)));

hb=((4*fs1-3*fs0-fs2)*h)/(2*(2*fs1-fs0-fs2));

fsb=feval(f,sb);

%调试错误分析:

在初始的时候,sb,hb(分别代表下一步搜索点和搜索步长)的公式记错,

%出现结果计算不出现象,特此在调试的时候进行改正。

if(fs1<=fsb)

if(s1

s2=sb;fs2=fsb;

else

s0=sb;fs0=fsb;

end

else

if(s1>sb),

s2=s1;s1=sb;fs2=fs1;fs1=fsb;

else

s0=s1;s1=sb;fs0=fs1;fs1=fsb;

end

end

k=k+1;G(k,:

)=[s0,s1,s2];

end

end

s=s1;fs=fs1;

fc=fs2-fs0;

c=abs(s2-s0);

E=[hb,c,fc];

%调试错误分析:

在初始调试的时候,令其输出的是sb,fsb但结果算出的不正确。

我对算法

%没能够完全理解,其实再算出的中间的时候,数值已经赋值给s1,所以应该

%输出s1值,并且增加了输出最后一步步长的数值功能。

在此处我选取,抛物线方法搜索区间允许误差为0.005,函数值允许误差为0.001,并在窗口内输入如下语句:

>>[s,fs,k,G,E]=paowu1(inline('s^2-6*s+2'),1,0.1,0.005,0.01)

回车之后得到如下数据结果:

极小点

极小点数值

迭代次数

搜索区间误差

函数值误差

3.0000

-7.0000

3

0.0027

0.0097

附:

在窗口中输出的结果如下

>>[s,fs,k,G,E]=paowu1(inline('s^2-6*s+2'),1,0.1,0.005,0.01)

itisOK,pleasegoon

s=

3.0000

fs=

-7.0000

k=

3

G=

1.00001.10001.2000

1.10003.00001.2000

1.20273.00001.2000

E=

0.10270.00270.0097

4、用抛物线法求

的近似最优解,初始搜索区间为

,初始插值点

,终止条件为

.

解:

首先对函数作出图像,观察其最小值点在给定区间的大致位置,如下所示,在命令窗口中输入命令:

>>f='s^3-2*s+1';

fplot(f,[02])

holdon;

title(f)

从函数图像可以看出,最小值点大致在0.8左右,所以根据给出的初始点为1,所以步长取负数假设为-0.15,由于区间为[0,3],所以在程序中加入,判断控制语句,当插入的点有小于0时,程序停止。

在上一题的基础上编写的修正程序为:

function[s,fs,k,G,E]=paowu1(f,s0,h0,H,F)

%输入:

%f:

目标函数;s0:

初始迭代点;h0:

初始选择步长;

%H:

搜索区间容许误差值;F:

函数值容许误差值;

%输出:

%s:

近似极小数值点;fs:

近似极小点函数值;k:

迭代次数;

%G:

k行4列矩阵;E[hb,fc,m]分别为最终步长、搜索函数值误差、搜索区间误差

s1=s0+h0;s2=s0+2*h0;h=h0;

fs0=feval(f,s0);fs1=feval(f,s1);fs2=feval(f,s2);

k=1;G(k,:

)=[s0,s1,s2];

if((fs1>fs0)||(fs1>fs2)),

fprintf('itiserror,pleasechangeanotheranableh0');

else

fprintf('itisOK,pleasegoon');

end

%调试错误分析:

调试时候将书中的数据进行带入,改变函数输入步长,发现不同步长的

%结果不一样,并且误差较大。

后来发现在一开始的时候,步长较短不能保证

%三个插值函数点中间低两边高,所以在进行测验时,特此编写此判断控制语句。

%如果正确,则可运用此结果;反之,则改变原来输入数值。

if(abs(s2-s0)

sb=s1;fsb=fs1;hb=h0;

k=1;G(k,:

)=[s0,s1,s2];

else

%调试错误分析:

在进行第二次调试的时候,发现没有考虑当初始的时候,搜索区间初始值

%小于给定搜索区间数值,即:

2倍的步长小于给定区间允许误差,所以在此

%处特此加入判断语句,进行改正。

while(abs(fs0-fs2)>F)||(abs(s0-s2)>H)

if(((s0)<0)&(s1)<0&((s2)<0)),

break

else

continue

end

sb=s0+(((3*fs0-4*fs1+fs2)*h)/(2*(fs0-2*fs1+fs2)));

hb=((4*fs1-3*fs0-fs2)*h)/(2*(2*fs1-fs0-fs2));

fsb=feval(f,sb);

%调试错误分析:

在初始的时候,sb,hb(分别代表下一步搜索点和搜索步长)的公式记错,

%出现结果计算不出现象,特此在调试的时候进行改正。

if(fs1<=fsb)

if(s1

s2=sb;fs2=fsb;

else

s0=sb;fs0=fsb;

end

else

if(s1>sb),

s2=s1;s1=sb;fs2=fs1;fs1=fsb;

else

s0=s1;s1=sb;fs0=fs1;fs1=fsb;

end

end

k=k+1;G(k,:

)=[s0,s1,s2];

end

end

s=s1;fs=fs1;

fc=fs2-fs0;

c=abs(s2-s0);

E=[hb,c,fc];

在窗口中输入命令语句:

>>[s,fs,k,G,E]=paowu1(inline('s^3-2*s+1'),1,-0.15,0.01,0.01)

得到的结果为:

最小值近似点为0.8127,函数值为:

-0.0886,迭代6次,允许误差均在控制范围之内。

附:

命令窗口语句如下

>>[s,fs,k,G,E]=paowu1(inline('s^3-2*s+1'),1,-0.15,0.01,0.01)

itisOK,pleasegoon

s=

0.8127

fs=

-0.0886

k=

6

G=

1.00000.85000.7000

1.00000.81270.8500

0.77950.81270.8500

0.62310.81270.8500

0.40290.81270.8500

0.17910.81270.8500

E=

-0.22500.00010.0000

5、分别用书中所给的0.618法和抛物线法matlab程序计算下列问题的近似最优解:

解:

(1)

由函数图像可知极小近似点大约在0.5左右,所以应用第一题程序,选取区间为[-1,1],计算出结果如下:

近似极小值点:

0,3517;近似点函数值:

0.8272;迭代次数:

23;误差为1.0e-04*0.5050。

其中在命令窗口输入指令如下:

>>[s,fs,k,G,FX,E]=gold(inline('exp(-s)+s^2'),-1,1,0.15,1e-10)

s=

0.3517

fs=

0.8272

k=

23

G=

-1.0000-0.23610.23611.0000

-0.23610.23610.52791.0000

-0.23610.05570.23610.5279

0.05570.23610.34750.5279

0.23610.34750.41640.5279

0.23610.30500.34750.4164

0.30500.34750.37380.4164

0.30500.33130.34750.3738

0.33130.34750.35760.3738

0.34750.35140.35370.3576

0.34750.34990.35140.3537

0.34990.35140.35230.3537

0.34990.35080.35140.3523

0.35080.35140.35170.3523

0.35140.35170.35190.3523

0.35140.35160.35170.3519

0.35160.35170.35180.3519

0.35160.35170.35170.3518

0.35170.35170.35170.3518

0.35170.35170.35180.3518

0.35170.35170.35170.3518

FX=

3.71831.32200.84551.3679

1.32200.84550.86851.3679

1.32200.9489

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1