
- •Учреждение образования белорусский государственный университет информатики и электроники
- •Рабочая программа
- •Тема 9. Применение нелинейного программирования в задачах организации и планирования связи.
- •Тема 10. Динамическое программирование в электросвязи.
- •Тема 11. Сетевые методы планирования и управления.
- •I. Основы оптимизации управленческих решений
- •II. Использование методов линейного программирования в задачах связи
- •III. Транспортная задача линейного программирования в задачах связи
- •IV. Использование методов линейного программирования дня построения графиков работы на предприятиях связи
- •V. Нелинейное програмирование. Одномерный поиск.
- •VI. Методы многомерного поиска
- •VII динамическое программирование
- •Лабораторная работа n 4
- •Метод равномерного поиска
- •Метод поразрядного приближения
- •Метод последовательного перебора
- •Поиск минимума функции одной переменной методом квадратичной параболы
- •Минимизация функции методом Квадратичной интерполяции-экстраполяции
- •Метод пауэлла
- •Литература.
- •3.Построение опорного плана
- •3.1. Метод северо-западного угла.
- •3. 2. Метод наименьшей стоимости.
- •3.3. Метод Фогеля.
- •4.Оптимизация задачи методом потенциалов.
- •Для всех пустых клеток проверим критерий оптимальности:
- •Литература.
Минимизация функции методом Квадратичной интерполяции-экстраполяции
Интерполяция функции Y(x) одной переменной х, заданной (n+1) узлами y(x), где i=0,1,2,...n, заключается в нахождении значений Y по значениям х, находящихся в отрезке [X0,..Xn). При интерполяции функция f(x) заменяется интерполяционным полиномом p(x),значения которого p(x) в узлах точно совпадают с y(x). Значение n задает степень полинома p(x). Существует ряд специальных видов полинома p(x).
Экстраполяция - получение значений Y(x) при х, не принадлежащих отрезку [X0,..Xn]. Для гладких y(x) экстраполяция целесообразна при х, выходящих за указанные пределы не более чем на h/2.
Метод заключается в замене f(x) в промежутке X1+(-)h, где X1 -начальное приближение, квадратичной параболой, экстремум которой вычисляется аналитически. После приближенного нахождения экстремума Xm можно задать X1=Xm и повторить поиск. Таким образом, с помощью итерационной процедуры значение Xm уточняется до получения его с заданной погрешностью e.
Этот метод обеспечивает поиск как максимумов, так и минимумов f(x), в том числе для случая f(x)=0, причем точка Xm может лежать в интервале X1+(-)h (интерполяция) и быть вне его (экстраполяция).
Алгоритм
1. Задаем начальное приближение X1 для Xm и вычисляем два смежных значения аргумента F(x): x0=x1-h и x2=x1+h, где h - полуинтервал интерполяции - экстраполяции.
2. Вычисляем три значения F(x): F(x)=F0, F(x1)=F1, F(x2)=F2.
3. Находим коэффициенты параболы Y(Х)=X2+BX+C,
C=F0/2h2-F1/h2+F2/2h2=(F0-2F1+F2)/2h2,
B=(-F0(2x1+h)+4F1x1-F2(2x1-h)/2h2
проходящей через выбранные три узла интерполяции - экстраполяции
F(x), и по ним вычисляем аналитически положение экстремума
Xm=-B/2C=(F0(2x1+h)-4F1x1+F2(2x1-h)/2*(F0-2F1+F2).
4. Проверяем выполнение условия ABS(Xm-X1)<e. Если оно не выполняется, задаем X1=Xm и идем к п.1. Если выполняется, считаем Xm найденным с заданной погрешностью e, вычисляем F(Xm) и останавливаем счет.
Составить программу, найти минимальное значение функции и сравнить с результатами, полученными ранее. Сделать вывод.
Программа метода Квадратичной интерполяции-экстраполяции
{Вычисление значения функции}
FUNCTION F(x:real):real;
begin
F:=2*x*x-exp(x);
end;
{Основная программа}
PROCEDURE MET2;
Var
ni:integer;
x,h,e,v,u,w,z:real;
BEGIN
Write('Введите начальное значение x:'); readln(x);
Write('Задайте интервал интерполяции h:'); readln(h);
Write('Задайте погрешность вычислений e:'); readln(e);
goto xy(1,5);writeln(' Текущие значения: ');
ni:=0;
repeat
ni:=ni+1;
z:=x;
v:=f(x);
x:=z-h;
w:=f(x);
x:=z+h;
u:=f(x);
x:=(w*(2*z+h)-4*v*z+u*(2*z-h))/(w-2*v+u)/2;
goto xy(1,6);writeln(' Итерация №',ni);
writeln(' x=',x:12:10,' F(x)=',f(x):12:10);
until(abs(x-z)<e);
writeln(' ---------- Минимум найден: -----------');
writeln(' x=',x:12:18,' F=',f(x):12:8);
end;
Метод пауэлла
Суть метода: используют несколько значений функции в определенных точках для аппроксимации функции обычным полиномом в небольшой области значений, затем положение минимума аппроксимируется положением минимума полинома, поскольку последний вычислить проще.
Если известно значение функции F(x) в 3 различных точках x1, x2, x3, равных соответственно F(x1), F(x2), F(x3),то функция F(x) может быть аппроксимированна квадратичным трехчленом Ф(x)=ax2+bx+c. В теории доказывается, что Ф(x) будет иметь минимум в точке x=-b/2a, если a>0 и можно аппроксимировать точку минимума функции F(x) значением &.
1/2*(F(x1)-F(x2)*(x2-x3)*(x3-x1)
&=1/2*(x1+x2)+ ----------------------------------------------------- .
(x1-x3)*F(x1)+(x3-x1)*F(x2)+(x1-x2)*f(x3)
Можно доказать, что при x1=0, x2=t, x3=2t это уравнение примет вид
4*F(x2)-3*(F(x1)-F(x3))
&=------------------------------- *t
4*F(x2)-2*F(x1)-2*F(x3)
и что при этом достигается минимум, если F(x1)+F(x3)>2*F(x2).
Эти теоретические изложения используются в методе Пауэлла.
Предположим, что заданна унимодальная функция одной переменной F(x), начальная аппроксимация положения минимума и длина шага h.
Алгоритм вычисления:
1. Вычислить F(A) и F(A+h);
2. Если F(A)<F(A+h), то взять в качестве 3-ей точки A-h и вычислить F(A-h), иначе взять A+2h и найти F(A+2h);
3. Используя эти 3 точки, найти & и вычислить F(&);
4. Если разница между наименьшим и следующим наименьшим значением функции меньше заданной точности, то процедура заканчивается;
5. Если нет, то точка с наибольшим значением отбрасывается, и возвращаемся на шаг 3. Но если оставив точку с наибольшим значением функции, мы определим конечные границы интервала, в котором лежит минимум, то следует действительно оставить это значение и затем вернуться на шаг 3.
Задание: найти минимум функции z=2x2-exp(x), сравнить с результатами, полученными ранее. Сделать вывод.
Исходные данные: е=0.0001, А=1, h=0,5,
Программа метода ПАУЭЛЛА
FUNCTION sgn(x:real):real; {знаковая функция}
begin
if x>0 then sgn:=1 else if x<0 then sgn:=-1 else sgn:=0;
end;
FUNCTION z(x:real):real;_1 _0{ вычисление функции }
begin
z:=2*x*x-exp(x);
end;
PROCEDURE MET1;{ метод 1 }
Label m1,m2;
Var
sim :char;
x,f :array [1..4] of real;
s1,s2,s3,xx,ff,dn,nm,a,h,e:real;
j,k,i,ni :integer;
BEGIN
ni:=0; Write('Задайте начальное значение A:'); readln(a);
Write('Задайте шаг h:');readln(h);
Write('Задайте точность E:');readln(e);
x[1]:=a; f[1]:=z(x[1]);
{ начать процесс с первых трех точек }
x[2]:=a+h; f[2]:=z(x[2]);
if f[1]<f[2] then
begin
x[3]:=a-h; f[3]:=z(x[3]);
end
else begin
x[3]:=a+2*h; f[3]:=z(x[3]);
end;
goto xy(1,5);writeln(' Текущие значения: ');
dn:=(x[2]-x[3])*f[1];
{вычисление первого аппроксимируемого минимума}
dn:=dn+(x[3]-x[1])*f[2]+(x[1]-x[2])*f[3];
nm:=(x[2]*x[2]-x[3]*x[3])*f[1];
nm:=nm+(x[3]*x[3]-x[1]*x[1])*f[2];
nm:=nm+(x[1]*x[1]-x[2]*x[2])*f[3];
x[4]:=nm/(2*dn); f[4]:=z(x[4]);
m1: for j:=1 to 3 do
{упорядочить значения функции }
for k:=j+1 to 4 do
if f[j]>f[k] then begin
xx:=x[j]; x[j]:=x[k]; x[k]:=xx;
ff:=f[j]; f[j]:=f[k]; f[k]:=ff;
end;
goto xy(1,6);writeln(' Итерация №',ni); ni:=ni+1;
for i:=1 to 4 do
writeln(' x[',i,']=',x[i]:12:10,' F[',i,']=',f[i]:12:10);
{закончить если получена заданная точность}
if abs(x[1]-x[2])<e then goto m2;
s1:=sgn(x[2]-x[1]);{запомнить три лучших точки}
s2:=sgn(x[3]-x[1]);
s3:=sgn(x[4]-x[1]);
if ((s1=s2) and (s1=-s3)) then
begin
x[3]:=x[4]; f[3]:=f[4];
end;
{вторая интерполяция}
dn:=(x[2]-x[3])*f[1]+(x[3]-x[1])*f[2]+(x[1]-x[2])*f[3];
ff:=(f[1]-f[2])/(2*dn);
ff:=ff*(x[2]-x[3])*(x[3]-x[1]);
x[4]:=(x[1]+x[2])/2+ff; f[4]:=z(x[4]);
goto m1; {повторить вторую интерполяцию}
m2: writeln(' ---------- Минимум найден: -----------');
writeln(' x=',x[1]:12:18,' F=',f[1]:12:8);
END;