Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб3.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.07 Mб
Скачать

1. Метод деформируемого многогранника (метод Нелдера-Мида)

В основу метода положено построение последовательности систем точек которые являются вершинами выпуклого многогранника. Точки системы на итерации совпадают с точками системы кроме , где точка - наихудшая в системе , то есть, . Точка заменяется на другую точку по специальным правилам (смотри алгоритм). Построение последовательности многогранников заканчивается, когда значения функции в вершинах текущего многогранника отличаются от значений функции в центре тяжести системы не более, чем на .

Листинг программы:

[XnM FnM]=DefMnogogrannik(@func,[0.5 6.5],0.25,1,0.5,2)

Листинг функции DefMnogogrannik:

function [x fx]=DefMnogogrannik(f, vect, koef, alpha, betta, gamma)

%f-funkcia,vect-vector x0,koef-rast9j

q=to4ki(vect,koef);%q-matrica,to4ki-funkcia postroenia simplecsa

n=length(q(1,:));

k=0;

kk=4;

eps=0.001;

for i=1:n+1

b(1,i)=q(i,1);

b(2,i)=q(i,2);

end;

b(1,kk)=q(1,1);

b(2,kk)=q(1,2);

while 1

[fl il]=min([f(q(1,:)) f(q(2,:)) f(q(3,:))]);

[fs is]=max([f(q(1,:)) f(q(2,:)) f(q(3,:))]);

%is=nomer max,il=moner min

for i=1:n+1

if i~=il

if i~=is

ic=i;

end;

end;

end;

xs=q(is,:);

xl=q(il,:);

xc=q(ic,:);

centr=[0 0];

for i=1:n+1

if i~=is

centr=centr+q(i,:);

end;

end;

centr=centr/n;

fcentr=f(centr);

S=0;

for i=1:n+1

S=S+(f(q(i,:))-fcentr)^2;

end;

S=(S/(n+1))^0.5;

if S<=eps

x=xl;

break;

else

if S>eps

z1=centr+alpha*(centr-xs);

if f(z1)<=f(xl)

z2=centr+gamma*(z1-centr);

if f(z2)<f(xl)

q(is,:)=z2;

k=k+1;

kk=kk+1;

for i=1:n+1

b(1,kk)=q(i,1);

b(2,kk)=q(i,2);

kk=kk+1;

end;

b(1,kk)=q(1,1);

b(2,kk)=q(1,2);

else

if f(z2)>=f(xl)

q(is,:)=z1;

k=k+1;

kk=kk+1;

for i=1:n+1

b(1,kk)=q(i,1);

b(2,kk)=q(i,2);

kk=kk+1;

end;

b(1,kk)=q(1,1);

b(2,kk)=q(1,2);

end;

end;

else

if and(f(z1) > f(xc), f(z1) <= f(xs))

z3=centr+betta*(xs-centr);

q(is,:)=z3;

k=k+1;

kk=kk+1;

for i=1:n+1

b(1,kk)=q(i,1);

b(2,kk)=q(i,2);

kk=kk+1;

end;

b(1,kk)=q(1,1);

b(2,kk)=q(1,2);

else

if and(f(xl)<f(z1),f(z1)<=f(xc))

q(is,:)=z1;

k=k+1;

kk=kk+1;

for i=1:n+1

b(1,kk)=q(i,1);

b(2,kk)=q(i,2);

kk=kk+1;

end;

b(1,kk)=q(1,1);

b(2,kk)=q(1,2);

else

if f(z1)>=f(xs)

for i=1:n+1

q(i,:)=xl+0.5*(q(i,:)-xl);

k=k+1;

end;

kk=kk+1;

for i=1:n+1

b(1,kk)=q(i,1);

b(2,kk)=q(i,2);

kk=kk+1;

end;

b(1,kk)=q(1,1);

b(2,kk)=q(1,2);

end;

end;

end;

end;

end;

end;

end;

q = 0: .1 : 4;

z = 3: .1 :7 ;

[X, Y] = meshgrid(q, z);

Z = X.^2-4*X+4+Y.^2-10*Y+25;

figure;

[CMatr,h]=contour(X, Y, Z, 6);

clabel(CMatr,h)

clabel([2 5],h)

xlabel('X');

ylabel('Y');

grid on;

hold on;

plot(b(1,1:kk-1),b(2,1:kk-1),'-*k');

fx=f(x);

kNm=k

end

Функция to4ki(vect,koef)строит начальный симплекс, где vect- начальная точка,

Koef-коэффициент растяжения

Листинг функции:

function x = to4ki(k,alpha)

d=length(k);

w=eye(d,d);

x(1,:)=k(1,:);

for i=2:3

x(i,:)=x(1,:)+alpha*w(:,i-1)';

end;

end

Функция func(x)считает значение функции в точке , где x-вектор

Листинг функции:

function fxy = func(x)

fxy = (x(1) - 2).^2 + (x(2) - 5).^2;

end

Результаты:

График движения по линиям уровня

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]