【Matlab算法】进退法迭代求解无约束一维极值问题(附进退法MATLAB代码)

【Matlab最优化算法】进退法求解无约束一维极值问题

  • 往期回顾
  • 前言
  • 正文
    • 一、进退法原理
    • 二、代码实现进退法迭代求解
  • 总结
  • 参考文献

往期回顾

【MATLAB机器人建模汇总】
⧫ 【Matlab 六自由度机器人】系列文章汇总  \blacklozenge \fcolorbox{green}{aqua}{【Matlab 六自由度机器人】系列文章汇总 } Matlab  

  1. 定义标准型及改进型D-H参数,建立机器人模型。
  2. 运动学正解
  3. 基于蒙特卡罗方法(Monte Carlo Method)构建机器人工作空间

【MATLAB机器人补充说明】

  1. 关于灵活工作空间与可达工作空间的理解
  2. 关于改进型D-H参数(modified Denavit-Hartenberg)的详细建立步骤
  3. 关于旋转的参数化(欧拉角、姿态角、四元数)的相关问题
  4. 关于双变量函数atan2(x,y)的解释
  5. 关于机器人运动学反解的有关问题

【MATLAB基础知识】

  • 系统常量说明——常用常量和常用特殊矩阵函数
  • 系统预定义变量——元胞数组与结构体

前言

【Matlab最优化算法】 求解无约束一维极值问题。
无约束问题是指在无约束条件的非线性规划问题,即 n n n元实函数 f f f在整个 n n n维向量空间 R n R_n Rn上的最优值点问题。
n = 1 n=1 n=1时,此时的问题为求解一维空间中的极值问题,
即目标函数和约束条件都是自变量的一次函数。
对于目标函数和约束条件可以用线性函数来表达的情况,由于线性规划的目标函数为线性函数,可行域为凸集,因而求出的最优解就是在整个可行域的全局最优解。
对于目标函数和(或)约束条件很难用线性函数来表达,即目标函数或约束条件中含有非线性函数的情况。求出的某个解虽是一部分可行域中的极值点,但却并不一定是整个可行域上的全局最优解。

无约束一维极值问题可简单表述为:
min ⁡ f ( x ) , x ∈ R \min f(x), x \in \mathrm{R} minf(x),xR, or min ⁡ f ( x ) , x ∈ [ x 1 , x 2 ] \min f(x), x \in\left[x_{1}, x_{2}\right] minf(x),x[x1,x2]
其中 x x x 为一维变量,相应的 f ( x ) f(x) f(x) 为一维变量 x x x 的函数。
如果自变量的范围为整个实数区间,此时的优化问题为求函数的最小值,是一个全局优化问题。我 们考虑的优化问题是以下两种情况:
(1)在自变量的范围为整个实数区间的前提下,求函数的任意一个极值;
(2) 在自变量的范围为给定区间的前提下,求函数的任意一个极值。
求解无约束一维极值问题常使用一维搜索法。一维搜索即沿着某一已知方向求目标函数的极小点, 其方法是根据已知点通过迭代公式求得新的点,而新的点比当前点更优。


以下是本篇文章正文内容,包含对进退法迭代求解无约束一维极值问题的理解和代码的分步解析。

正文

一、进退法原理

进退法是一种缩小极值区间的算法,算出的结果是一个包含极值的区间,适用于不知道极值范围的情况下使用。

其理论依据是 f ( x ) f(x) f(x) 为单谷函数(只有一个极值点),且 [ a , b ] [a, b] [a,b] 为其极小值点的一个搜索区间,对于任意 x 1 , x 2 ∈ [ a , b ] x 1, x 2 \in[a, b] x1,x2[a,b],如果 f ( x 1 ) < f ( x 2 ) f(x_1)f(x1)<f(x2),则 [ a , x 2 ] [a, x_2] [a,x2] 为极小值的搜索区间,如果 f ( x 1 ) > f ( x 2 ) f(x_1)>f(x_2) f(x1)>f(x2), 则 [ x 1 , b ] [x_1, b] [x1,b] 为极小值的搜索区间。
因此,在给定初始点x0及初始搜索步长h的情况下,首先以初始步长向前搜索一 步,计算 f ( x 0 + h ) f(x_0+h) f(x0+h)
如果 f ( x 0 ) > f ( x 0 + h ) f(x_0)>f(x_0+h) f(x0)>f(x0+h), 则搜索区间为 [ x 0 , x ] [x_0, x] [x0,x], 其中x待求, 为确定 x x x, 前进一步计算 f ( x 0 + λ h ) , λ f(x_0+\lambda h), \lambda f(x0+λh),λ 为放大系数, 且 λ > 1 \lambda>1 λ>1, 直到找到合适的 λ \lambda λ, 使得 f ( x 0 + h ) < f ( x 0 + λ h ) f(x_0+h)f(x0+h)<f(x0+λh), 从而确定搜索区间为 [ x 0 , x 0 + λ h ] [x_0 , x_0+\lambda h] [x0x0+λh]
如果 f ( x 0 ) < f ( x 0 + h ) f(x_0)f(x0)<f(x0+h) ,则搜索区间为 [ x , x 0 + h ] [x, x_0+h] [x,x0+h], 其中 x x x待求,为确定 x x x, 后退一步计算 f ( x 0 − λ h ) , λ f(x_0-\lambda h), \lambda f(x0λh),λ为缩小系数,且 0 < λ < 1 0<\lambda<1 0<λ<1, 直到找到合适的 λ \lambda λ, 使得 f ( x 0 − λ h ) > f ( x 0 ) f(x_0-\lambda h)>f(x_0) f(x0λh)>f(x0), 从而确定搜索区间为 [ x 0 − λ h , x 0 + h ] [x 0-\lambda h , x_0+h] [x0λhx0+h]

二、代码实现进退法迭代求解

%%
clear
clc
close all
warning off

tic
syms x;
f(x)= x^2-x+sin(x);
[x1,x2] = minJT(f,0,0.1,1.0e-6);
i = 1;
%区间的大小
internal = 1.0e-2;
while x2-x1>internal
    x3(i) = x1;
    x4(i) = x2;
    [x1,x2] = minJT(f,x1,internal/10,1.0e-6);
    i = i+1;
end
toc

figure(1)
x = 1:1:i-1;
% plot(x,f(x))
hold on
plot(x,x3)
hold on
plot(x,x4)
hold on

%%
% 目标函数: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;

end

总结

以上就是进退法迭代求解无约束一维极值问题的内容,本文详细介绍了如何理解进退法及如何进行迭代求解,最后进行代码的实现。

参考文献

  1. MATLAB最优化设计之进退法寻找极值区间
  2. 无约束一维极值——进退法
  3. 无约束问题

你可能感兴趣的:(MATLAB最优化算法,matlab,算法,线性代数)