Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
27
Добавлен:
02.05.2014
Размер:
192 Кб
Скачать

Метод Ньютона-Рафсона с дроблением шага

Схема метода Ньютона – Рафсона с дроблением шага.

шаг 1:

На первой итерации, при k = 0, вводятся исходные данные x0, , ε3. Вычисляются значения градиента f '(x0) и матрица f ''(x0).

шаг 2:

Присваивается = 1. Определяется направление спуска pk, как решение системы линейных уравнений f ''(xk)·pk = – f '(xk).

шаг 3:

Проверяется условие

f(xk + kpk ) – f(xk) ·k(f '(xk), pk).

Если выполняется, то переход к шагу 4.

Иначе дробим значение шага (например, = /2) и повторяем шаг 3.

шаг 4:

Определяется следующая точка:

xk+1 = xk + ·pk.

~

~

шаг 5:

Вычисляются значение градиента f '(xk+1) в точке xk+1.

шаг 6:

Если ||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;

label metka;

var k,N0,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,L,delta,fP:double;

begin

x[1,0]:=1; x[2,0]:=0; E2:=0.0004;

delta:=0.05;

matr1[1]:=F1(x[1,0],x[2,0]);

matr1[2]:=F2(x[1,0],x[2,0]);

k:=0; L:=1; N0:=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;

y:=F(x[1,k],x[2,k]);

N0:=N0+1;

fP:=matr1[1]*P1+matr1[2]*P2;

metka:

if (F(x[1,k]-L*P1, x[2,k]-L*P2)-y)>(-delta*L*fP) then

begin

L:=L/2;

N0:=N0+1;

goto metka;

end;

x[1,k+1]:=x[1,k]-L*P1;

x[2,k+1]:=x[2,k]-L*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(matr1[1]*matr1[1]+matr1[2]*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;