
最速下降法求解,用matlb做,但是不能直接用里面的函数,里面的epsilon是终止误差,不是步长,谢谢~ 5
1个回答
展开全部
% 预分配数组空间提高效率
x1 = zeros(1,10000); x2 = zeros(1,10000);
fval = zeros(1, 10000);
% x1,x2的初始值
x1(1) = 4; x2(1) = 4;
% 计算f初值
fval(1) = 2*x1(1)^2+0.3*x2(1)^2;
% 步长控制
step = 0.1;
% 精度控制
epsilon = 0.01;
i = 2; % 迭代计数
while 1
dir1 = 4*x1(i-1); % f对x1的偏导数
dir2 = 0.6*x2(i-1); % f对x2的偏导数
dir = sqrt(dir1^2+dir2^2); % 梯度向量的模
if (dir < 1) % 在梯度向量的模较小时,不再归一化以提高精度
dir = 1;
end;
x1(i) = x1(i-1)-step*dir1/dir; % 新的x1
x2(i) = x2(i-1)-step*dir2/dir; % 新的x2
fval(i) = 2*x1(i)^2+0.3*x2(i)^2;
if(abs(fval(i) - fval(i-1)) < epsilon)
break;
end;
i=i+1;
end;
x1 = x1(1:i-1);
x2 = x2(1:i-1);
fval = fval(1:i-1);
% 可视化
X=-5:0.05:5;
Y=-5:0.05:5;
[X,Y] = meshgrid(X,Y);
Z = 2*X.^2+0.3*Y.^2;
surf(X,Y,Z);
shading interp
hold on;
plot3(x1, x2, fval, 'linewidth', 2, 'color', 'black');
hold off;
xlabel('x_1', 'fontsize', 16);
ylabel('x_2', 'fontsize', 16);
set(gca, 'fontsize', 12);
x1 = zeros(1,10000); x2 = zeros(1,10000);
fval = zeros(1, 10000);
% x1,x2的初始值
x1(1) = 4; x2(1) = 4;
% 计算f初值
fval(1) = 2*x1(1)^2+0.3*x2(1)^2;
% 步长控制
step = 0.1;
% 精度控制
epsilon = 0.01;
i = 2; % 迭代计数
while 1
dir1 = 4*x1(i-1); % f对x1的偏导数
dir2 = 0.6*x2(i-1); % f对x2的偏导数
dir = sqrt(dir1^2+dir2^2); % 梯度向量的模
if (dir < 1) % 在梯度向量的模较小时,不再归一化以提高精度
dir = 1;
end;
x1(i) = x1(i-1)-step*dir1/dir; % 新的x1
x2(i) = x2(i-1)-step*dir2/dir; % 新的x2
fval(i) = 2*x1(i)^2+0.3*x2(i)^2;
if(abs(fval(i) - fval(i-1)) < epsilon)
break;
end;
i=i+1;
end;
x1 = x1(1:i-1);
x2 = x2(1:i-1);
fval = fval(1:i-1);
% 可视化
X=-5:0.05:5;
Y=-5:0.05:5;
[X,Y] = meshgrid(X,Y);
Z = 2*X.^2+0.3*Y.^2;
surf(X,Y,Z);
shading interp
hold on;
plot3(x1, x2, fval, 'linewidth', 2, 'color', 'black');
hold off;
xlabel('x_1', 'fontsize', 16);
ylabel('x_2', 'fontsize', 16);
set(gca, 'fontsize', 12);
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询