#4 更新 'test.m'

Closed
liuy wants to merge 1 commits from liuy-patch-4 into master
  1. +76
    -75
      test.m

+ 76
- 75
test.m View File

@@ -1,75 +1,76 @@
syms x1 x2;
X = [x1;x2];
fx = x1^2 - 2*x1*x2 + x2^2 + x2^4;
x1=[0;1];
e=0.01;
minVal = GDMin2(fx,X,x1,e)
function [ y ] = GDMin2(fx,var,x,e,MAX)
% 最速梯度下降法求解函数极小点
% 参数描述------------------------------
% fx 符号表达式 如fx = (x1-2)^4+(x1-2*x2)^2;
% var 符号变量列表 如:syms x1 x2;var= [x1;x2];
% x 起始位置
% e 精度控制
% MAX 最大迭代次数控制
% ------------------------------
if nargin < 5
MAX = 10;%设置默认最大迭代次数
end
precision = 3;%显示精度控制
%开始循环迭代
%direction存贮搜索方向
%step 存贮步长
bfound = 0;
for k=1:1:MAX
direction = getNextDirecrion(fx,var,x);
disp('------------------------------');
fprintf('d[%d]=:',k);
disp( vpa(direction',precision) );
if normest(direction) <= e
y = x;
bfound = 1;%得到结果时置为1
break;
else
step = getNextStep(fx,var,x,direction);%计算步长
if isempty(step)
error('can not find a proper step.');
end
%打印求解过程
fprintf('X[%d]=:',k);
disp( vpa(x',precision) );
fprintf('step(%d)=: ', k);
disp( vpa(step,precision) );
disp('------------------------------');
x = x+step*direction;%计算下一个位置
end
end
if bfound == 1
disp('min value of:');
disp( vpa( subs(fx,var,y),precision) );
end
end
%根据位置xk,获取搜索方向
function [direction] = getNextDirecrion(fx,var,xk)
gx = gradient(fx,var); %计算梯度函数
direction = -subs(gx,var,xk);%计算搜索方向
end
%根据位置xk和方向dk,获取搜索步长step
%注意符号表达式求导数的根时返回值转换为double类型
function [step] =getNextStep(fx,var,xk,dk)
syms lambda;
phix = subs(fx,var,xk+lambda*dk);
phix_diff = diff(phix);
step = double(solve(phix_diff,'Real',true));%求取导函数的实数根
end
syms x1 x2;
X = [x1;x2];
fx = x1^2 - 2*x1*x2 + x2^2 + x2^4;
x1=[0;1];
e=0.01;
minVal = GDMin2(fx,X,x1,e)

function [ y ] = GDMin2(fx,var,x,e,MAX)
% 最速梯度下降法求解函数极小点
% 参数描述------------------------------
% fx 符号表达式 如fx = (x1-2)^4+(x1-2*x2)^2;
% var 符号变量列表 如:syms x1 x2;var= [x1;x2];
% x 起始位置
% e 精度控制
% MAX 最大迭代次数控制
% ------------------------------

if nargin < 5
MAX = 10;%设置默认最大迭代次数
end
precision = 3;%显示精度控制

%开始循环迭代
%direction存贮搜索方向
%step 存贮步长

bfound = 0;
for k=1:1:MAX
direction = getNextDirecrion(fx,var,x);
disp('------------------------------');
fprintf('d[%d]=:',k);
disp( vpa(direction',precision) );
if normest(direction) <= e
y = x;
bfound = 1;%得到结果时置为1
break;
else
step = getNextStep(fx,var,x,direction);%计算步长
if isempty(step)
error('can not find a proper step.');
end
%打印求解过程
fprintf('X[%d]=:',k);
disp( vpa(x',precision) );
fprintf('step(%d)=: ', k);
disp( vpa(step,precision) );
disp('------------------------------');
x = x+step*direction;%计算下一个位置
end
end
if bfound == 1
disp('min value of:');
disp( vpa( subs(fx,var,y),precision) );
end
end

%根据位置xk,获取搜索方向
function [direction] = getNextDirecrion(fx,var,xk)

gx = gradient(fx,var); %计算梯度函数
direction = -subs(gx,var,xk);%计算搜索方向
end

%根据位置xk和方向dk,获取搜索步长step
%注意符号表达式求导数的根时返回值转换为double类型
%精确求步长!!
function [step] =getNextStep(fx,var,xk,dk)

syms lambda;
phix = subs(fx,var,xk+lambda*dk);
phix_diff = diff(phix);
step = double(solve(phix_diff,'Real',true));%求取导函数的实数根
end




Loading…
Cancel
Save