@[优化设计基础上机练习2]
函数M文件
按进退法、黄金分割法算法原理,编写一维优化问题M函数,并求以下一维目标函数的极小值,要求如下:
1、 对函数主要命令语句的功能进行注释;
2、 输出极小值及黄金分割法的迭代轮次,分别命名为x_opti、k;
3、 M函数以hw+学号后三位命名,进退法初始点取0,初始步长取1,收敛精度取为1e-6;
4、 一维目标函数为f(x)=sin(x)+3sin(2x);
参考源程序
function [x_opti,k] = hw010(fun,eps)
%hw010 基于进退法、黄金分割法求一维函数的极小值,进退法初始点取0、初始步长取1
%x_opti:一维搜索极小值点(输出)
%k:黄金分割法的迭代轮次(输出)
%fun:一维目标函数(输入)
%eps:收敛精度
x1=0;
f1=eval(subs(f,symvar(f),x1));
h=1;
x2=x1+h;
f2=eval(subs(f,symvar(f),x2));
k=0;
if f1>=f2
while 1
x3=x2+h;
f3=eval(subs(f,symvar(f),x3));
if f2>f3
x1=x2;
x2=x3;
f2=f3;
h=2*h;
k=k+1;
else
a=x1;
b=x3;
break;
end
if k>=1000
disp('进退法算法失效,未找到初始搜索区间');
break
end
end
else
x3=x2;
x2=x1;
f2=f1;
while 1
x1=x2-h;
f1=eval(subs(f,symvar(f),x1));
if f2>f1
x3=x2;
x2=x1;
f2=f1;
h=2*h;
k=k+1;
else
a=x1;
b=x3;
break;
end
if k>=1000
disp('经1000次迭代,进退法算法失效,未找到初始搜索区间,请修改M函数');
break
end
end
end
golden_ratio=(sqrt(5)-1)/2;
x1=b-golden_ratio*(b-a);
x2=a+golden_ratio*(b-a);
f1=eval(subs(f,symvar(f),x1));
f2=eval(subs(f,symvar(f),x2));
k=1;
while 1
if f1>=f2
a=x1;
x1=x2;
x2=a+golden_ratio*(b-a);
else
b=x2;
x2=x1;
x1=b-golden_ratio*(b-a);
end
C=b-a;
if C<eps
disp('目标函数的极小值x_opti及黄金分割法的迭代轮次k分别为:');
x_opti=(a+b)/2;
break
end
k=k+1;
if k>=1000
disp('经1000次迭代,黄金分割法算法失效,未找到满足收敛精度的一维函数极小值,请修改M函数');
break
end
f1=eval(subs(f,symvar(f),x1));
f2=eval(subs(f,symvar(f),x2));
end
报告格式
上机作业一
班级: 姓名: 学号:
按进退法、黄金分割法算法原理,编写一维优化问题M函数,并求以下一维目标函数的极小值,要求如下:
1、 对函数主要命令语句的功能进行注释;
2、 输出极小值及黄金分割法的迭代轮次,分别命名为x_opti、k;
3、 M函数以hw+学号后三位命名,进退法初始点取0,初始步长取1,收敛精度取为1e-6;
4、 一维目标函数为f(x)=sin(x)+3sin(2x);
一、 函数M文件源程序
function [x_opti,k] = hw010(fun,eps)
%hw010 基于进退法、黄金分割法求一维函数的极小值,进退法初始点取0、初始步长取1
%x_opti:一维搜索极小值点(输出)
%k:黄金分割法的迭代轮次(输出)
%fun:一维目标函数(输入)
%eps:收敛精度
x1=0;
。。。
二、 命令窗口中输入
syms x
fun=sin(x)+3sin(2x);
[x_opti,k] = hw010(fun,1e-6)
三、 运行结果
目标函数的极小值x_opti及黄金分割法的迭代轮次k分别为:
。。。