Matlab  |  Mathcad  |  Maple  |  Mathematica  |  Statistica  |  Другие пакеты Поиск по сайту
Internet-класс  |  Примеры  |  Методики  |  Банк задач  |  Консультации & Форум  |  Download  |  Ссылки  |  Конкурсы
Научно-практический журнал "Exponenta Pro. Математика в приложениях". Вышел 1/2004 номер журнала
Карта сайта | На первую страницу | Поиск |О проекте |Сотрудничество |
Exponenta Pro | Matlab.ru

Наши баннеры


Copyright © 2000-2003. Компания SoftLine. Все права защищены.

Дата последнего обновления информации на сайте: 11.05.04
Сайт начал работу 1.09.00

Программное обеспечение Microsoft, Macromedia, VERITAS, Novell, Borland, Symantec, Oracle и др.

 

 
Численные методы оптимизации
выполнили: Ефанова Юлия, Калякина Юлия,
Пензенский государственный университет, кафедра "Вычислительная техника"
2004

archive.gif (75 bytes) Архив разработки (10 Кб, Maple)

Содержание

  1. Исходные функции
  2. Нахождение локального минимума методом половинного деления
  3. Нахождение локальных максимумов и глобального максимума методом половинного деления
  4. Нахождение минимума функции двух переменных методом наискорейшего спуска
  5. Нахождение максимумов и минимумов функции одной переменной средствами Maple 7
  6. Нахождение минимума функции двух переменных средствами Maple 7
  7. Вывод

1. Исходные функции

 

а) Функция одной переменной:

> restart;

> f1:= 12*surd(6*(x-1)^2, 3)/((x+1)^2+8);

"График исходной функции одной переменной:";

plot(f1(x),x=-5..5);

б) Функция двух переменных:

> f:= 1.2*x1^2 + 1.8 * x2^2 - 4 * x1 - 4 * x2;

"График исходной функции двух переменных:";

plot3d( 1.2*x1^2 + 1.8 * x2^2 - 4 * x1 - 4 * x2,x1=-7..7,x2=-7..7);

 

2. Нахождение локального минимума методом половинного деления

 

> restart;

Исходные функции

f:=12*surd(6*(x-1)^2, 3)/((x+1)^2+8):

f1:=12*surd(6*(cl[i]-1)^2, 3)/((cl[i]+1)^2+8):

f2:= 12*surd(6*(cr[i]-1)^2, 3)/((cr[i]+1)^2+8):

Oтрезкu локализации

a1:=-1: b1:=2:

Точность шагов

prec:=0.001:

Задание левой и правой начальной точки, а также области

i:=1:

l[i]:=a1:

r[i]:=b1:

Area[i]:=r[i]-l[i]:

while Area[i]>2.4*prec do

cl[i]:=(l[i] + r[i])/2 - prec:

cr[i]:=(l[i] + r[i])/2 + prec:

Oпределение новых точек

l[i+1]:=`if`(f1 > f2,cl[i],l[i]):

Oпределяем новую область

r[i+1]:=`if`(f1 <= f2,cr[i],r[i]):

Oпределяем новую область

Area[i+1]:=r[i+1]-l[i+1]:

Oпределяем х как возможное решение

x:=(r[i+1]+l[i+1])/2:

rezx1:=x:

rezy1:=f:

i:=i+1;

end do:

"Первый локальный минимум, он же глобальный, поскольку единственный:";

"Абсцисса:";

rezx1;

"Ордината:";

rezy1;

 

3. Нахождение локальных максимумов и глобального максимума методом половинного деления

 

> restart;

Исходные функции

f:=12*surd(6*(x-1)^2, 3)/((x+1)^2+8):

f1:=12*surd(6*(cl[i]-1)^2, 3)/((cl[i]+1)^2+8):

f2:= 12*surd(6*(cr[i]-1)^2, 3)/((cr[i]+1)^2+8):

Oтрезкu локализации

a1:=-3: b1:=0:

a2:=1: b2:=4:

Точность шагов

prec:=0.001:

i:=1:

l[i]:=a1:

r[i]:=b1:

Area[i]:=r[i]-l[i]:

while Area[i]>2.4*prec do

cl[i]:=(l[i] + r[i])/2 - prec:

cr[i]:=(l[i] + r[i])/2 + prec:

