利用黄金分割法一维搜索的最速下降法matlab源程序
黄金分割法以为搜索法源程序:
1 function xmin = goldSearch(fun,a,b,eps) 2 % ---input 3 % fun 所求的目标函数 4 % a 区间的下界 5 % b 区间的上界 6 %eps 区间的最小阀值长度 7 % ---output 8 % xmin 函数取极小值时自变量的值 9 x1 = a+0.382*(b-a); 10 x2 = a +0.618*(b-a); 11 f1 = fun(x1); 12 f2 = fun(x2); 13 while abs(b-a)>eps 14 if f1>f2 15 a = x1; 16 x1 = x2; 17 x2 = a +0.618*(b-a); 18 f1 = f2; 19 f2 = fun(x2); 20 else 21 b = x2; 22 x2 = x1; 23 x1 = a+0.382*(b-a); 24 f2 = f1; 25 f1 = fun(x1); 26 end 27 end 28 xmin=(b+a)/2; 29 fmin = fun(xmin)
最速下降法源代码:
1 function [feval,x] = gradientDescent(fun,gfun,x0,eps) 2 % ---input 3 % fun 所求的目标函数 4 % gfun 目标函数的梯度导数 5 % x0 初始值 6 % ---output 7 % feval 极小值 8 % x 极小值处自变量的值 9 10 syms u % 一维寻优中目标函数的自变量 11 grad = gfun(x0); 12 x = x0; 13 while norm(grad)> eps 14 goldfex = fun(x-u*grad); %表达式 15 goldf = inline(goldfex); %将表达式转换成关于u的匿名函数 16 lamda = goldSearch(goldf,0,0.3,0.1); %寻找最优步长 17 x = x-lamda*grad 18 grad = gfun(x); 19 norm(grad); 20 feval = fun(x) 21 end 22 feval = fun(x);
测试如下:
1 function main 2 clear,clc 3 % syms x1 x2 4 % u = [x1,x2]; 5 % fexp = 2*u(1).^2+u(2).^2; 6 % f = inline(fexp,'u'); 7 % gfexp = jacobian(fexp); 8 % gf = inline(gfexp,'u'); 9 x0 =[10,10,10]; 10 [fmin,x] = gradientDescent(@f,@gf,x0,0.1) 11 12 function y =gf(x) %目标函数f的梯度矩阵函数 13 % y= [4*x(1),2*x(2)]; 14 syms x1 x2 x3 15 fexp = f([x1,x2,x3]); 16 gfexp = jacobian(fexp); 17 gff = inline(gfexp,'x1','x2','x3'); 18 y =gff(x(1),x(2),x(3)); 19 % y = 2*cos(x); 20 21 function y = f(x) %目标函数 22 % y=2*x(1).^2+x(2).^2; 23 y=x(1)^2+x(2)^2+x(3)^2-10*cos(2*pi*x(1))-10*cos(2*pi*x(2))-10*cos(2*pi*x(3)); 24 % y = 8+2*sin(x);