线性搜索:对于每一个x都有已知的明确的方向,要选取合适的步长。
按照步长是否确定值还是一个范围分为精确线性搜索和非精确线性搜索
精确线性搜索例子:二分法、黄金分割法、斐波那契数列法
二分法
function binarySearch()
% 利用二分法求最优解(极小值)
% 题设函数可视化
f=@(x)x.^4-14*x.^3+60*x.^2-70*x; % 原函数
g=@(x) 4*x.^3 - 42*x.^2 + 120*x - 70; % 导函数
X = -0.5:0.001:1.5;
Y = f(X);
Z = g(X);
hold on;
grid on;
plot(X,Y,'r');
% plot(X,Z,'b');
% 二分搜索
syms U L x_k;
U = input('请输入区域上限:');
L = input('请输入区域下限:');
while (U-L) >= 0.1
x_k = (U+L)/2;
%如果导数为0就退出
if g(x_k) == 0
break; % x^* = x_k
end
if g(x_k)>0
U = x_k; % [a_k+1, b_k+1] = [a_k, x_k]
else
L = x_k; % [a_k+1, b_k+1] = [x_k, b_k]
end
% 可视化
plot(x_k,f(x_k),'go','linewidth',1);
pause(1);
end
str=strcat('(',num2str(x_k),',',num2str(f(x_k)),')');
text(x_k,f(x_k),str) ;
x_ = x_k; % 二分法求得的极值点
y = x_^4 - 14*x_^3 + 60*x_^2 - 70*x_;
syms x root; % 真实的极值点
root = vpasolve(g(x)==0, x);
vpa(root, 4)
y % 计算值
f(root(1)) %真实值
end
黄金分割法
function GoldenRatio()
% 利用黄金分割法求最优解(极小值)
%匿名函数,方便使用
f = @(x) x.^4 - 14*x.^3 + 60*x.^2 - 70*x;
X = -0.5:0.001:1.5;
Y = f(X);
hold on;
grid on;
plot(X,Y,'r');
% 黄金分割比例系数
p = (3-sqrt(5))/2;
% 黄金分割
U = input('请输入区域上限:');
L = input('请输入区域下限:');
while U-L >= 0.1
x_1 = L + p*(U-L);
x_2 = L + (1-p)*(U-L);
if f(x_1) <= f(x_2)
U = x_2;
elseif f(x_1) > f(x_2)
L = x_1;
end
% 可视化
plot(x_1,f(x_1),'go','linewidth',1);
pause(1);
end %while
str=strcat('(',num2str(x_1),',',num2str(f(x_1)),')');
text(x_1, f(x_1), str) ;
fprintf('%s%f\n','x1: ',x_1);
fprintf('%s%f\n','x2: ',x_2);
fprintf('%s%f\n','最优解: ',f(x_1));
end
斐波那契数列法
function FibRatio()
% 利用斐波那契数列法求最优解(极小值)
% 参数
a = -5;
b = 10;
N = 1475; %总迭代次数
k = 1; % 迭代次数
% p参数
function p = P(k,N)
p = 1 - Fibs(N - k + 1) / Fibs(N - k + 2);
end
function result = F(nterms) % 斐波那契数列
f1 = 1; % 第一项
f2 = 1; % 第二项
mycount = 2;
result = [];
if nterms == 1
result(end+1)=f1;
elseif nterms == 2
result(end+1)=f1;
result(end+1)=f2;
else
result(end+1)=f1;
result(end+1)=f2;
while mycount < nterms
f = f1 + f2;
result(end+1)=f;
f1 = f2;
f2 = f;
mycount = mycount + 1;
end
end
end
% 根据总迭代次数生成斐波那契数列
Fibs = F(N+1);
% 题设函数
f = @(x) x.^2;
% 斐波那契分割
while 1
p = P(k, N);
k = k + 1;
x_1 = a + p * (b - a);
x_2 = a + (1 - p) * (b - a);
if (f(x_1) <= f(x_2))
b = x_2;
else
a = x_1;
end
if k > N
break
end
end
fprintf('%s%f\n','x1: ',x_1);
fprintf('%s%f\n','x2: ',x_2);
fprintf('%s%f\n','最优解: ',f(x_1));
end
牛顿法
function Newton()
f = @(x) x.^4 - 14*x.^3 + 60*x.^2 - 70*x; % 原函数
g = @(x) 4*x.^3 - 42*x.^2 + 120*x - 70; % 导函数
h = @(x) 12*x.^2 - 84*x + 120; % 二阶导函数
X = -1:0.001:2;
Y = f(X);
Z = g(X);
W = h(X);
hold on;
grid on;
plot(X,Y,'r');
plot(X,Z,'b');
plot(X,W,'y');
syms x;
x = input('请输入初始值:');
while abs(g(x)/h(x)) >= 0.001
if g(x) == 0
break;
end
x = x - g(x)/h(x);
% 可视化
plot(x,f(x),'go','linewidth',3);
pause(1);
end
str=strcat('(',num2str(x),',',num2str(f(x)),')');
text(x,f(x),str) ;
% 输出最优解
x
f(x)
end