往期回顾
【MATLAB机器人建模汇总】
⧫
【Matlab 六自由度机器人】系列文章汇总
\blacklozenge \fcolorbox{green}{aqua}{【Matlab 六自由度机器人】系列文章汇总 }
⧫【Matlab 六自由度机器人】系列文章汇总
【MATLAB机器人补充说明】
- 关于灵活工作空间与可达工作空间的理解
- 关于改进型D-H参数(modified Denavit-Hartenberg)的详细建立步骤
- 关于旋转的参数化(欧拉角、姿态角、四元数)的相关问题
- 关于双变量函数atan2(x,y)的解释
- 关于机器人运动学反解的有关问题
【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),x∈R, 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(x_2)
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(x_0+\lambda h)
f(x0+h)<f(x0+λh), 从而确定搜索区间为
[
x
0
,
x
0
+
λ
h
]
[x_0 , x_0+\lambda h]
[x0,x0+λh] 。
如果
f
(
x
0
)
<
f
(
x
0
+
h
)
f(x_0)<f(x_0+h)
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−λh,x0+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
总结
以上就是进退法迭代求解无约束一维极值问题的内容,本文详细介绍了如何理解进退法及如何进行迭代求解,最后进行代码的实现。