метод самого быстрого градиентного спуска метод самого быстрого градиентного спуска построен на поиске следующего приближения за направлением градиенту квадратичной формы:
,
так что:
,
при чем определяется из условия минимизации квадратичной формы на каждой итерации:
.
Алгоритм метода самого быстрого градиентного спуска:
k:=0; ;
цикл
; ; k:=k+1;
пока или к > kmax
Метод спрягающих градиентов
За этим методом следующее приближение находится на так называемых
А – ортогональных направлениях:
; ,
при чем эти направления избираются в плоскостях перпендикулярных поверхностям уровня квадратичной формы:
.
Коэффициент вычисляется из условия А – ортогональной:
,
а – минимуму квадратичной формы:
.
Алгоритм метода спрягающих градиентов:
; ; ; ;
цикл
; ; ; ;
;
пока или n > nmax
Блок-схема программы:
Текст программы:
Текст основной программы:
program SLAU;
uses crt, Un_Vvod, U_Gauss, U_Zeidel, U_Iter, U_Koren, U_Prog ;
var i,j,n,kol,status:integer;
eps,s:real; A:matrix; B,x:vector;
fr:text; key:char; fnr:string[15];
procedure Menu;
begin
clrscr;
writeln('Menu:'); writeln('1. Gauss');
writeln('2. Iteraction'); writeln('3. Zeidel');
writeln('4. Kvadr koren'); writeln('5. Progonka');
writeln('6. Exit programm'); writeln; write('Enter your chois: ');
key:=readkey;
end;
procedure FillOut;
begin
writeln;
writeln('Input output filename: ');
readln(fnr);
assign(fr,fnr);
rewrite(fr);
writeln(fr,'Matrix A');
for i:=1 to n do
begin
for j:=1 to n do write(fr,a[i,j]:7:1);
writeln(fr);
end;
writeln(fr,'Your chois nm=',key);
for i:=1 to n do writeln(fr,' result x[',i,']=',
x[i]:10:5);
close(fr);
writeln('Results in file: ',fnr);
readln;
end;
begin
clrscr;
Vvod(n,eps,A,B);
repeat
status:=0;
Menu;
case key of
'1':Gauss (A,B,n,eps,x,status);
'2':Iter(A,B,n,eps,x,status);
'3':Zeidel (A,B,n,eps,x,status);
'4':Koren(A,B,n,eps,x,status);
'5':Run_Prog(A,B,n,eps,x,status);
end;
for i:=1 to n do
begin
s:=0;
for j:=1 to n do s:=s+a[i,j]*x[j];
e[i]:=s-b[i]
end;
writeln;
for i:=1 to n do
writeln('Невязки: E[',i,']= ',E[i]:10:5);
if(status=1) then FillOut;
until(key='6');
end.
Текстмодуля (U_gauss):
unit u_Gauss;
interface
uses UN_VVOD;
procedure Gauss(A:matrix; B:vector; n:integer; eps:real;
var x:vector; var stat:integer);
implementation
procedure gauss;
var i,j,k,l:integer;
r,SUM,max:real;
begin
for k:=1 to n do
begin
max:=abs(a[k,k]);
l:=k;
for i:=1+k to n do
if abs(a[i,k])>max then
begin
max:=abs(a[i,k]);
l:=i;
end;
if max<eps then begin writeln('Матрица системы вырождена '); halt end;
if l<>k then
begin
for j:=k to n do
begin
R:=a[k,j]; a[k,j]:=a[l,j]; a[l,j]:=R
end;
r:=b[k]; b[k]:=b[l]; b[l]:=R
end;
for j:=k+1 to n do
a[k,j]:=a[k,j]/a[k,k];
b[k]:=b[k]/a[k,k];
a[k,k]:=1;
for i:=k+1 to n do
begin
for j:=k+1 to n do
a[i,j]:=a[i,j]-a[k,j]*a[i,k];
b[i]:=b[i]-b[k]*a[i,k];
a[i,k]:=0;
end;
end;
{Обратный ход}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.