利用黃金分割法一維搜索的最速下降法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);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM