|
Программа. Одномерная оптимизация. Метод «на три равных отрезка»
function DATA
global a b eps;
a=-5;
b=5;
eps=0.01;
end
function [ fx ] = f(x)
fx=x.^2-5;
end
function [ x,fx ] = fun_Odnom_Opt_Tri_Otr(a,b,eps)
x1=a;
x4=b;
for i=1:100
x2=x1+(x4-x1)/3;
x3=x4-(x4-x1)/3;
f2=f(x2);
f3=f(x3);
if f2<f3
x4=x3;
else
x1=x2;
end %if
if abs(x4-x1)<=2*eps
i
break;
end %if
end %for i
x=(x1+x4)/2;
fx=f(x);
end % function
function GLAV_Odnom_Opt_Tri_Otr
global a b eps x fx;
DATA;
[ x,fx ] = fun_Odnom_Opt_Tri_Otr(a,b,eps);
REPORT;
end
function REPORT
global a b eps x fx;
disp('Odnomern Optimizat Tri Otrezka');
disp(' ');
disp('Arguments');
disp(['a = ' num2str(a,'%10.5f') ]);
disp(['b = ' num2str(b,'%10.5f') ]);
disp(['eps = ' num2str(eps,'%10.5f') ]);
disp('Results');
disp(['x = ' num2str(x,'%10.5f') ]);
disp(['fx = ' num2str(fx,'%10.5f') ]);
h=(b-a)/(100);
for i=1:100
if i==1
xmas(i)=a;
else
xmas(i)=xmas(i-1)+h;
end %if
fmas(i)=f(xmas(i));
end
disp(' i x fx ');
disp(' ________________________________')
i=0;
for i=1:length(xmas)
xx=xmas(i);
ffx=fmas(i);
disp(sprintf('%10.3f\t%10.3f\t %10.3f',i,xx,ffx));
end %for
plot(xmas,fmas,'r.');
grid on;
xlabel('x');
ylabel('y');
title('Odnomern Optimizat Tri Otrezka');
end
Попробуем увеличить долю сокращения отрезка. Метод деления отрезка пополам.
1) Дан отрезок [a;b] на котором определена функция f(x) и точность e. Надо уточнить точку минимума с заданной точностью. Введём новое обозначение точек x1=a и x5=b. Делим отрезок [x1;x5] пополам и определяем точку середины x3=(x5+x1)/2 и значение функции F3=f(x 3).
2) Делим отрезок [x1;x3] пополам и определяем точку середины x2=(x1+x3)/2 и значение функции F2=f(x2). Делим отрезок [x3;x5] пополам и определяем точку середины x4=(x3+x5)/2 и значение функции F4=f(x4).
3) Определяем новый отрезок, содержащий точку экстремума, сравнив значения функций F2 и F3. Если F2 < F3, то границы нового отрезка определим как: x1=x1, x5=x3, x3=x2 и F3=F2 иначе если F4<F3, то x1=x3, x5=x5, x3=x4 и F3=F4 иначе x1=x2, x5=x4. Проверяем условие окончания итерационного процесса | x5-x1 | £ 2e. Если оно выполняется, то определим решение, как x=x3 и значение функции в этой точке f(x). Иначе перейдем на пункт 2. Эффективность метода Q≈0,5/2=0,25
Программа. Одномерная оптимизация. Деление на два равных отрезка
function DATA
global a b eps;
a=-5;
b=5;
eps=0.01;
end
function [ fx ] = f(x)
fx=x.^2-5;
end
function [ x,fx ] = fun_Odnom_Opt_Dva_Otr(a,b,eps)
x1=a;
x5=b;
x3=(a+b)/2;
f3=f(x3);
for i=1:100
if abs(x5-x1)>2*eps
x2=(x1+x3)/2;
x4=(x3+x5)/2;
f2=f(x2);
f4=f(x4);
if f2<f3
x5=x3;
x3=x2;
else
if f4<f3
x1=x3;
x3=x4;
f3=f4;
else
x1=x2;
x5=x4;
end %if
end %if
else
i
break;
end %if
end %for i
x=x3;
fx=f3;
end % function
function GLAV_Odnom_Opt_Dva_Otr
global a b eps x fx;
DATA;
[ x,fx ] = fun_Odnom_Opt_Dva_Otr(a,b,eps);
REPORT;
end % function
function REPORT
global a b eps x fx;
disp('Odnomern Optimizat Dva Otrezka');
disp(' ');
disp('Arguments');
disp(['a = ' num2str(a,'%10.5f') ]);
disp(['b = ' num2str(b,'%10.5f') ]);
disp(['eps = ' num2str(eps,'%10.5f') ]);
disp('Results');
disp(['x = ' num2str(x,'%10.5f') ]);
disp(['fx = ' num2str(fx,'%10.5f') ]);
h=(b-a)/(100);
for i=1:100
if i==1
xmas(i)=a;
else
xmas(i)=xmas(i-1)+h;
end %if
fmas(i)=f(xmas(i));
end
disp(' i x fx ');
disp(' ______________________________')
i=0;
for i=1:length(xmas)
xx=xmas(i);
ffx=fmas(i);
disp(sprintf('%10.3f\t%10.3f\t %10.3f',i,xx,ffx));
end %for
plot(xmas,fmas,'r.');
grid on;
xlabel('x');
ylabel('y');
title('Odnomern Optimizat Dva Otrezka');
end % function
Попробуем разбивать отрезок (рис.2.9.1) на такие части, чтобы одну из двух точек и соответствующее значение функции мы могли использовать на следующей итерации. Метод Золотого сечения.
|