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((fs1fprintf('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(s1s2=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(s1s2=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