Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2012, 15:04   #1
Mikle_kr
 
Регистрация: 03.01.2009
Сообщений: 5
По умолчанию градиентный метод на паскале

Помогите, пожалуйста, разобраться с этой задачей: запрограммировать метод проекции градиента. Вроде все есть, но не работает(

Код:
uses crt;
const n=3; h=0.0005; eps=0.001; R=sqrt(4);
type vector=array [1..n] of real;
var x,gr,a,xo,p,q,x1,t:vector;
    i,j:integer;
    alpha,d:real;

function f(x:vector):real;
         begin
         f:=x[1]+2*x[2]+5*x[3]+10; 
         end;

function nor(x:vector):real;
var S:real;
         begin
         S:=0;
         for i:=1 to n do S:=x[i]*x[i]+S;
         nor:=sqrt(S);
         end;

PROCEDURE pr(x:vector; var Gr:vector);
var u,v:vector;
          begin
          for i:=1 to n do
              begin
              u:=x;
              v:=x;
              u[i]:=x[i]+h;
              v[i]:=x[i]-h;
              Gr[i]:=(f(u)-f(v))/(2*h);
              end;
          end;

PROCEDURE proection(x:vector; var x1:vector);
          begin
               for i:=1 to n do q[i]:=x[i]-a[i];
               if nor(q)>R then
                  for j:=1 to n do
                      x1[j]:=a[j]+q[j]*R/nor(q)
                  else x1:=x;
               for i:=1 to n do writeln('x1=',x1[i]:4:2);
          end;

BEGIN
     clrscr;
     writeln('vvod center shara'); for i:=1 to n do readln(a[i]);
     writeln('vvod pervona4 pribl'); for i:=1 to n do readln(xo[i]);

     pr(xo,Gr);
     write('na4aln grad='); for i:=1 to n do write(gr[i],' ');
     x1:=xo;

    repeat
               alpha:=2;
               writeln('norma=', nor(gr):5:4);
               repeat
                     alpha:=alpha/2;
                     for i:=1 to n do
                         begin
                         x[i]:=xo[i]-alpha*gr[i];
                         writeln('x[',i,']= ',x[i]:5:4);
                         end;
                 until (f(x)<f(xo)); proection(x,x1); pr(x1,gr);
                 xo:=x;
                  for i:=1 to n do
                      t[i]:=x1[i]-xo[i];
            until (nor(gr)<eps) or (nor(t)<eps);
     writeln('gradientniy metod');
     write('x*=('); for i:=1 to n do write(xo[i]:4:3,' '); write(')');
     writeln; writeln('f*= ',f(xo));
     
END.
проекцию и градиент точно считает правильно
Mikle_kr вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Градиентный метод Defunate C# (си шарп) 1 15.01.2012 02:19
метод перебора на паскале. torlof Помощь студентам 3 21.05.2011 22:43
Градиентный спуск Ciberal Помощь студентам 0 26.12.2010 19:23
Градиентный спуск nieaCry Общие вопросы C/C++ 0 04.12.2008 00:26