Форум программистов, компьютерный форум CyberForum.ru

помогите разобраться с библиотекой и в чем ошибка? - C++

Восстановить пароль Регистрация
 
uzik
 Аватар для uzik
0 / 0 / 0
Регистрация: 10.06.2010
Сообщений: 7
06.10.2011, 23:18     помогите разобраться с библиотекой и в чем ошибка? #1
Это метод Якоби

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include "stdafx.h"
#include <math.h> 
#include "nrutil.h"    /* Здесь определяются некоторые утилиты типа выделения памяти */ 
/* Преобразование элементов при ротации */ 
#define ROTATE(a,i,j,k,l) g=a[i][j];h=a[k][l];a[i][j]=g-s*(h+g*tau);a[k][l]=h+s*(g-h*tau) 
/* максимальное число проходов */ 
#define MAXSWEEP 50 
/* Программа jacobi вычисляет все собственные значения и собственные векторы 
   действительной симметричной матрицы a[1...n][1...n]. На выходе разрушаются 
   все наддиагональные элементы a. d[1...n] возвращает собственные значения 
   матрицы, v[1...n][1...n] -- в столбцах нормализованные собственные векторы, 
   nrot -- число ротаций Якоби, потребовавшихся для данной программы. 
*/ 
void jacobi(float **a, int n, float *d, float **v, int *nrot) { 
  int j, iq, ip, i; 
  float tresh, theta, tau, t, sm, s, h, g, c, *b, *z; 
  /* выделить память для временно используемых векторов (декларации в nrutil.h) */ 
  b=vector(1,n); z=vector(1,n); 
  /* инициализировать v как единичную матрицу */ 
  for(ip=1;ip<=n;ip++) { 
    for(iq=1;iq<=n;iq++) v[ip][iq]=0.; 
    v[ip][ip]=1.; 
  } 
  /* инициализировать b диагональю a, z -- нулем */ 
  for(ip=1;ip<=n;ip++) {b[ip]=a[ip][ip]; z[ip]=0.;} 
  /* вначале число ротаций нулевое */ 
  *nrot=0; 
  /* делаем не более MAXSWEEP проходов */ 
  for(i=1;i<=MAXSWEEP;i++) { 
    /* вычисляем сумму модулей внедиагональных элементов */ 
    for(sm=0.,ip=1;ip<=n;ip++) for(iq=ip+1;iq<=n;iq++) sm += fabs(a[ip][iq]); 
    /* диагональная матрица -> нормальный выход */ 
    if(sm==0.) { 
      free_vector(z,1,n); free_vector(b,1,n); return; 
    } 
    /* пороговое значение элемента для ротации */ 
    tresh=(i<4 ? 0.2*sm/(n*n) : 0.); 
    /* проход осуществляется по строкам, в каждой строке по столбцам */ 
    for(ip=1;ip<=n-1;ip++) for(iq=ip+1;iq<=n;iq++) { 
      /* отследить случай малого элемента после 4 проходов */ 
      g=100.*fabs(a[ip][iq]); 
      if(i>4 && (float)fabs(d[ip]+g)==(float)fabs(d[ip]) 
             && (float)fabs(d[iq]+g)==(float)fabs(d[iq])) a[ip][iq]=0.; 
      /* и случай малого элемента на первых 3 проходах 
         (обработать только превысившие порог) */ 
      else if(fabs(a[ip][iq])>tresh) { 
        h=d[ip]-d[iq]; 
       /* вычислить значение t=s/c по формуле корня квадратного уравнения */ 
        if((float)(fabs(h)+g)==(float)fabs(h)) t=a[ip][iq]/h; 
        else { 
          theta=0.5*h/a[ip][iq]; 
          t=1./(fabs(theta)+sqrt(1.+theta*theta)); 
          if(theta<0.) t = -t; 
        } 
       /* вычислить c, s, tau, и др. Изменить диагональ. Обнулить (ip,iq)-элемент */ 
        c=1./sqrt(1+t*t); s=t*c; tau=s/(1.+c); h=t*a[ip][iq]; 
        z[ip] -= h; z[iq] += h; d[ip] -= h; d[iq] += h; 
        a[ip][iq]=0.; 
        /* поворот при 1<=j<ip */ 
        for(j=1;j<=ip-1;j++) {ROTATE(a,j,ip,j,iq);} 
       /* поворот при ip<j<iq */ 
        for(j=ip+1;j<=iq-1;j++) {ROTATE(a,ip,j,iq,j);} 
        /* поворот при iq<j<=n */ 
        for(j=iq+1;j<=n;j++) {ROTATE(a,ip,j,j,iq);} 
       /* добавка для матрицы собственных векторов */ 
        for(j=1;j<=n;j++) {ROTATE(v,j,ip,j,iq);} 
        /* приращение счетчика ротаций */ 
        ++(*nrot); 
      } 
    } 
    /* добавить до диагонали и реинициализировать z */ 
    for(ip=1;ip<=n;ip++) { 
      b[ip] += z[ip]; d[ip]=b[ip]; z[ip]=0.; 
    } 
  } 
  /* если мы здесь, то число ротаций превысило лимит. Функция nerror (выход с  диагностикой ошибки) описана декларацией в nrutil.h. */ 
  nerror("Too many iterations in the routine jacobi"); 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.10.2011, 23:18     помогите разобраться с библиотекой и в чем ошибка?
Посмотрите здесь:

C++ Помогите разобраться с кодом и чем компилировать
немогу никак понять в чем ошибка=(помогите плиз! C++
Помогите разобраться в чем ошибка. C++
Написал програмку ,но она не всё показывает,в чем ошибка помогите C++
В чем ошибка помогите пожалуйста. C++
C++ помгите разобраться в чем ошибка? (найти все натуральные числа в диапазоне между m и n (m<n))
Написал класс "Телефонная книга". Но при работе вылетает ошибка. помогите разобраться. C++
C++ Не могу разобраться в чем ошибка

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
07.10.2011, 09:28     помогите разобраться с библиотекой и в чем ошибка? #2
В чём проблемма то?Если не компилируется, тогда дело в этом
Цитата Сообщение от uzik Посмотреть сообщение
#include "nrutil.h"
- это не стандартный хедер и если этого файла у вас нет, то к сожалению приведенный код лишь бесполезный набор символов
Yandex
Объявления
07.10.2011, 09:28     помогите разобраться с библиотекой и в чем ошибка?
Ответ Создать тему
Опции темы

Текущее время: 17:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru