С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Fantom.AS
2 / 1 / 0
Регистрация: 17.11.2010
Сообщений: 121
#1

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

24.12.2011, 14:32. Просмотров 937. Ответов 0
Метки нет (Все метки)

пишу программу, для работы с методом Якоби, но при компиляции вылезает много ошибок. нет файла "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");
}
0
Вложения
Тип файла: rar matr.rar (2.30 Мб, 52 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.12.2011, 14:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос проблема с "nrutil.h" (C++):

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;, &quot;жарко&quot;, &quot;холодно&quot;, &quot;очень холодно&quot;. Я так...

Проблема с перегрузкой операторов "+" и "+=" для классов Point и Circle - C++
Есть класс Point (элементы данных x,y) и класс Circle (элементы данных р(типа Point),r). Их заголовочные файлы: class Point { ...

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...

Создать абстрактный класс "Издание" и производные классы "Книга", "Статья", "Электронный ресурс" - C++
1. Создать абстрактный класс Издание с методами, позволяющими вывести на экран информацию об издании, а также определить является ли данное...

Создать класс "Вентилятор" содержащий в себе классы: "Двигатель", "Контроллер", "Пульт управления" - C++
Помогите с кодом написания задачи, не понимаю как написать классы в классе. Нужно создать класс &quot;вентилятор&quot; содержащий в себе классы:...

Создать класс "Книга" с полями "название книги", "количество страниц", "год издания" - C++
Создать класс Книга поля: название книги,количество страниц,год издания методы: вычислить сколько лет книге и количество дней прошедших...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.12.2011, 14:32
Привет! Вот еще темы с ответами:

Определить тип данных "Запись", имеющий поля "Фамилия", "Пол", "Зарплата" - C++
определить тип данных запись имеющий поля фамилия пол зарплата. определить массив из 10 записей. в программе ввести в массив данные и...

Реализовать структуру "Анкета" с полями "Фамилия", "Пол" и "Адрес" - C++
Здравствуйте. Проходим тему Структуры, не могу понять, как определить количество, само задание: #include &lt;iostream&gt; #include...

Структура «Преподаватель» с полями "ФИО", "стаж", "категория", "нагрузка" - C++
Функция - расчёт зарплаты по нагрузке и оплате часа для определенной категории. Категория Оплата часа Вторая 150 Первая 200 ...

по строкам.замените в слове сочетание "му" на "а" , а букву "ы" на "ца". очень нужно - C++
замените в слове сочетание &quot;му&quot; на &quot;а&quot; , а букву &quot;ы&quot; на &quot;ца&quot;. очень нужно Добавлено через 21 час 4 минуты неужели никто не знает...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.