无约束一维极值问题
极值问题表达式:min f(x) x,x[ x1 x2];
一维极值的搜索方式包括线性搜索和非线性搜索,线性搜索包含黄金分割法、斐波那契法和牛顿法,非线性方法包含抛物线法和三次样条插值。
1、进退法
算法原理:
进退法就是用来确定搜索区间的算法,理论依据:f(x)为函数有一极值,且【a b】为极值的区间,对于任一x1 和x2属于【a b】,如果f(x1)<f(x2),则【a x2】为极小值的搜索区间,如果f(x1)>f(x2),则搜索区间为【x1 b】为极小值的搜索区间,
因此,给定初始值x0,初始搜索步长h的情况下,首先以初始步长进行搜索,计算f(x0+h),
(1)如果f(x0)<f(x0+h)
则搜索区间为【x x+h】,为确定x,计算f(x0+ƪh),,
(2)如果f(x0)>f(x0+h)
则搜索区间为【x+h x】,为确定x,计算f(x0+ƪh),,
算法步骤:
1、给定初值x(0),初始步长h0,领h=h0,x(1)=x(0),k=0
2、给定x(4)=x(1)+h,置k=k+1
3、若f(x(4))<f(x(0)),则转到4,否则转到5
4、令x(2)=x(1),x(1)=x(4),f(x(2))=f(x(1)),f(x(1))=f(x(4)),令h=2*h
5、若k=1,转到6,否则转到7
6、令h=-h,x(2)=x(4),f(x(2))=f(x(4)),转到2
7、令x(3)=x(2),x(2)=x(1),x(1)=x(4),停止计算,极小点包含区间[x(0) x(1)],或者【x(3) x(1)]
算法代码:
<span style="font-size:18px;"><strong>%进退法
% 功能:用进退法法求解一维函数极值
%目标函数:f
% 初始点:x0
% 初始步长h0
% 精度 eps
% 目标函数取包含极值的区间左端点 minx
% 目标函数取包含极值的区间右端点 maxx
function [minx,maxx]=minJT(f,x0,h0,eps)
format long;
if nargin==3
eps=1.0e-6;
end
x1=x0;
k=0;
h=h0;
while 1
x4=x1+h;
k=k+1;
f4=subs(f,findsym(f),x4);
f1=subs(f,findsym(f),x1);
if f4<f1
x2=x1;
x1=x4;
f2=f1;
f1=f4;
h=2*h;
else
if k==1
h=-h;
x2=x4;
f2=f4;
else
x3=x2;
x2=x1;
x1=x4;
break;
end
end
end
minx=min(x1,x3);
maxx=x1+x3-minx;
format short;</strong></span>