最优化方法--线性搜索问题

线性搜索:对于每一个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

在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值