【MATLAB机器人建模汇总】
⧫ 【Matlab 六自由度机器人】系列文章汇总 \blacklozenge \fcolorbox{green}{aqua}{【Matlab 六自由度机器人】系列文章汇总 } ⧫【Matlab 六自由度机器人】系列文章汇总
【MATLAB机器人补充说明】
【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)
因此,在给定初始点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 ) < f ( x 0 + h ) f(x_0)
%%
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
以上就是进退法迭代求解无约束一维极值问题的内容,本文详细介绍了如何理解进退法及如何进行迭代求解,最后进行代码的实现。