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

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

Войти
Регистрация
Восстановить пароль
 
uzik
0 / 0 / 0
Регистрация: 10.06.2010
Сообщений: 7
#1

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

06.10.2011, 23:18. Просмотров 520. Ответов 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"); 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.10.2011, 23:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос помогите разобраться с библиотекой и в чем ошибка? (C++):

Помогите разобраться в чем ошибка. - C++
Есть 2 задачи, первая: Удалить элементы, значение которых меньше среднего значения всех элементов массива. #include &lt;iostream.h&gt;...

Помогите разобраться с кодом и чем компилировать - C++
Собственно говоря... задали написать преподы фтп клиент.... в этом деле честно говоря не понимаю.... ссылка вот...

Не могу разобраться в чем ошибка - C++
Задача: Составить описание класса многочленов от одной переменной, задаваемых степенью многочлена и массивом коэффициентов. Предусмотреть...

помгите разобраться в чем ошибка? (найти все натуральные числа в диапазоне между m и n (m<n)) - C++
Вот мое задание:найти все натуральные числа в диапазоне между m и n (m&lt;n), в записи которых нет двух одинаковых цифр. Подсчитать...

В чем ошибка помогите пожалуйста. - C++
В чем ошибка помогите пожалуйста. # include &lt;iostream.h&gt; # include &lt;stdio.h&gt; # include &lt;math.h&gt; void main() {int a; cout &lt;&lt;&quot;...

немогу никак понять в чем ошибка=(помогите плиз! - C++
есть вот такой вот код : #include &lt;iostream.h&gt; #include &lt;math.h&gt; void main(void) { int...

1
-=ЮрА=-
Заблокирован
Автор FAQ
07.10.2011, 09:28 #2
В чём проблемма то?Если не компилируется, тогда дело в этом
Цитата Сообщение от uzik Посмотреть сообщение
#include "nrutil.h"
- это не стандартный хедер и если этого файла у вас нет, то к сожалению приведенный код лишь бесполезный набор символов
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.10.2011, 09:28
Привет! Вот еще темы с ответами:

Написал програмку ,но она не всё показывает,в чем ошибка помогите - C++
#include &quot;iostream&quot; #include &quot;float.h&quot; #include &quot;math.h&quot; #include &quot;stdafx.h&quot; using namespace std; float main() { float a, b,...

Написал класс "Телефонная книга". Но при работе вылетает ошибка. помогите разобраться. - C++
Доброго времени суток! Пацаны, дайте подсказку. Пишу телефонную книгу с классами и у меня возникла проблемка (чтение из файла по полям...

Ошибка с библиотекой после компиляции - C++
Скомпилировал библиотеку freetype-gl++.lib , но при использовании примера, который прилагался, возникают ошибки. Как понять в чём...

Ошибка с библиотекой fltk (Ссылка на неразрешенный внешний символ) - C++
Изучаю программирование с графикой. У меня проблема выдает следующее сообщения ошибок компиляции 1&gt;main.obj : error LNK2019: ссылка на...


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

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

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