线性搜索方法
0.618法
function [ x_opt , y_opt , stepNum, t] = f618( f,a,b,Theta_error )
% 0.618法又称黄金分割法
% 输入函数名f,迭代初始区间[a,b],和精度Theta_error
% 输出最优点,最优解,迭代次数,和计算时间
tic ; % 开始计时
err = b - a; % 初始迭代误差
stepNum = 0; % 初始迭代次数
lamda = a + 0.382*(b-a);
mu = a + 0.618*(b-a);
flamda = feval(f,lamda);
fmu = feval(f,mu);
P=0;%指示flamda,fmu大小比较,P=0,flamda大
while (err > Theta_error)
if flamda > fmu
P=0;
a = lamda;
lamda = mu;
flamda = feval(f,mu);
mu = a+0.618*(b-a);
fmu = feval(f,mu);
else
P=1;
b = mu;
mu = lamda;
fmu = flamda;
lamda =a + 0.382*(b-a);
flamda = feval(f,lamda);
end
err = b - a; % 更新误差
stepNum = stepNum + 1;
end
if P==0
x_opt = mu;% 最优点
else
x_opt = lamda;
end
y_opt=feval(f,x_opt);%最优解
t = toc; % 计时结束
end
Fibonacci 法
function [ x_opt , k , t] = Fibonacci ( f,a,b,Theta_error)
%k迭代次数
tic ;
%% 计算Fibonacci数组,确定计算次数n
F=[1 1];%Fibonacci数组
n = 3;
tau = (b-a)/Theta_error;
Fn=F(n-1)+F(n-2);
while (Fn<tau) % 当Fn < (b-a)/detle 时
F=[F Fn];
n=n+1;
Fn=F(n-1)+F(n-2);
end
F=[F Fn];
%% 迭代
err = b - a;
k = 0;
while (err > Theta_error)
k = k + 1;
lamda = a + F(n-k-1)/F(n-k+1)*(b-a);
mu = a + F(n-k)/F(n-k+1)*(b-a);
%lamda、mu已自动更新,只需更新a和b
if f(mu) >= f(lamda)
b = mu;
else
a = lamda;
end
% 更新误差
err = b - a;
end
x_opt = (lamda+mu)/2 ;
% y_opt = f(x_opt);
t = toc;
end
二分法
function [ x_opt , stepNum , t ] = dichotomy( df, A , B, Theta_error)
% df:函数的导数df(x)
%默认A<B
tic;
stepNum = 0;
a=min(A,B);
b=max(A,B);
err = b-a;
% tau=Theta_error/(b-a);
% nmax=ceil(-log2(tau));%满足精度要求的最多迭代次数
while (err > Theta_error )
stepNum = stepNum + 1;
c = (a+b)/2; %区间中点
if df(c) == 0
x_opt = c;
break;
elseif df(c) > 0
b = c;
else
a = c;
end
err = b - a; %精度误差
end
x_opt = c;
t = toc;
end
牛顿法
function [ x_opt , stepNum, t] = newton(f,x0,Theta_error)
% 牛顿法
% 只适用于一元函数f
tic ;
syms x;
%避免与外部函数冲突,f的导数命名为Df
Df = diff(f(x));%f的导数
G = diff(Df);%f的二阶导数
% 开始迭代
xk= x0; % 迭代点初始化
err = inf;
stepNum = 0;
gk=inf;
xk_1=x0;%上一步xk初始化
while (err>Theta_error || abs(gk>Theta_error))
%当||gk||<=epsilon,停止迭代,未知因素导致gk不会无限趋于0,故加上当迭代点xk几乎不变时停止迭代
stepNum = stepNum + 1;
Gk=double(subs(G,x,xk));
% subs将函数字符串中的x变为xk,并将类型转换为double型
gk=double(subs(Df,x,xk))
%dk=-Gk^(-1)gk 步长
dk = -1/Gk*gk;
fun=@(alpha) f(xk)+alpha*dk*gk+1/2*(alpha*dk)^2*Gk;
%fun为f(xk+alpha*dk),alpha为步长因子,用二次taylor展开近似
alphak = fminunc(fun,1); % 解方程求最优alpha,设初始值为1
xk = xk + alphak*dk;
%更新误差
err = abs(xk_1-xk);
xk_1 = xk;
end
x_opt = xk;
t = toc;
end