⽆约束⼀维极值——进退法
前⾔
在求解⽬标函数的极⼩值的过程中,若对设计变量的取值范围不加限制,称这种最优化问题为⽆约束优化问题。尽管对于机械的优化设计问题,多数是有约束的,但⽆约束最优化⽅法仍然是最优化设计的基本组成部分。因为约束最优化问题可以通过对约束条件的处理,转化为⽆约束最优化问题来求解。
⽆约束⼀维极值问题求解时⼀般采⽤⼀维搜索法,其中⽅法包括多种。线性搜索包括黄⾦分割、斐波那契法、⽜顿法等,⾮线性搜索包括抛物线法和三次插值法。
1.⽆约束算法基础
⽆约束最优化算法求解⽆约束最优化问题的⽅法,有解析法和直接法两类:
kra1. 解析法就是利⽤⽆约束最优化问题中⽬标函数f(x)的解析表达式和它的解析性质(如函数的⼀阶导数和⼆阶导数),给出⼀种求它的最优解的⽅法,或⼀种求近似解的迭代⽅法。解析法主要有最速 下降法、共轭⽅向法、共轭梯度法、⾮⼆次函数的共轭梯度法、⽜顿法、拟⽜顿法、变尺度法等。
2. 直接法就是在求最优解的过程中,只⽤到函数的函数值,⽽不必利⽤函数的解析性质。直接法也是⼀种
迭代法,迭代步骤简单。当⽬标函数的表达式⼗分复杂,或写不出具体表达式时,它就成为了重要的⽅法。直接法适应⾯很⼴,适⽤于计算机运算。
暂停英文2.进退法
进退法是⼀种缩⼩极值区间的算法,算出的结果是⼀个包含极值的区间,适⽤于未知极值范围的情况下使⽤。在线学习
其理论依据是f(x)为单⾕函数(只有⼀个极值点),且[a,b]为其极⼩值点的⼀个搜索区间,对于任意x1,x2∈[a,b],如果f(x1)<f(x2),则[a,x2]为极⼩值的搜索区间,如果f(x1)> f(x2),则[x1,b]为极⼩值的搜索区间。
因此,在给定初始点x0及初始搜索步长h的情况下,⾸先以初始步长向前搜索⼀
步,计算f(x0+h)。
睡词组如果f(x0) > f(x0 +h),则可知搜索区间为[x0,x],其中x待求,为确定x,前进⼀步计算 f(x0+λh),λ为放⼤系数,且 λ>1,直到找到合适的λ" ,使得f(x0 +h) < f(x0+λ" h),从⽽确定搜索区间为[x0,x0+λ"h]。
如果f(x0) < f(x0 +h),则可知搜索区间为[x,x0+h],其中x待求,为确定x,后退⼀步计算 f(x0-λh),λ为缩
⼩系数,且0<λ<1,直到找到合适的λ”,使得 f(x0-λ" h) > f(x0),从⽽确定搜索区间为[x0 -λ”h,x0+h]。
进退法的基本算法步骤如下:
1. 给定初始点x ,初始步长h0,令h=h0,x =x ,k=0;
2. 令x =x +h,k=k+1;
3. 若f(x ) < f(x ),则转到步骤(4),否则转到步骤(5);
4. 令x =x ,x =x ,f(x )=f(x ) , f(x )=f(x ),令h = 2h ,转到步骤(2);
5. 若 k=1,则转到步骤(6),否则转到步骤(7);
6. 令h = -h , x = x , f(x )= f(x ),转到步骤(2);
7. 令x =x ,x =x , x = x 停⽌计算, 极⼩值点包含于区间[x , x ]或[x , x ]。
根据以上分析,编写⽤进退法求解⼀维函数的极值区间的MATLAB函数fun_ JT
如下:
(0)(1)(1)(4)(1)(4)(1)(2)(1)(1)(4)(2)(1)(1)(4)(2)(4)(2)(4)(3)(2)(2)(1)(1)(4)(1)(3)(3)(1)
function[minx, maxx]=fun_JT(f, x0, h0, eps)函授学历
%⽬标函数:f
四六级满分多少%初始点:x0
%初始步长:h0
%精度:eps
%⽬标函数取包含极值的区间左端点:minx
%⽬标函数取包含极值的区间⼜端点:maxx
format long;
if nargin ==3;eps =1.0e-6;end
x1 = x0;k=0;h= h0;
while1
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;aside是什么意思
f2 = f1;
f1 = f4;
h =2* h;
el
if k ==1
h =-h;
x2 = x4;
拜见岳父大人3
f2 = f4;
el
x3 = x2;
x2 = x1;
x1 = x4;
break;
end
斯坦福大学公开课end
end
minx = min (x1,x3);流行美语
maxx = x1 +x3 -minx;
format short;
end
42
例 取初始点为 0,步长为0.05,⽤进退法求函数f(t)=t-2t-t+1的极值区间。解:
clear all
clc
syms t;
f=t^4-2*t^2-t+1;
[x1,x2]=fun_JT(f,0,0.05)
由上⾯的结果可知f(t)的极值点在区间[0.35,1.55]内。