Форум программистов и сисадминов CyberForum.ru
Вернуться   Форум программистов и сисадминов CyberForum.ru > Форум Форум программистов > Форум C++ > Форум С++ для начинающих
Восстановить пароль Регистрация

Ответ Создать новую тему
 
Старый 14.03.2013, 19:42   #1
aihb
Новичок
 
Регистрация: 20.10.2012
Сообщений: 5
Репутация: 0 (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;
    
}
Другие темы раздела Форум начинающих программистов C++. Вопросы начинающих программистов по С++. Помощь студентам и школьникам в решении задач.
C++ Непонятки со списком
Нашёл код в интернете и немного не понимаю его в некоторых местах. Объясните мне пожалуйста, зачем в коде вот тут: strcpy(spis->data,"0"); // инициализируем его данными spis->next = NULL; // следующий элемент - NULL start = spis; // запоминаем начало 1) зачем...
C++ Производные
Привет всем! У меня такая проблема: надо написать программку, которая бы выдала вид прозводной, например, на вход подается f=y*x-2*y^2, необходимо производную по у написать, на выходе должно получиться: df/dy = -4*y с чего начать???? какие методы, алгоритмы можете посоветовать? Помогите!
Старый 14.03.2013, 19:42
Yandex
Объявления
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать новую тему

Похожие темы
Тема Автор
C++ Builder Получение обратной матрицы
Дана матрица 4x4 (можно ввести в Memo, можно отметить CheckBox "По умолчанию"). В функции void __fastcall TForm1::Button1Click(TObject *Sender) я вызываю функцию int TForm1::obrtm(double ** A, double ** A_obr, int size) (сделал её компонентной функцией класса, поскольку нужен доступ к объектам на...
Max_92
VBA Составить программу для вычисления обратной матрицы для матрицы А размерностью 5х5
составить программу для вычисления обратной матрицы для матрицы А размерностью 5х5, выводится массив с помощью макросов в Word Добавлено через 2 часа 24 минуты Sub массив() ' ' массив Макрос ' ' Dim A() As String Dim At() As String
love01
Delphi Поиск обратной матрицы методом Гаусса
Помогите, пожалуйста, составить алгоритм для нахождения обратной матрицы методом Гаусса.
Qvelfz
Pascal (Паскаль) Найти наибольший из положительных элементов матрицы и заменить этим числом все элементы матрицы на обратной диагонали.
Найти наибольший из положительных элементов матрицы и заменить этим числом все элементы матрицы на обратной диагонали. помогите пожалуйста срочно!!! заранее огромное спасибо!!!!
Noisewak
Опции темы

Текущее время: 20:09. Часовой пояс GMT +4.

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