l[i+1]:=`if`(f1 < f2,cl[i],l[i]):

r[i+1]:=`if`(f1 >= f2,cr[i],r[i]):

Area[i+1]:=r[i+1]-l[i+1]:

x:=(r[i+1]+l[i+1])/2:

rezx1:=x:

rezy1:=f:

i:=i+1;

end do:

"Первый локальный максимум:";

"Абсцисса:";

rezx1;

"Ордината:";

rezy1;

i:=1:

l[i]:=a2:

r[i]:=b2:

Area[i]:=r[i]-l[i]:

Вычисление второго максимума

while Area[i]>2.4*prec do

cl[i]:=(l[i] + r[i])/2 - prec:

cr[i]:=(l[i] + r[i])/2 + prec:

l[i+1]:=`if`(f1 < f2,cl[i],l[i]):

r[i+1]:=`if`(f1 >= f2,cr[i],r[i]):

Area[i+1]:=r[i+1]-l[i+1]:

x:=(r[i+1]+l[i+1])/2:

rezx2:=x:

rezy2:=f:

i:=i+1;

end do:

"Второй локальный максимум";

"Абсцисса:";

rezx2;

"Ордината:";

rezy2;

"Глобальный максимум";

"Абсцисса:";

xgl:=`if`(rezy1>rezy2,rezx1,rezx2):xgl;

"Ордината:";

ygl:=`if`(rezy1>rezy2,rezy1,rezy2):ygl;

 

4. Нахождение минимума функции двух переменных методом наискорейшего спуска

 

> restart;

f:= 1.2*x1^2 + 1.8 * x2^2 - 4 * x1 - 4 * x2:

Определяем производные по двум переменным

df1:=diff(f,x1);

df2:=diff(f,x2);

x1prec:=solve(df1,x1):

x2prec:=solve(df2,x2):

Начальное приближение

X1[1]:=-1:

X2[1]:=-1:

prec:=0.01:

i:=1:

x1rez:=0:

x2rez:=0:

while x1rez=0 do

x1:=X1[i]:

x2:=X2[i]:

x1rez:=`if`(df1<prec,(`if`(df1>-prec,X1[i],0)),0):

x2rez:=`if`(df2<prec,(`if`(df2>-prec,X2[i],0)),0):

X1[i+1]:=`if`(df1>0,X1[i]-prec,X1[i]+prec):

X2[i+1]:=`if`(df2>0,X2[i]-prec,X2[i]+prec):

i:=i+1:

end do:

"Точные значения:";

x1:=x1prec;

x2:=x2prec;

"Точка минимума:";

x1:=x1rez;

x2:=x2rez;

"Значение функции в минимуме:";

f;

 

5. Нахождение максимумов и минимумов функции одной переменной средствами Maple 7

 

> restart;

f1:= 12*surd(6*(x-1)^2, 3)/((x+1)^2+8):

"Минимум функции одной переменной:";

minimize(f1,x=-5..5,location);

"Первый максимум";

maximize(f1,x=-2.0..0,location);

"Второй максимум";

maximize(f1,x=1..5,location);

 

6. Нахождение минимума функции двух переменных средствами Maple 7

 

> restart;

f:= 1.2*x1^2 + 1.8 * x2^2 - 4 * x1 - 4 * x2:

"Минимум функции 2-х переменных:";

minimize(1.2*x1^2 + 1.8 * x2^2 - 4 * x1 - 4 * x2,location);

 

7. Вывод

 

 

Значения, найденные средствами Maple 7

Найденные методом половинного деления

Разница в результатах

Вычислений

min

(1 , 0)

(1.000093628 , 0.003746629028)

0.000093628 , 0.003746629028

1 max

(-2.0 , 5.039684200)

(-2.000093628 , 5.039684194)

0.000093628 , 0.000000006

2 max

(3.000093628 , 1.442249569)

0.000093628 , 0.000000001


Знaчения, найденные методом наискорейшего спуска

Значения, найденные средствами Maple 7

у= -5,55554

 

x1, x2 и y различаются на 0.003333333, 0.001111111 и 0.000015555, соответственно.

Проверка методами Maple 7 (аналитическими методами) выявила ошибки численных методов от тысячных до миллионных долей. Это свдетельствует о достаточной точности реализации методов половинного деления и наискорейшего спуска.

Наверх