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

Странное поведение функции - C++

Восстановить пароль Регистрация
 
Beta1
0 / 0 / 0
Регистрация: 09.04.2013
Сообщений: 5
17.01.2014, 19:26     Странное поведение функции #1
Здравствуйте!
Я взялась за реализацию метода Крылова для нахождения коэффициентов характеристического полинома.
Написала программу, но беда: в функции VectorMultyplier() происходит странная штука.
Эта функция, как видно, использует написанную прежде void MatrixDegree(int degree), где вычисляется матрица RezA[i][j] (- степень d исходной матрицы A). Однако через пару строк, в цикле for(int j=0; j<N; j++) для d=4 элемент RezA[0][0] обнуляется.
Получается, что при вводе вектора (0.1, 0.4, 0.5, 0) сначала значения RezA при d=4:

2262 3979 3701 3844
3979 7106 6607 6804
3701 6607 6338 6300
3844 6804 6300 6553

а потом:

0 3979 3701 3844
3979 7106 6607 6804
3701 6607 6338 6300
3844 6804 6300 6553.

Подскажите, пожалуйста, в чем проблема? Заранее прошу прощения за нубовский код.

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
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
#include <iostream>
#include <iomanip>
#include <locale.h>
using namespace std;
 
const int N=4;
const int A[N][N] = {{2,1,3,2}, 
                     {1,5,4,3},
                     {3,4,1,5},
                     {2,3,5,3}};
double RezA[N][N];
double Y[N][N+1], Arr[N][N+1], x[N];
int i, j, k;
 
void VectorMultyplier();
void MatrixDegree(int degree);
void ArrLoad();
void Gauss();
 
int main () {
    setlocale(LC_ALL, "Russian");
    int point=0;
    do {
        //system("cls");
        cout << "Введите элементы вектора Y0:\n"; //Ввод вектора
        for(i=0; i<N; i++) {
            cout << "Y0["<<i<<"]="; cin >> Y[0][i];
        }
        VectorMultyplier();
        ArrLoad();
        Gauss();
        cout << "\n";
        system("pause");
        point ++;
    } while(point!=0);
    return 0;
}
 
void MatrixDegree(int degree) {
    double tmp;
    double A2[N][N];
 
    for(i=0; i<N; i++)
            for(j=0; j<N; j++) RezA[i][j]=A[i][j];
 
    for(int deg=1; deg<degree; deg++) {
        for(i=0; i<N; i++)
            for(j=0; j<N; j++) A2[i][j]=RezA[i][j];
 
        for(i=0; i<N; i++) {
            for(j=0; j<N; j++) {
                tmp=0.0;
                for(k=0; k<N; k++) {
                    tmp+=A[i][k]*A2[k][j];
                }
                RezA[i][j]=tmp;
            }
        }
    }
    for(i=0; i<N; i++) {
        for(j=0; j<N; j++)
            cout << RezA[i][j] << "  ";
        cout << "\n";
    }
}
 
void VectorMultyplier() {
        for(int d=1; d<N+1; d++) {
        MatrixDegree(d);
        
/*  for(i=0; i<N; i++) {
        for(j=0; j<N; j++)
            cout << RezA[i][j] << "  ";
        cout << "\n";
    }
*/
        for(int i=0; i<N; i++) {
            Y[d][i]=0; 
            for(int j=0; j<N; j++){
                //cout << RezA[i][j] << "  ";
                Y[d][i]=Y[d][i]+RezA[i][j]*Y[0][j];
            } //cout << "\n";
        }
    }
}
 
void ArrLoad() {
    int i, j, k=3;  
    for(i=0; i<N; i++)
        for(j=0; j<N; j++) {
            Arr[i][j]=Y[k-j][i];
            Arr[i][4]=-Y[4][i];
        }
}
 
void Gauss() {
    cout << "Исходная матрица для вычислений методом Гаусса: \n";
    for(i=0; i<N; i++) {
        for(j=0; j<N+1; j++)
            printf("%10.4f ", Arr[i][j]);
        cout <<"\n";
    }
    cout <<"\n";
    for(int n=1; n<=N-1; n++){
        for (i=n; i<N; i++) {
            for (j=n; j<N+1; j++){
                Arr[i][j]=Arr[i][j]-Arr[n-1][j]*Arr[i][n-1]/Arr[n-1][n-1];
            }
        Arr[i][n-1]=0;
        }
        cout << "Матрица на следующем шаге преобразований: \n";
        for(i=0; i<N; i++) {
            for(j=0; j<N+1; j++)
            printf("%10.4f ", Arr[i][j]);
            cout <<"\n";
        }
        cout << "\n";
    }
         /*Вычисление корней*/
         for (i=N-1; i>=0; i--){
             x[i]=Arr[i][N];
         for (j=i+1; j<N; j++){
             x[i]=x[i]-Arr[i][j]*x[j];
         }
             x[i]=x[i]/Arr[i][i];}    
         cout << "\n";
         cout << "Таким образом, коэффициенты характеристического полинома: \n";
         for(i=0; i<N; i++) cout << x[i] << "   ";
/*       for ( i = 0; i < N; i++ ) {
            cout << "x["<<i+1<<"]="<<x[i];
            cout << "\n";
         }
*/
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.01.2014, 19:26     Странное поведение функции
Посмотрите здесь:

Странное поведение (сдвиг) C++
Странное поведение функции работы с массивом(шаблон) C++
Странное поведение map в объкт-функции C++
C++ Странное поведение
странное поведение указателя C++
Странное поведение new C++
Странное поведение cin C++
Странное поведение присваивания C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,899
Записей в блоге: 2
Завершенные тесты: 1
17.01.2014, 20:09     Странное поведение функции #2
C++
1
2
3
            for (j=n; j<N+1; j++){
                Arr[i][j]=Arr[i][j]-Arr[n-1][j]*Arr[i][n-1]/Arr[n-1][n-1];
            }
N+1?
Значит на последнем проходе будет обращение к A[i][N]
Yandex
Объявления
17.01.2014, 20:09     Странное поведение функции
Ответ Создать тему
Опции темы

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