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

Последний метод итераций - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ не переводит из string в char* http://www.cyberforum.ru/cpp-beginners/thread41080.html
помогите пожалуйста задание: операции со строками с использованием шаблона string #include <algorithm> #include <iostream> #include <string> #include <conio.h> using namespace std;
C++ Задание на функции Помогите решить задачку на функции С++ , что б работало в CodeGear Составить программу вычисления суммы факториалов всех четных чисел от m до n, где n! - функция. http://www.cyberforum.ru/cpp-beginners/thread41065.html
C++ Нужна помощь начинающему (while).
Собствено вот код: //While DEMO //прога выводит количество выполненых цыклов while #include <stdio.h> #include <lostream.h> int main (int arg,char* pszArgs) { //input счетчика цыклов int loopCount; cout << введи loopCount:";
C++ проход по лабиринту
Привет всем. Помогите пожалуйста с задачей на С/C++ идёт практика я не понимаю как сделать задачу просто даже не представляю училка объясняла, но я всё равно не понял пожалуйста помогите кто может с решением условие ================== Создать программу, отыскивающую проход по лабиринту. Лабиринт представляется в виде матрицы, состоящей из квадратов. Каждый квадрат ли-бо открыт, либо закрыт....
C++ Visual C++ 6.0, API функции http://www.cyberforum.ru/cpp-beginners/thread40979.html
Помогите, пожалуйста, с такой задачей:Написать программу, используя функции WinAPI (WinMain, MessageBox, CreateWindow, ShowWindow, TextOut), которая при запуске создает окно, используемое для вывода результатов работы, и завершает свое выполнение при его закрытии. Содержимое окна должно сохраняться при изменении его размера, закрытии его другим окном и т.п. Задать функцию fun22 с параметром...
C++ Почему нет варнинга на использование неиниц. переменной? float DD ; float WW ; float * float_WW = &WW ; // Берём адрес WW но при этом WW остаётся не инициализированной cout << " DD == " << DD << endl ; // warning C4700: local variable 'DD' used without having been initialized cout << " WW == " << WW << endl ; // Нет почему-то варнинга, что переменная WW юзается без инициализации Нет почему-то варнинга, что переменная WW юзается без... подробнее

Показать сообщение отдельно
galileopro
Пробующий
 Аватар для galileopro
183 / 96 / 1
Регистрация: 28.04.2009
Сообщений: 1,040
29.11.2009, 16:24     Последний метод итераций
А как Вы приводите матрицу к диагонально-преобладающему виду?

