ГОУ ВПО
УФИМСКИЙ ГОСУДАРСТВЕННЫЙ АВИАЦИОННЫЙ
ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Курс «Методы оптимизации»
Лабораторная работа №3
Выполнила:
студентка группы ВМ-324
Ямурзина Е.А.
Проверил: Хасанов А. Ю.
Уфа – 2007
Цель работы: знакомство с оптимизационными задачами, изучение различных методов многомерной оптимизации и сравнение эффективности их применения для конкретных целевых функций.
Задание: Минимизировать функцию
Начальное приближение [1;0], точность Е=4·10-4 .
Методы:
-
Метод Ньютона
-
Метод Ньютона-Рафсона с дроблением шага
-
Метод Ньютона-Рафсона с дроблением шага 1 модификация
-
Метод Ньютона-Рафсона с дроблением шага 2 модификация
Метод Ньютона
Схема базового алгоритма.
шаг 1: |
На первой итерации, при k = 0, вводятся начальное приближение x0 и условие останова ε3. Вычисляются градиент f '(x0) и матрица f ''(x0). |
шаг 2: |
Определяется направление спуска pk, как решение системы линейных уравнений f ''(xk)·pk = – f '(xk) (например, методом исключений Гаусса). |
шаг 3: |
Определяется следующая точка спуска: xk+1 = xk + pk. |
шаг 4: |
Вычисляются в этой точке xk+1 градиент f '(xk+1) и матрица f ''(xk+1). |
~ ~ |
Если ||f '(xk+1)|| ε3, то поиск на этом заканчивается и полагается x = xk+1 и y = f(xk+1). Иначе k = k + 1 и переход к шагу 2. |
Блок-схема алгоритма поиска методом Ньютона
Листинг программы
procedure TForm1.Button1Click(Sender: TObject);
const A=25;
B=0.9;
C=0.35;
D=0.35;
function F(x1,x2:double):double;
begin
F:=a*x1+b*x2 + exp(c*x1*x1+d*x2*x2);
end;
function F1(x1,x2:double):double;
begin
F1:=a + exp(c*x1*x1+d*x2*x2)*2*C*x1;
end;
function F2(x1,x2:double):double;
begin
F2:=B + exp(c*x1*x1+d*x2*x2)*2*D*x2;
end;
function FF11(x1,x2:double):double;
begin
FF11:=exp(c*x1*x1+d*x2*x2)*2*C*x1*2*C*x1+exp(c*x1*x1+d*x2*x2)*2*C;
end;
function FF12(x1,x2:double):double;
begin
FF12:=exp(c*x1*x1+d*x2*x2)*2*C*x1*2*D*x2;
end;
function FF22(x1,x2:double):double;
begin
FF22:=exp(c*x1*x1+d*x2*x2)*2*D*x2*2*D*x2+exp(c*x1*x1+d*x2*x2)*2*D;
end;
var k,N1,N2,N:integer;
x:array [1..2, 0..300] of double;
matr:array[1..2,1..2] of double;
matr1:array[1..2] of double;
P1,P2,dd,E2,det,x1,x2,y:double;
begin
x[1,0]:=1; x[2,0]:=0; E2:=0.0004;
matr1[1]:=F1(x[1,0],x[2,0]);
matr1[2]:=F2(x[1,0],x[2,0]);
k:=0; N1:=2; N2:=0;
repeat
matr[1,1]:=FF11(x[1,k],x[2,k]);
matr[1,2]:=FF12(x[1,k],x[2,k]);
matr[2,1]:=matr[1,2];
matr[2,2]:=FF22(x[1,k],x[2,k]);
N2:=N2+3;
det:=matr[1,1]*matr[2,2]+matr[2,1]*matr[1,2];
P1:=(matr[1,2]*matr1[2]+matr[2,2]*matr1[1])/det;
P2:=(matr[1,1]*matr1[2]+matr[2,1]*matr1[1])/det;
x[1,k+1]:=x[1,k]-P1;
x[2,k+1]:=x[2,k]-P2;
matr1[1]:=F1(x[1,k+1],x[2,k+1]);
matr1[2]:=F2(x[1,k+1],x[2,k+1]);
N1:=N1+2;
dd:=SQRT(SQR(matr1[1])+SQR(matr1[2]));
k:=k+1;
until dd<=E2;
x1:=x[1,k];
x2:=x[2,k];
y:=F(x1,x2);
N:=N1+N2;
Label11.Caption:='x1='+FloatToSTr(x1)+' x2='+FloatToSTr(x2)
+' y='+FloatToSTr(y);
Label8.Caption:='N=N1+N2='+IntToSTR(N1)+'+'+IntToSTR(N2)+'='+IntToSTR(N)+
' k='+IntToSTR(k);
end;
X1 |
X2 |
k |
1.000000 |
0.000000 |
0 |
-14.392607 |
-0.906028 |
1 |
-13.995797 |
-0.881048 |
5 |
-12.951928 |
-0.815335 |
15 |
-11.936727 |
-0.751428 |
24 |
-10.958122 |
-0.689824 |
32 |
-9.886760 |
-0.622380 |
40 |
-8.848413 |
-0.557016 |
47 |
-7.856122 |
-0.494550 |
53 |
-6.929224 |
-0.436201 |
58 |
-5.871352 |
-0.369604 |
63 |
-4.883534 |
-0.307283 |
67 |
-3.703357 |
-0.227891 |
71 |
-2.846062 |
-0.131463 |
74 |
-2.712132 |
-0.097637 |
77 |