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

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

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

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

17.01.2014, 19:26. Просмотров 262. Ответов 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++):

Странное поведение map в объкт-функции - C++
есть класс class writer { map &lt;string, list&lt;string&gt; &gt; &amp;dat; list&lt;string&gt; &amp;all; bool flag; //true = familiya public: ...

Странное поведение функции работы с массивом(шаблон) - C++
Нужно написать функцию, которая из динамического массива удаляет все повторяющиеся элементы(остается только первый), массив сжимается.То...

Странное поведение new - C++
Объясните почему оператор new выделяет неверное количество памяти? # include &lt;iostream&gt; using namespace std; char* interpitator( int...

Странное поведение - C++
Здравствуйте еще раз :) Теперь возникла другая непонятка. Есть класс StringParser, объекты которого умеют разбивать строку на подстроки,...

Странное поведение указателя - C++
#include &lt;iostream&gt; #include &lt;cstring&gt; int main(){ char line1=&quot;hello world!&quot;; char line2=&quot;hell word!&quot;; int...

Странное поведение строки - C++
Есть класс со связным списком(в связных списках символы)(файл1). Перегружаю оператор сложения для объектов этих классов так, чтобы оператор...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Модератор
Эксперт CЭксперт С++
13133 / 7396 / 828
Регистрация: 27.09.2012
Сообщений: 18,227
Записей в блоге: 3
Завершенные тесты: 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]
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.01.2014, 20:09
Привет! Вот еще темы с ответами:

Странное поведение cin - C++
Перегружаю оператор ввода следующим образом: #include &lt;iostream&gt; using namespace std; class Vector2D { public: ...

Странное поведение cin - C++
Есть класс, в нем есть два текстовых private члена, friend-оператор&gt;&gt; и friend-функция getline для записи в эти члены. Но когда в main.cpp...

Странное поведение указателя - C++
Здравствуйте, наткнулся на непонятное мне поведение указателя или точнее менеджера памяти. Есть код: #include &lt;iostream&gt; #include...

Странное поведение getline - C++
В программе в двух местах используеться getline. В первом случае все супер : string ownerName; getline (cin, ownerName); А во...


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

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

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