Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 19.05.2013
Сообщений: 7
1

В функции обратной матрицы, не могу найти ошибку

21.05.2013, 12:50. Просмотров 659. Ответов 5
Метки нет (Все метки)

У меня есть программа для нахождения обратной матрицы написанная на Dev C++.
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
#include <iostream>
#include <conio.h>
 
void inversion(double **A, int N)
{
    double temp;
 
    double **E = new double *[N];
 
    for (int i = 0; i < N; i++)
        E[i] = new double [N];
 
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
        {
            E[i][j] = 0.0;
 
            if (i == j)
                E[i][j] = 1.0;
        }
 
    for (int k = 0; k < N; k++)
    {
        temp = A[k][k];
 
        for (int j = 0; j < N; j++)
        {
            A[k][j] /= temp;
            E[k][j] /= temp;
        }
 
        for (int i = k + 1; i < N; i++)
        {
            temp = A[i][k];
 
            for (int j = 0; j < N; j++)
            {
                A[i][j] -= A[k][j] * temp;
                E[i][j] -= E[k][j] * temp;
            }
        }
    }
 
    for (int k = N - 1; k > 0; k--)
    {
        for (int i = k - 1; i >= 0; i--)
        {
            temp = A[i][k];
 
            for (int j = 0; j < N; j++)
            {
                A[i][j] -= A[k][j] * temp;
                E[i][j] -= E[k][j] * temp;
            }
        }
    }
 
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
            A[i][j] = E[i][j];
 
    for (int i = 0; i < N; i++)
        delete [] E[i];
 
    delete [] E;
}
 
int main()
{
    int N;
 
    std::cout << "N: ";
    std::cin >> N;
 
    double **matrix = new double *[N];
 
    for (int i = 0; i < N; i++)
        matrix[i] = new double [N];
 
    for (int i = 0; i < N; i++)
        for (int j = 0; j < N; j++)
        {
            std::cout << "[" << i << "][" << j << "] = ";
            std::cin >> matrix[i][j];
        }
 
    inversion(matrix, N);
 
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
            std::cout << matrix[i][j] << "  ";
 
        std::cout << std::endl;
    }
 
    for (int i = 0; i < N; i++)
        delete [] matrix[i];
 
    delete [] matrix;
 
    getch();
    return 0;
}
Я взял эту функцию и вставил ее в C++ Builder 6 с небольшим редактированием, поменял тип данных с double на float
Вот код:
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
void inversion(float **A, int N)
{
float temp;
float **E = new float *[N];
for (int i = 0; i < N; i++)
E[i] = new float [N];
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
{
E[i][j] = 0.0;
if (i == j)
E[i][j] = 1.0;
}
for (int k = 0; k < N; k++)
{
temp = A[k][k];
for (int j = 0; j < N; j++)
{
A[k][j] /= temp;
E[k][j] /= temp;
}
for (int i = k + 1; i < N; i++)
{
temp = A[i][k];
for (int j = 0; j < N; j++)
{
A[i][j] -= A[k][j] * temp;
E[i][j] -= E[k][j] * temp;
}
}
}
for (int k = N - 1; k > 0; k--)
{
for (int i = k - 1; i >= 0; i--)
{
temp = A[i][k];
for (int j = 0; j < N; j++)
{
A[i][j] -= A[k][j] * temp;
E[i][j] -= E[k][j] * temp;
}
}
}
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
A[i][j] = E[i][j];
for (int i = 0; i < N; i++)
delete [] E[i];
delete [] E;
}
Далее создаю динамический массив, и заполняю его с обычного. После того мне надо динамический массив обратить
я это делаю так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
float **xxt1 = new float*[kt];
for(int i = 0; i < kt; i++)
{
xxt1[i] = new float[kt];
}
 
for(i=0;i<kt;i++)
{for(j=0;j<kt;j++)
{xxt1[i][j]=xxt[i][j];}}
 
inversion(xxt1,kt);
 
for(i=0;i<kt;i++)
{for(j=0;j<kt;j++)
{StringGrid6->Cells[j+1][i+1]=FloatToStrF(xxt1[i][j],ffFixed,10,2);}}
но когда я вывожу оно мне неправильные значения выводит, точнее оно выводит такое, что просто жуть.

Помогите найти ошибку, а то послезавтра сдавать а программа не работает.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.05.2013, 12:50
Ответы с готовыми решениями:

Матрицы. Не могу найти ошибку.
Для каждой строки матрицы А(6*5) и В (4*8) вычислить сумму и произведение отрицательных элементов....

Не могу найти ошибку в функции
Доброго времени суток.Помогите дописать программу Вычислить и вывести на экран в виде таблицы...

Не могу найти ошибку в функции
не могу найти ошибку, помогите очень срочно надо. вот код #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt;...

Не могу найти ошибку в функции
Всем привет! ) Вот функция, она удаляет (вырезает) совпадения в строках Memo2 ну и в Столбце...

