#5 更新 'test1.m'

Closed
liuy wants to merge 1 commits from liuy-patch-5 into master
  1. +73
    -72
      test1.m

+ 73
- 72
test1.m View File

@@ -1,72 +1,73 @@
syms x1 x2;
X = [x1;x2];
fx = x1^2 - 2*x1*x2 + x2^2 + x2^4;
x=[0;1];
e=0.01;
minVal = GDMin2(fx,X,x,e);
function [ y ] = GDMin2(fx,var,x,e,MAX)
% 最速梯度下降法求解函数极小点
% 参数描述------------------------------
% fx 符号表达式
% var 符号变量列表 如:syms x1 x2;var= [x1;x2];
% x 起始位置
% e 精度控制
% MAX 最大迭代次数控制
% ------------------------------
% Armijo步长
step=3;% 初始步长设定
r=0.7; % 取值范围(0,1),越大越快
b=0.1; % 取值范围(0,1),越大越慢
if nargin < 5
MAX = 100;%设置默认最大迭代次数
end
precision = 5;%显示精度控制
%开始循环迭代
%direction存贮搜索方向
%step 存贮步长
bfound = 0;
for k=1:1:MAX
[gx,direction] = getNextDirecrion(fx,var,x);
disp('------------------------------');
% fprintf('d[%d]=:',k);
% disp( vpa(direction',precision) );
if abs(subs(gx,var,x)) <= e
y = x;
bfound = 1;%得到结果时置为1
break;
else
x0 = x+step*direction;
while subs(fx,var,x0) > subs(fx,var,x) + b*step*r*subs(gx',var,x)*direction
step = step*r;
x0 = x+step*direction;
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
fprintf('X[%d]=:',k);
disp( vpa(x',precision) );
fprintf('step(%d)=: ', k);
disp( vpa(step,precision) );
disp('min value of:');
fprintf("%.6f\n", vpa( subs(fx,var,y),precision) );
end
end
%根据位置xk,获取搜索方向
function [gx,direction] = getNextDirecrion(fx,var,xk)
gx = gradient(fx,var); %计算梯度函数
direction = -subs(gx,var,xk);%计算搜索方向
end
syms x1 x2;
X = [x1;x2];
fx = x1^2 - 2*x1*x2 + x2^2 + x2^4;
x=[0;1];
e=0.01;
minVal = GDMin2(fx,X,x,e);

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

% Armijo步长
%非精确求步长,当满足设定条件时才更新步长
step=3;% 初始步长设定
r=0.7; % 取值范围(0,1),越大越快
b=0.1; % 取值范围(0,1),越大越慢

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

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

bfound = 0;
for k=1:1:MAX
[gx,direction] = getNextDirecrion(fx,var,x);
disp('------------------------------');
% fprintf('d[%d]=:',k);
% disp( vpa(direction',precision) );
if abs(subs(gx,var,x)) <= e
y = x;
bfound = 1;%得到结果时置为1
break;
else
x0 = x+step*direction;
while subs(fx,var,x0) > subs(fx,var,x) + b*step*r*subs(gx',var,x)*direction
step = step*r;
x0 = x+step*direction;
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
fprintf('X[%d]=:',k);
disp( vpa(x',precision) );
fprintf('step(%d)=: ', k);
disp( vpa(step,precision) );
disp('min value of:');
fprintf("%.6f\n", vpa( subs(fx,var,y),precision) );
end
end

%根据位置xk,获取搜索方向
function [gx,direction] = getNextDirecrion(fx,var,xk)
gx = gradient(fx,var); %计算梯度函数
direction = -subs(gx,var,xk);%计算搜索方向
end


Loading…
Cancel
Save