2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Метод сопряженных градиентов
Сообщение10.04.2010, 13:18 


19/05/09
38
Доброго времени суток, не могу разобраться в алгоритмом сопряженных градиентов. Не могу понять что делаю не так...
Для решения системы
$
\left\{ \begin{array}{l}
3x_0-x_1 = 3\\
-x_0+3x_1 = 7
\end{array} \right.
$
При первом шаге получаю что приближенное значение $x=(1,318, 3,076)$... а потом значение начинает убывать....
Вот код на С++:
Код:
#include <conio.h>
#include <stdio.h>
#include <tchar.h>
#include <math.h>
#define n 2

void gaxpy (float A[n][n],float x[n], float b[n])
{
   for (int i=0; i<n; i++)
      for (int j=0; j<n; j++)
      {
         b[i]+=A[i][j]*x[j];
      }
}

float dot (float x[n], float y[n])
{
   float s;
   for (int i=0; i<n; i++)
      s+=x[i]*y[i];
   return s;
}

void saxpy (float alf,float x[n],float y[n],float z[n])
{
   for (int i=0; i<n; i++)
      z[i]=x[i]+alf*y[i];
}

void print_vec (float b[n])
{
   for (int i=0; i<n; i++)
   {
      printf(" %3.1f",b[i]);
   }
}

void main(void)
{
  float A[n][n];
  float b[n], x[n], r[n], p[n], v[n];
  b[0]=3; b[1]=7;
  A[0][0]=3; A[0][1]=-1; A[1][0]=-1; A[1][1]=3;
  for (int i=0; i<n; i++) x[i]=0;
  float alfa,alfa_,la,al;
  float eps=0.001;
  for (int i=0; i<n; i++) p[i]=x[i];
  goxpy(A,p,v);
  saxpy(-1,b,v,p);
  for (int i=0; i<n; i++) r[i]=p[i];
  alfa=dot(r,r);
  int k;
  k=0;
  while (k<=1000)
  {
     gaxpy(A,p,v);
     la=alfa/dot(p,v);
     saxpy(la,x,p,x);
     saxpy(-la,r,v,r);
     alfa_=dot(r,r);
     al=alfa_/alfa;
     if (dot(r,r)<eps) break;
     saxpy(al,r,p,p);
     alfa=alfa_;
     k++;
  }
  print_vec(x);
  getch();
}

Помогите разобраться...

 Профиль  
                  
 
 Re: Метод сопряженных градиентов
Сообщение11.04.2010, 20:51 


19/05/09
38
Ну или хотя бы подскажите достойную литературу с алгоритмом, уже готовым для программирования... без теоретических выкладок. Буду очень благодарен.

 Профиль  
                  
 
 Re: Метод сопряженных градиентов
Сообщение12.04.2010, 16:22 


12/04/10
1
Ищи книжку Yousef Saad "Iterative methods for sparse linear systems" - имхо лучшая книга по решению СЛАУ. Алгоритмы есть на все общеупотребительный методы.

 Профиль  
                  
 
 Re: Метод сопряженных градиентов
Сообщение12.04.2010, 16:44 
Заслуженный участник


19/07/08
1266
http://www.nr.com/
Думаю, в интернетах можно найти в украденном виде. Я находил =) .
Там про сопряжённые градиенты чуть ли не глава целая была.
UPD А, я не украденную находил. Есть старая версия. Которой с точки зрения описания алгоритмов более чем достаточно.

 Профиль  
                  
 
 Re: Метод сопряженных градиентов
Сообщение13.04.2010, 20:05 


19/05/09
38
petywilo в сообщении #308774 писал(а):
Ищи книжку Yousef Saad "Iterative methods for sparse linear systems" - имхо лучшая книга по решению СЛАУ. Алгоритмы есть на все общеупотребительный методы.

Огромное спасибо, действительно хорошая книга...
Нашел ошибку :oops:
Используется синтаксис C
 float dot (float x[n], float y[n])
{
   float s;
   s=0; //<-----!!!!!!!!!!!!!!!!
   for (int i=0; i<n; i++)
      s+=x[i]*y[i];
   return s;
}
 

Сумму то надо занулять :) А вроде третий курс :D

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group