5
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30599 / 19972 / 7801
Регистрация: 22.10.2011
Сообщений: 34,773
Записей в блоге: 6
21.05.2013, 13:10 2
2garin_95, единственное, чего я в твоем коде не вижу - это чем заполняется созданный динамический массив. Ведь если там была "жуть", то после вызова inversion() там будет "инвертированная жуть"

Кстати, оригинальная функция (тестировалось на GCC) выдает при инвертировании вот такого массива:
C++
1
2
3
4
5
6
7
8
const int N = 5;
double data[N][N] =
{{6, 7, 23, 84, 15},
{21, 22, 23, 24, 25},
{31, 42, 53, 64, 75},
{41, 52, 63, 74, 85},
{10, 20, 30, 40, 50}
};
вот такие результаты:
Код
0.0648539  -2.25359e+014  -2.83143e+014  3.39001e+014  -3.8908e+013
-0.103614  2.71579e+014  3.82757e+014  -4.36224e+014  3.16556e+013
0.0214895  4.49058e+013  -1.2285e+013  -2.17473e+013  3.29449e+013
0.00844721  -3.11367e+012  8.8703e+012  -3.83775e+012  -5.22444e+012
0.00882332  -8.80124e+013  -9.61996e+013  1.22808e+014  -2.0468e+013
, так что... Делай выводы.
0
0 / 0 / 0
Регистрация: 19.05.2013
Сообщений: 7
21.05.2013, 13:43  [ТС] 3
Вот заполнения этого массива
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
int i, j;
for(int i=0; i<kt; i++)
{for(int j=0; j<kt+1; j++){
if(j==0)
x[i][j]=1;
else
x[i][j]=pow(z[i],j);}}
 
for(i=0;i<kt;i++)
{for(j=0;j<kt;j++)
{StringGrid3->Cells[j+1][i+1]=FloatToStrF(x[i][j],ffFixed,5,2);}}
for(int i=0; i<kt+1; i++)
{for(int j=0; j<kt+1; j++){
xt[j][i]=x[i][j];}}
for(i=0;i<kt;i++)
{for(j=0;j<kt;j++)
{StringGrid4->Cells[j+1][i+1]=FloatToStrF(xt[i][j],ffFixed,5,2);}}
 
for(i=0;i<kt;i++)
{for(j=0;j<kt;j++)
xxt[i][j]=0;}
 
for(i=0;i<kt;i++)
{for(j=0;j<kt;j++)
{for(int k=0;k<kt-1;k++)
{xxt[i][j]=xxt[i][j]+(xt[i][k]*x[k][j]);}}}
 
for(i=0;i<kt;i++)
{for(j=0;j<kt;j++)
{StringGrid5->Cells[j+1][i+1]=FloatToStrF(xxt[i][j],ffFixed,10,2);}}
Массив Z задается рандомно от 0.01 до 5.99
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30599 / 19972 / 7801
Регистрация: 22.10.2011
Сообщений: 34,773
Записей в блоге: 6
21.05.2013, 14:05 4
С матрицей, определитель которой не нулевой, все нормально выводит:
C++
1
2
3
4
{{2, 9, 9, 4},
 {2, -3, 12, 8},
 {4, 8, 3, -5},
 {1, 2, 6, 4}};
, результат:
В функции обратной матрицы, не могу найти ошибку


Так что проблема - с твоей матрицей, которую ты хочешь инвертировать.
0
0 / 0 / 0
Регистрация: 19.05.2013
Сообщений: 7
22.05.2013, 10:04  [ТС] 5
UI, возможно, но в консоли обратную матрицу находит.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30599 / 19972 / 7801
Регистрация: 22.10.2011
Сообщений: 34,773
Записей в блоге: 6
22.05.2013, 14:09 6
Цитата Сообщение от 2garin_95 Посмотреть сообщение
в консоли обратную матрицу находит.
Приведи матрицу, от которой ищется обратная - посмотрим, что она там находит. Тот код, что ты привел 3-им постом, меня мало интересует, значения массива Z мне неизвестны.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.05.2013, 14:09

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Не могу найти ошибку в расчете матрицы
Добрый день, господа! Суть проблемы в том, что при попытке решить СЛАУ с помощью матриц, получаю...

Табуляция функции (цикл for), не могу найти ошибку
#include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; int main() {...

Не могу найти ошибку в процессе минимизации функции
Добрый день. Помогите пожалуйста. Нужно минимизировать функцию с помощью карты Карно. Сначала по...

Программа вычисляющая значение функции. не могу найти ошибку
привет!)) помогите пожалуйста найти ошибку в программе. #include &lt;conio.h&gt; #include...

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

Не могу найти ошибку в функции перевода строк в 16-ричную СС
Привет, есть функция: void calc(int num,int base) { if (num == 0) return; ...


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

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

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