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

проблема с "nrutil.h" - C++

Восстановить пароль Регистрация
 
Fantom.AS
 Аватар для Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
24.12.2011, 14:32     проблема с "nrutil.h" #1
пишу программу, для работы с методом Якоби, но при компиляции вылезает много ошибок. нет файла "nrutil.h".
скачал его в интернете, даже в нескольких вариантов. ошибок стало еще больше.
Вот код метода, а так же я прикрепил сам проект.

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
79
80
81
82
83
84
85
#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(double **a, int n, double *d, double **v, int *nrot) {
  int j, iq, ip, i;
  double tresh, theta, tau, t, sm, s, h, g, c, *b, *z;
  /* выделить память для временно используемых векторов (декларации в nrutil.h) */
      b = new double[n+n];
     z = b + n;
  //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 && (double)fabs(d[ip]+g)==(double)fabs(d[ip])
             && (double)fabs(d[iq]+g)==(double)fabs(d[iq])) a[ip][iq]=0.;
      /* и случай малого элемента на первых 3 проходах
         (обработать только превысившие порог) */
      else if(fabs(a[ip][iq])>tresh) {
        h=d[ip]-d[iq];
       /* вычислить значение t=s/c по формуле корня квадратного уравнения */
        if((double)(fabs(h)+g)==(double)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");
}
Вложения
Тип файла: rar matr.rar (2.30 Мб, 52 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.12.2011, 14:32     проблема с "nrutil.h"
Посмотрите здесь:

C++ по строкам.замените в слове сочетание "му" на "а" , а букву "ы" на "ца". очень нужно
C++ Создать класс комплексных чисел и ввести операции: "+", "-", "*", "/".
Чтения структуры из файла (описать структуру с именем "ORDER": "счет плательщика"; "счет получателя"; "сумма, переводится банковской операцией") C++
C++ С++ консольное приложение win32, матерится на первое "pow" после "if", а на "system" говорит что неопределён.
C++ В массиве структур студент с полями "ИМЯ" "ВОЗРАСТ" "УСПЕВАЕМОСТЬ" выполнить сортировку по успеваемости по возрастанию
C++ Проблема с перегрузкой операторов "+" и "+=" для классов Point и Circle
C++ Вставить пробел после каждого символа "." "," "!" или "?", если за этими символами не следует пробел
Структура «Преподаватель» с полями "ФИО", "стаж", "категория", "нагрузка" C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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