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

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

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

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

17.01.2014, 19:26. Просмотров 255. Ответов 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     Странное поведение функции
Посмотрите здесь:

Странное поведение 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++
Нужно написать функцию, которая из динамического массива удаляет все повторяющиеся элементы(остается только первый), массив сжимается.То...

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

Странное поведение string - C++
Здравствуйте. Сейчас я пытаюсь скомпилировать под Windows проект, который ранее писался под Linux. Делаю я это с помощью MinGW от...

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

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

Странное поведение в коде - C++
Есть два класса: ArrayList&lt;T&gt; и Array&lt;T&gt; (реализация в конце поста). И есть такой код: ArrayList&lt;int&gt; list = { 1, 2, 3 }; ...

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

Странное поведение кода - C++
int x; cout &lt;&lt; (x = 1) + (x = 2) + (x = 3); У меня выводит 7 (вместо 6). Почему?!?!

Странное поведение компилятора - C++
Всем привет! Я конечно понимаю что нужно выкладывать минимальный код повторяющий мою проблему но он будет достаточно грамосток т.к. в...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 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]
Yandex
Объявления
17.01.2014, 20:09     Странное поведение функции
Ответ Создать тему
Опции темы

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