Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ спуск по антиградиенту

Автор: DeeMas 20.04.2007 1:34

Люди помогите решить задачу,
условие выглядит так - найти экстремум двух функций при спуске по антиградинту.
Заранее очень благодарен.

Автор: samec 20.04.2007 9:18

вот пара ссылок в тему: http://www.yandex.ru/yandsearch?text=%E3%F0%E0%E4%E8%E5%ED%F2%ED%FB%E5+%EC%E5%F2%EE%E4%FB и http://www.compmodel.ru/102/251/index.1.html

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


Автор: Lapp 20.04.2007 10:32

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

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

Как это "экстремум двух функций"? Может, экстремум функции двух переменных?
ПОжалуйста, выражайся точнее и полнее.
И вообще - что тебя интересует? Прога на паскале? Начни, покажи тут наработки, мы поможем.

Автор: samec 20.04.2007 17:18

ладно, попробую исправиться.
Вот программа на паскале, находит экстремум функции : 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®>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