Помощь - Поиск - Пользователи - Календарь
Полная версия: спуск по антиградиенту
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
DeeMas
Люди помогите решить задачу,
условие выглядит так - найти экстремум двух функций при спуске по антиградинту.
Заранее очень благодарен.
samec
вот пара ссылок в тему: Яндекс - найдётся всё smile.gif и Градиентные методы

М
samec, не лучше ли промолчать, если нечего сказать?..
Обучать пользованью поисковиками будешь на другом форуме! И если тема в разделе Паскаль - Задачи, то нужно ли давать ссылки на общую теорию? mad.gif
Lapp

Lapp
Цитата(DeeMas @ 19.04.2007 22:34) *

найти экстремум двух функций при спуске по антиградинту.

Как это "экстремум двух функций"? Может, экстремум функции двух переменных?
ПОжалуйста, выражайся точнее и полнее.
И вообще - что тебя интересует? Прога на паскале? Начни, покажи тут наработки, мы поможем.
samec
ладно, попробую исправиться.
Вот программа на паскале, находит экстремум функции : F(z1,z2)=exp(z1*z1+z2*z2)+2*z1-3,5*z2

program gradien;
uses crt;
type vec=array[1..8] of real;
var
 i,k,n:integer;
 e,a,r,f0:real;
 z:vec;

function F(var z:vec):real;  {функция}
begin
 r:=exp(sqr(z[1])+sqr(z[2]));
 F:=r+2*z[1]-3.5*z[2];
end;

procedure G(var z,p:vec); {градиент}
begin
 r:=2*r;
 p[1]:=z[1]*r+2;
 p[2]:=z[1]*r-3.5;
end;
     {спуск}
procedure GRAD(e,a:real;var n,k:integer; var f0:real;var z:vec);
var
 b:boolean;
 l:integer;
 r,f1:real;
 p,y:vec;
begin
 k:=1;
 f0:=F(z);
 b:=true;
 repeat
  l:=1;
  if b then
   begin
    f1:=f0;
    G(z,p);
    for i:=1 to n do
     y[i]:=z[i];
   end
  else a:=a/2;
  for i:=1 to n do
   begin
    r:=a*p[i];
    z[i]:=y[i]-r;
    if abs(r)>e then l:=0;
   end;
  k:=k+1;
  f0:=f(z);
  b:=f0<f1;
 until l=1;
end;

begin
 clrscr;
 write('n,e,a? ');
 readln(n,e,a);
 for i:=1 to n do
  begin
   write('z(',i,')? ');
   readln(z[i]);
  end;
 GRAD(e,a,n,k,f0,z);
 for i:=1 to n do
  writeln('z(',i,')=',z[i]:1:10);
 writeln('F=',F0:1:10,'   IT=',k);
 readkey;
end.



n - кол-во переменных в функции (в нашем случае две)
e- погрешность
a - начальный шаг спуска
z1,z2 - начальная точка

и результаты работы проги:
n,e,a? 2
0.0001
0.2
z(1)? 0
z(2)? 0
z(1)=-0.4116900475
z(2)=0.8258770912
F=-1.3706464633 IT=18
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.