Добавлено через 2 минуты
Вот например тут в коде матрица приводится к диагонально-преобладающему виду. Поэтому код работает для любой хорошо обусловленной матрицы, записанной произвольно. Но я его никак с фортрана на С++ не преведу(
http://rulekcia.ru/kurs/45/2353
Fortran
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
       PROGRAM ITERAC
       IMPLICIT NONE
       INCLUDE 'mpif.h'
       INTEGER
      $ NPROCS, IAM, IERR, I, J,
      $ M_SIZE, BEGC, ENDC, COMM, COUNT1,
      $ XCOUNT, XNUMER, XCOUNT2, XNUMER2
       DOUBLE PRECISION
      $ SUMM, A, X, X_LAST, EPS, MAX_ERR,
      $ TIME1, TIME2, DR, DRMAX
       PARAMETER
      $ (M_SIZE = 10000, EPS=0.00000005)
       DIMENSION
      $ A(M_SIZE, M_SIZE+1),
      $ X(M_SIZE), X_LAST(M_SIZE),
      $ XCOUNT(0:M_SIZE), XNUMER(0:M_SIZE),
      $ XCOUNT2(0:M_SIZE), XNUMER2(0:M_SIZE)
      CALL MPI_INIT(IERR)
      CALL MPI_COMM_SIZE(MPI_COMM_WORLD,NPROCS,IERR)
      CALL MPI_COMM_RANK(MPI_COMM_WORLD,IAM,IERR)
      COMM = MPI_COMM_WORLD
C       «0»-процесс засекает время
      IF (IAM.EQ.0) TIME1 = MPI_WTIME()
       IF (IAM.EQ.0) THEN
C       «0»-процесс формирует матрицу А, имеющую диагональное преобладание
       DO I=1, M_SIZE
        SUMM=0
        DO J=1, M_SIZE
         A(I,J) = I+J
         SUMM=SUMM+A(I,J)
        END DO
        A(I,I) = A(I,I)+SUMM*2
       END DO
C       «0»-процесс формирует столбец свободных членов матрицы А
       DO I=1, M_SIZE
        A(I,M_SIZE+1) = M_SIZE+I**2
       END DO
C       «0»-процесс формирует начальное приближение вектора X и начальное
C       приближение максимальной ошибки MAX_ERR
       DO I=1, M_SIZE
        X(I)=A(I,M_SIZE+1)/A(I,I)
        IF (X(I).GT.MAX_ERR) MAX_ERR=DABS(X(I))
       END DO
       OPEN(12, FILE='RES.DAT')
       COUNT1 = 0
       END IF
C       каждый процесс определяет первую и последнею строки свой полосы для расчета
C       и соответственно первую и последнюю координаты вектора X
       BEGC = IAM*M_SIZE/NPROCS+1
       ENDC = (IAM+1)*M_SIZE/NPROCS
C        каждый процесc определяет свои массивы размера полоc и их положение
       DO I = 0,NPROCS-1
        XCOUNT (I) = ((I+1)*M_SIZE/NPROCS - I*M_SIZE/NPROCS)
        XNUMER (I) = I*M_SIZE/NPROCS
       END DO
       DO I = 0,NPROCS-1
        XCOUNT2 (I) = XCOUNT (IAM)
        XNUMER2 (I) = XNUMER (IAM)
       END DO
C       «0»-процесс рассылает всем процессам матрицу А и начальное приближение
C       максимальной ошибки MAX_ERR
       CALL MPI_BCAST (A(1,1), M_SIZE*(M_SIZE+1),
       $ MPI_DOUBLE_PRECISION, 0, COMM, IERR)
       CALL MPI_BCAST (MAX_ERR, 1,
       $ MPI_DOUBLE_PRECISION,0,COMM,IERR)
C        основной цикл программы;
C        вычисления идут, пока MAX_ERR не станет меньше точности EPS
       DO WHILE (MAX_ERR.GT.EPS)
        IF(IAM.EQ.0) THEN
         DO I=1, M_SIZE
          X_LAST(I)=X(I)
         END DO
        END IF
C        «0»-процесс рассылает всем процессам вектор X
        CALL MPI_BCAST (X(1), M_SIZE,
       $ MPI_DOUBLE_PRECISION, 0, COMM, IERR)
C        обращение к процедуре вычисления новых значений вектора X
        CALL ITER_JA (X, A, M_SIZE, BEGC, ENDC)
C        процессы отсылают друг другу свои рассчитанные блоки нового вектор X
        CALL MPI_ALLTOALLV(X(1), XCOUNT2, XNUMER2,
       $ MPI_DOUBLE_PRECISION, X(1), XCOUNT,
       $ XNUMER, MPI_DOUBLE_PRECISION,
       $ MPI_COMM_WORLD, IERR)
C        «0»-процесс вычисляет ошибку MAX_ERR
        IF(IAM.EQ.0) THEN
         MAX_ERR=DABS((X(1)-X_LAST(1)))
         DO I=2, M_SIZE
          IF (DABS((X(I)-X_LAST(I))).GT.MAX_ERR)
       $ MAX_ERR=DABS((X(I)-X_LAST(I)))
         END DO
C        счетчик COUNT1 считает колличество итераций
         COUNT1=COUNT1+1
        END IF
C        «0»-процесс рассылает новое значение ошибки вычисления MAX_ERR
        CALL MPI_BCAST(MAX_ERR,1,MPI_DOUBLE_PRECISION,0,COMM,IERR)
        END DO
        IF (IAM.EQ.0) THEN
C        «0»-процесс выполняет проверку и производит выдачу результатов
C        в файл RES.DAT
         WRITE(12,*) 'Vector X ', 'ERROR '
         DRMAX=0.0
         DO I=1,M_SIZE
          SUMM=0.0
          DO J=1,M_SIZE
           SUMM=SUMM+X(J)*A(I,J)
          END DO
          DR = (SUMM - A(I,M_SIZE+1))/A(I,M_SIZE+1)
          WRITE(12,'(3f18.7)') X(I), SUMM - A(I,M_SIZE+1)
          IF (DR.GT.DRMAX) DRMAX = DR
         END DO
         WRITE(12,'(a, i4)') 'Count of iteration', COUNT1
         WRITE(12,'(a, f14.6)') 'Maximum of absolute error', DRMAX
C        «0»-процесс засекает время и определяет длительность работы программы
         TIME2 = MPI_WTIME()
         WRITE(12, *) 'Time of calculation', TIME2-TIME1
         WRITE(12,*) 'GOOD FINISH'
         CLOSE(12)
         END IF
        CALL MPI_FINALIZE(IERR)
      END
C        подпрограмма, выполняющая вычисления новых значений вектора X
C        в полосе матрицы А, определенной для каждого процесса
      SUBROUTINE ITER_JA (X_OLD, AM, M_S, FIRST, LAST)
      IMPLICIT NONE
      INTEGER I, J, WIDTH, M_S, M_SIZE, FIRST, LAST
      DOUBLE PRECISION SUMM, AM, XX, X_OLD
      PARAMETER (M_SIZE = 10000)
      DIMENSION AM(M_SIZE, M_SIZE+1), XX(M_SIZE), X_OLD(M_SIZE)
      DO I=FIRST, LAST
        SUMM=0
        DO J=1, I-1
         SUMM=SUMM+AM(I,J)*X_OLD(J)
        END DO
        DO J=I+1, M_S
         SUMM=SUMM+AM(I,J)*X_OLD(J)
        END DO
        XX(I) = (AM(I,M_S+1)-SUMM)/AM(I,I)
       END DO
       DO I=FIRST, LAST
         X_OLD(I) = XX(I)
       END DO
      RETURN
      END
 
Текущее время: 19:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru