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

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

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

поиск обратной матрицы - C++

14.03.2013, 19:42. Просмотров 516. Ответов 0
Метки нет (Все метки)

дана матрица A(почти матрица гильберта-отличается только 1-ая строчка):
1 1 1 1...
1/2 1/3 1/4 1/5...
1/3 1/4 1/5 1/6...
.............................
нужно найти обратную к данной матрице, используя LU- разложение матрицы(разложение на нижнетреугольную и верхнетреуг.)
т.е. в кратце как-то так: для поиска обратной матрицы нужно решить уравнение А*Х=Е(единичная матр.). сначала ищу A=L*U. затем поиск обратной матрицы сводится к решению системы:
L*Y=E
U*X=Y
X-это и есть искомая матрица.

проблема в том, что я не могу найти ошибку в своей программе, очень надеюсь, что найду здесь помощь)
(возможно мой код не блещет изящностью исполнения и экономией памяти, но сейчас главное,чтоб хотя бы работало)
(до строки из "/////////////" все правильно-проверено вручную, на листочке
далее-выкладываю код с комментами, помогите,пожалуйста)

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
#include <iostream>
#include <math.h>
#include <conio.h>
using namespace std;
 
int main()
{
int i, j, n, k;
cout<<"n=";
cin>>n;   //порядок матрицы
double**matrA=new double*[n];   //массив под матр.А
    for(i=0;i<n;i++)
    {matrA[i]=new double[n];}
    for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    {if (i==0) matrA[i][j]=1.0;
    else matrA[i][j]=1.0/(i+j+1);}
    
double**matrL1=new double*[n];   //L1-это вспомогательная нижнетреуг.матр.; при умножении на нее матрицы А,
    for(i=0;i<n;i++)                    //обнуляются поддиагональные элементы А, т.е. L1*A=U
    {matrL1[i]=new double[n];}
    for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    {if (i<j) matrL1[i][j]=0.0;
    if (i==j) matrL1[i][j]=1.0;
    if (i>j) matrL1[i][j]=(-1.0)*matrA[i][j]/matrA[j][j];}
    
double**matrU=new double*[n];  //U-верхнетреуг.матр.
    for(i=0;i<n;i++)
    {matrU[i]=new double[n];}
    for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    {matrU[i][j]=0.0;
    for (k=0; k<n; k++)
    matrU[i][j]=matrU[i][j]+matrL1[i][k]*matrA[k][j];}
    
double**matrL=new double*[n];  //L-искомая для LU-разложения нижнетреуг.матр.
    for(i=0;i<n;i++)
    {matrL[i]=new double[n];}
    for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    {matrL[i][j]=0.0;}
    
double**matrE=new double*[n];  //Е-единичная матр.
    for(i=0;i<n;i++)
    {matrE[i]=new double[n];}
    for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    {if (i==j) matrE[i][j]=1.0;
    else matrE[i][j]=0.0;}
//////////////////////////////////    
double sum;                //на данном этапе у нас есть матр.L1 и U,такие, что L1*А=U
for(j=0; j<n; j++)        //хотим "перетащить" L1 в правую часть. ищем нижнетреуг. матрицу L=L1^(-1)
{sum=0.0;                  //т.е. решаем систему L1*L=E прямым ходом
for(i=0; i<n; i++)
{
  for(k=0;k<i;k++) {sum=sum+matrL1[i][k]*matrL[k][j];}
  matrL[i][j]=(matrE[i][j]-sum)/matrL1[i][i];}}
    
double**matrY=new double*[n];   //вспомогательная матр.
    for(i=0;i<n;i++)
    {matrY[i]=new double[n];}
    for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    {matrY[i][j]=0.0;}  
      
double**matrX=new double*[n];  // X-искомая матр.(обратная к А)
    for(i=0;i<n;i++)
    {matrX[i]=new double[n];}
    for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    {matrX[i][j]=0.0;}
 
  
for(j=0; j<n; j++)  //решим систему L*Y=E прямым ходом
{sum=0.0;
for(i=0; i<n; i++)
{
  for(k=0;k<i;k++) {sum=sum+matrL[i][k]*matrY[k][j];}
  matrY[i][j]=(matrE[i][j]-sum)/matrL[i][i];}}
  
for(j=n-1; j>=0; j--)    //решим систему U*X=Y обратным ходом
{sum=0.0;
for(i=n-1; i>=0; i--)
{
  for(k=i;k<n;k++) {sum=sum+matrU[i][k]*matrX[k][j];}
  matrX[i][j]=matrY[i][j]-sum;}}    
 
   for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    {cout<<matrX[i][j]<<" ";}
    getchar(); 
    
 return 0;
    
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2013, 19:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос поиск обратной матрицы (C++):

Поиск обратной матрицы - C++
Дана ленточная разреженная матрица. Найти обратную. Знаю, что это тема есть на форуме, но ответа так и не было. Может кто-нибудь на...

Поиск обратной матрицы методом Гаусса - C++
#include&lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;stdlib.h&gt; using namespace std; static int n; void...

Умножение матрицы на матрицу, и нахождение обратной матрицы - C++
Здравствуйте! нужно написать программу, которая могла бы производить всякие операции над матрицами (двухмерными массивами) меня...

Определение обратной матрицы - C++
Помогите, задали в универе написать программку в С++ по определении обратной матрицы, циклический алгоритм

Нахождение обратной матрицы - C++
Помогите,пожалуйста доделать или переделать нужно найти обратную матрицу тут маленько наброски есть методом гаусса но не могу доделать или...

Нахождение обратной матрицы - C++
Доброго времени суток! Возникла необходимость найти обратную матрицу любым из способов, так как в программировании только делаю первые...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2013, 19:42
Привет! Вот еще темы с ответами:

Нахождение обратной матрицы - C++
Здравствуйте!помогите с программой на языке си-она демонстрирует нахождение обратной матрицы.я написал 3 на 3 юно мне надо в начале проги...

Метод обратной матрицы - C++
Необходимо добавить метод нахождения обратной матрицы #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int main() ...

Нахождение обратной матрицы - C++
Доброго времени суток! Напишите, пожалуйста, кому не сложно, простой, понятный код нахождения обратной матрицы. Буду очень признателен!

Нахождение обратной матрицы - C++
Здравствуйте, уважаемые программисты! Прощу помощи. Для заданной матрицы A(3,3), найти обратную А в -1 степени. Буду очень...


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

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

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