
Untitled
By: a guest on
May 2nd, 2012 | syntax:
MatLab | size: 2.65 KB | hits: 16 | expires: Never
% Значения коэффициентов
g = 0.2; % постоянная шага
d = 0.001; % точность
l = 0.5; % коэффициент дробления шага
[x, y] = meshgrid(-20:0.1:20, -20:0.1:20);
%Z = c1*X.^2 + c2*Y.^2 + c12*X.*Y;
% func = sym('2*x1^2 + y1^2 + x1*y1')
% func = sym('x1^2 + y1^2')
syms x1 y1
func = sym('(1-x1)^2 + 100*(y1-x1^2)^2');
%func = sym('-2*x1^2 - y1^2 + x1*y1')
%func = sym('sin(((1/2)*x1^2)-((1/4)*y1^2) + 3)*cos(2*x1 + 1 - exp(y1))');
func_hl = matlabFunction(func);
derivateX = diff(func, x1);
derivateX = matlabFunction(derivateX);
derivateY = diff(func, y1);
derivateY = matlabFunction(derivateY);
z = func_hl(x,y);
% Начальная точка
sx1 = 4; sx2 = 3;
k = 1; % Счетчик шагов
kmax = 90; % Предельное число шагов,
% задается для предотвращения зацикливания
% Массивы для хранения промежуточных координат
x1trace = [sx1]; x2trace = [sx2];
i = 2;
% Градиенты
hold on;
[C, h] = contour(x, y, z);
clabel(C, h); % Отображение меток на линиях уровня
X = sx1; Y = sx2;
while k < kmax
derX = derivateX(X, Y);
derY = derivateY(X, Y);
X = X - g*derX;
Y = Y - g*derY;
tX = X;
tY = Y;
z = func_hl(x,y);
sz = func_hl(tX, tY);
if(sz < z)
x1trace(i) = X;
x2trace(i) = Y;
i = i + 1
plot(X, Y, '+');
if sqrt(derX^2 + derY^2) <= d
break;
end
k = k + 1
else
X = X + g*derX;
Y = Y + g*derY;
g = l*g;
end
end
plot(x1trace, x2trace, '-+');
% Вывод начальной точки на график
text(x1trace(1) + 0.2, x2trace(1) + 0.5, 'M0');
% Вывод решения на график
text(X + 2.5, Y, ...
strvcat(['x1 = ' num2str(X)], ...
['x2 = ' num2str(Y)], ...
['k = ' num2str(k)]));