Войти

Показать полную графическую версию : [решено] Нахождение обратной матрицы методом Гаусса и рассширенной матрицы


Страниц : [1] 2 3 4

D.Y.
22-06-2008, 01:29
Мне срочняк надо прогу нахождения обратной матрицы методом гаусса и при помощи расширенной матрицы я написал но она требует доработки а сдавать в среду
если у кого есть напишите пожалуйста заранее благодарен (иначе сессия продлится до сентября)

Admiral
22-06-2008, 13:16
я написал но она требует доработки »
Ну и где код в теме?
Математика процесса (http://www.exponenta.ru/educat/class/courses/la/theme3/theory.asp)
определитель матрицы методом Гаусса (http://www.cyberforum.ru/cpp/thread3119.html)
Обратная матрица методом Гаусса (http://forum.sources.ru/index.php?showtopic=213253&st=0)

Drongo
22-06-2008, 13:20
D.Y., я написал но она требует доработки »А где исходники, которые требуют доработки?
Метод Гаусса (http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%B0%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B0), ещё смотри тут (http://ref.net.ua/work/det-26150.html) (не всё конечно, но про Гаусса есть.)

D.Y.
22-06-2008, 13:22
//вот метод гаусса
#include <vcl.h>
#include <conio.h>
#include <iostream.h>
#include <math.h>
#pragma hdrstop
#pragma argsused
//using namespace::std;
const int dim=20;
int InvMatrG(int n, float(*a)[dim], float e,float d)
{int i,j,k;
float y,w;
float b[dim],c[dim];
int z[dim];
d=1;
for(j=0;j<n;j++)
x[j]=j;
for (i=0;i<n;i++)
{k=i;
y=a[i][i];
if (fabs(w)>fabs(y))
{k=j;
y=w;}}
d*=y;
if (fabs(y)<e)
{cout<<"matrica virojdena";
getch();
}
for (j=0;j<n;j++){
c[j]=a[j][k];
a[j][k]=a[j][i];
a[j][i]=-c[j]/y;
a[i][j]=a[i][j]/y;
b[j]=a[i][j];}
a[i][j]=1/y;
j=z[i];
z[i]=z[k];
z[k]=j;
for (k=0;k<n;k++)
if(k!=i)
for(j=0;j<n;j++)
if (j!=i)
a[k][i]-=b[j]*c[k];}
for (i=0;i<n;i++){
k=z[i];
if (k!=i){
for (j=0;j<n;j++)
{w=a[i][j];
a[i][j]=a[k][j];
a[k][j]=w;}
j=z[i];
z[i]=z[k];
d=-d;
}}}
int MatrIn (int n,float(*a)[dim]){
int i,j;
for(i=0;i<n;i++)
for (j=0;j<n;j++)
cin>>a[i][j];}
int MatrOut(intn,float(*a)[dim]){
int i,j;
for (i=0;i<n;i++)
for (j=0;j<n;j++)
cout<<a[i][j]<<" ";}
void main()
{int n;
float matr[dim][dim];
float d;
cout<<"\n vvedite razmernost'";
cin>>n;
cout<<"\n vvedite elemeti";
MatrIn(n,(*matr)[n]);
cout"\n tochnost'";
cin>>e;
InvMatrG(n,matr[][n],e,d);
cout"\n obratnaya matrica";
MatrOut(n,matr[][n]);
getch();
}






//а вот

//Нахождение обратной матрицы методом расширенной матрицы

#include <vcl.h>
#include <conio.h>
#include <iostream.h>
#include <math.h>
#pragma hdrstop
#pragma argsused

const int dim1=20;
const int dim2=40;
float **a,**a1;
int n;
//vvod matrici
int MatrIn()
{int i,j;
for (i=0;i<n;i++)
for (j=0;j<n;j++)
cin>>a[i][j];
}
//obraschenie matrici
int invMatr(float e)
{
int i,j,k,n1;
float f,f1;
float matr[20][40];
n1=2*n;
for (int i=0;i<n;i++)
for (j=0;j<n1;j++)
if (j<n)
matr [i][j]=a[i][j];
else
if (j==n+1)
matr[i][j]=1;
else
matr [i][j]=0;
for (int i=0;i<n;i++)
{k=i;
f1=matr[i][j];
while (fabs(f1)<e)
{if (k<n)
{
k++;
f1=matr[k][i];
}
else
{
cout<<"matrica virojdena";
gatch();
}
for (j=i;j<n1;j++)
{
f=matr[k][j];
matr[k][j]=matr[i][j];
matr[i][j]=f/f1;
}
for (k=0;k<n;k++)
if (k!=i)
for (j=n1-1;j>=i;j--)
matr[k][j]=matr[k][j]-matr[i][j]*matr[k][j];
}
for (i=0;i<n;i++)
for (j=0;j<n;j++)
a[i][j]=matr[i][j+n];
}
}
//vivod obratnoy matrici
int MatrOut()
{
int i,j;
for (i=0;i<n;i++)
for (j=0;j<n;j++)
cout<<a1[i][j]<<" ";
}
//glavnaya proga
void main()
{
float e;
cout<<"vvedite razm matrici";
cin>>n;
cout<<"vvedite cherez probel elementi metrici";
a=new float*[n];
MatrIn();
a1=new float*[n];
for (int i=0;i<n;i++)
a1[i]=new float[n];
cout<<"vvedite tochnost' vichisleniya";
cin>>e;
InvMatr(e);
cout<<"obratnaya matrica";
MatrOut();
getch();
}

Drongo
22-06-2008, 13:29
D.Y., Выдели код и оформи тегом , на панельке инструментов, над полем ввода есть изображение решётки - # Отредактируй своё сообщение, Через ссылку Редактировать выдели весть текст и щёлкни по ней или вручную пропиши сначала перед кодом [CODE] потом в конце Теги (http://forum.oszone.net/misc.php?do=bbcode#code)

Ты хоть этот код сам писал? Мне кажется не сам. Что именно не получается там? Где искать ошибку? Я вот только что загрузил в комплятор, 10 ошибок и 3 предупреждения

D.Y.
22-06-2008, 13:56
использовал книгу "решение инженерных задач при помощи С++"
у меня не находило библиотеку "vcl.h" когда я ее комментировал
выбивало ошибки на счет директив препроцессора "argsused" & "hdrstop"
я их тоже комментировал но выбило ошибку что функции ввода и вывода должны возвращать значения

Drongo
22-06-2008, 13:57
z[i]=z[k];
d=-d;
}}}
int MatrIn (int n,float(*a)[dim]){ »Одну скобку } нужно убрать точно.

for(j=0;j<n;j++)
x[j]=j; »Непонятное присвоение?

D.Y.
22-06-2008, 14:05
У меня Visual Studio 2008 вот что выдает
Курсач.cpp
.\Курсач.cpp(7) : fatal error C1083: Cannot open include file: 'vcl.h': No such file or directory
Build log was saved at "file://c:\Documents and Settings\Женя\Мои документы\Visual Studio 2008\Projects\Курсач\Курсач\Debug\BuildLog.htm"
Курсач - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Drongo
22-06-2008, 14:17
D.Y., А у меня Borland C++ Builder 6.0

http://i028.radikal.ru/0806/2b/a8b91f426221.jpg (http://www.radikal.ru)

D.Y., В этой функции int InvMatrG(int n, float(*a)[dim], float e, float d)подразумевается возвращение результата, но она ничего не возвращает!

Та же функция, что и выше.
for(j = 0; j < n; j++) // нехватает скобки {
x[j] = j;

В общем, я точно уверен, что вы не писали эту программу, там такие ошибки... Что вряд ли бы вы не заметили.

В общем, что смог и знаю, подправил, в остальном я не компетентен.

#include <vcl.h>
#include <conio.h>
#include <iostream.h>
#include <math.h>
#pragma hdrstop
#pragma argsused
//using namespace::std;
const int dim = 20;
void InvMatrG(int n, float(*a)[dim], float e, float d)
{
int i,
j,
k,
x;
float y,
w;
float b[dim], c[dim];
int z[dim];
d = 1;

for(j = 0; j < n; j++){
x[j] = j;
for (i = 0; i < n; i++){
k = i;
y = a[i][i];
if(fabs(w) > fabs(y)){
k = j;
y = w;
}
}
d *= y;
if(fabs(y) < e){
cout<<"matrica virojdena";
getch();
}

for(j = 0; j < n; j++){
c[j] = a[j][k];
a[j][k] = a[j][i];
a[j][i] -= c[j]/y;
a[i][j] = a[i][j] / y;
b[j] = a[i][j];
}

a[i][j] = 1 / y;
j = z[i];
z[i] = z[k];
z[k] = j;
for(k = 0; k < n; k++)
if(k != i)
for(j = 0; j < n; j++)
if(j != i)
a[k][i] = -b[j] * c[k];
}

for(i = 0; i < n; i++){
k = z[i];
if(k != i){
for(j = 0; j < n; j++){
w = a[i][j];
a[i][j] = a[k][j];
a[k][j] = w;
}
j = z[i];
z[i] = z[k];
d = -d;
}
}
}
//----------------------------------------
void MatrIn (int n,float(*a)[dim])
{
int i,
j;

for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
cin>>a[i][j];
}
//-----------------------------------------------------
void MatrOut(int n,float(*a)[dim])
{
int i,
j;

for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
cout<<a[i][j]<<" ";


}
void main()
{
int n, e;
float matr[dim][dim];
float d;

cout<<"\n vvedite razmernost'";
cin>>n;
cout<<"\n vvedite elemeti";

MatrIn(n,(*matr)[n]); // Проверьте синтаксис и правильность принимаемых параметров
cout<<"\n tochnost'";
cin>>e;
InvMatrG(n, matr[][n], e, d); // Проверьте синтаксис и правильность принимаемых параметров
cout<<"\n obratnaya matrica";
MatrOut(n, matr[][n]); // Проверьте синтаксис и правильность принимаемых параметров

getch();
}

D.Y.
22-06-2008, 14:51
Спасибо и за это!

Drongo
22-06-2008, 15:39
//Нахождение обратной матрицы методом расширенной матрицы
#include <vcl.h>
#include <conio.h>
#include <iostream.h>
#include <math.h>
#pragma hdrstop
#pragma argsused

const int dim1=20;
const int dim2=40;
float**a,**a1;
int n;
//vvod matrici
void MatrIn()
{
int i,
j;

for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
cout<<"vvedite cherez probel elementi metrici[ "<<i<<" ][ "<<j<<" ] = ";
cin>>a[i][j];
}
}
}
//obraschenie matrici
void invMatr(float e)
{
int i,
j,
k,
n1;
float f,
f1;
float matr[20][40];
n1 = 2 * n;

for(int i = 0; i < n; i++)
for(j = 0; j < n1; j++)
if(j < n)
matr[i][j] = a[i][j];
else if(j == (n + 1))
matr[i][j] = 1;
else
matr[i][j] = 0;

for(int i=0;i<n;i++){
k = i;
f1 = matr[i][j];
while(fabs(f1) < e){
if(k < n){
k++;
f1 = matr[k][i];
}
else{
cout<<"matrica virojdena";
getch();
}
for(j = i; j < n1; j++){
f = matr[k][j];
matr[k][j] = matr[i][j];
matr[i][j] = f / f1;
}

for(k = 0; k < n; k++)
if(k != i)
for(j = n1 - 1; j >= i; j--)
matr[k][j] = matr[k][j] - matr[i][j] * matr[k][j];
}

for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
a[i][j] = matr[i][j + n];
}
}
//vivod obratnoy matrici
void MatrOut()
{
int i,
j;

for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
cout<<a1[i][j]<<" ";
}
//glavnaya proga
void main()
{
int e;

cout<<"vvedite razm matrici: ";
cin>>n;

a = new float* [n];

MatrIn();

a1 = new float* [n];

for(int i = 0; i < n; i++)
a1[i] = new float[n];

cout<<"vvedite tochnost' vichisleniya: ";
cin>>e;
invMatr(e);
cout<<"obratnaya matrica: ";
MatrOut();
getch();
}
//--------------------------------------------------------------------------
Вопрос, что делает эта строка кода:
a=new float*[n]; // эта строка
MatrIn();
a1=new float*[n]; // И эта строка
А так же, что это? Указатель на указатель?
float **a,**a1;Ошибка появляется после ввода данных, на этапе
a=new float*[n]; // эта строка А так всё комплируется и до этой строки работает.

D.Y.
22-06-2008, 16:04
Вопрос, что делает эта строка кода:
a=new float*[n]; // эта строка
MatrIn();
a1=new float*[n]; // И эта строка
это создается новая матрица типу float

Drongo
22-06-2008, 17:32
D.Y., это создается новая матрица типу float »Динамическое выделение
float *array = new float[size];

Drongo
22-06-2008, 18:01
D.Y., Тогда, что делает эта строка в главной функции main()?
for(int i = 0; i < n; i++)
a1[i] = new int[n];У меня просто у самого знаний нехватает.

Эти строки не используются в программеconst int dim1=20;
const int dim2=40;

В общем, ошибка где-то здесь:
...
a1 = new float* [n];

for(int i = 0; i < n; i++)
a1[i] = new float[n];
...

Admiral
22-06-2008, 22:36
D.Y., в первом посте неплохо бы было указать сразу тему с другого форума есть рабочая прога(содрана с книги) не могу понять под какую среду писалась (http://forum.shelek.ru/index.php/topic,15288.msg177622) так сказать доложить о проделанных попытках по преодолении сложности, здесь бы дублей по догадкам не было.
А книга именно так называется, может всё же полное название Языки Си С++ для решения инженерных и экономических задач (http://www.otd.tstu.ru/is/lang/Cpp/index.html)?

if (j!=i)
a[k][i]-=b[j]*c[k];}
for (i=0;i<n;i++){ »
Выделенная скобка закрывает функцию int InvMatrG(int n, float(*a)[dim], float e,float d) всё что дальше в кодовом космосе находится.

Drongo
22-06-2008, 23:22
Admiral,бы было указать сразу тему с другого форума »А как вы его нашли там?
D.Y., D.Y., так поставь себе задачу: выбрось этот жуткий, кривой код и напиши свой, красивый и работающийи Придется так и сделать но я хотел не напрягаясь содрать:) Не обессудьте, но таки придётся написать самому. Хоть бы сказали, что вам его подправили здесь на OSZone, а то: "я подправил." Всё-таки первое впечатление В общем, я точно уверен, что вы не писали эту программу »правильное.

Admiral
23-06-2008, 02:59
Drongo, уточнял книгу и главу в которой сабж и вышел на ту тему.
http://www.google.com/search?hl=ru&client=opera&rls=en&hs=vIU&q=%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5+%D0%B8%D0%BD%D0%B6%D0%B5%D0%BD%D0%B5%D1%80%D0%BD%D1%8B% D1%85+%D0%B7%D0%B0%D0%B4%D0%B0%D1%87+%D0%BF%D1%80%D0%B8+%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D0%B8+%D0%A1% 2B%2B+%D0%9D%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5+%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0 %BD%D0%BE%D0%B9+%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D1%8B+%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%B C+%D1%80%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9+%D0%BC%D0%B0%D1%82%D1%80%D0%B8% D1%86%D1%8B&btnG=%D0%9F%D0%BE%D1%88%D1%83%D0%BA&lr=

Drongo
23-06-2008, 11:47
...
void MatrIn()
{
int i,
j;

for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
cout<<"vvedite cherez probel elementi metrici[ "<<i<<" ][ "<<j<<" ] = ";
cin>>a[i][j];
}
}
}
...Как я понял в первом куске кода выполняется присвоение массиву размером n * n если n равна 2, то получается 4, в то время, как в куске кода ниже, память выделяется только под n = 2...
cin>>n;

a = new float* [n];

MatrIn();

a1 = new float* [n];

for(int i = 0; i < n; i++)
a1[i] = new float[n];
...Хотя если честно я не знаю, проверил этот способ, но всё равно ошибка.

D.Y.
23-06-2008, 15:09
а не моглибы вы прокомментировать(что в какой строке делается) программу я взял у паренька но он кудато пропал и я не пойму что в ней творится особенно в конце
было задание решение СЛАУ методом Крамера
#include <iostream.h>
#include <stdio.h>
#include <math.h>
double DET (unsigned int columns);
bool PROVCOL(unsigned int num, char colNum);
unsigned int Column1(unsigned int num, char colNum);
unsigned int Column0(unsigned int num, char colNum);
double **Matrix;
int n;
main()
{
int i, j;
double mainDET;
cout<<"Vvedite kolichestvo uravneniy "<<endl;
cin>>n;
while (n > 10 || n < 1)
{
cout<<"Vu ne mogete vvesti bol'she 10 ili men'she 1 uravneniya, vvedite esche raz ";
cin>>n;
}

Matrix = (double**) new double[n];
for (i=0; i<= n-1; i++)
{Matrix[i] = new double[n+1];}
for (i = 0; i <= n-1; i++)
for (j = 0; j <= n; j++)
{
cout<<"Vvedite element matricu s koordinatami ("<<i<<","<<j<<") ";
cin>>Matrix[i][j];
}
cout<<"Vasha matrica:\n";
for (i = 0; i <= n-1; i++)
{for (j = 0; j <= n; j++)
cout<<Matrix[i][j]<<"\t";
cout<<endl;
}
mainDET = DET(pow(2,n));
if (mainDET == 0)
{
cout<<"Net resheniy!\n";
}
else
{
printf ("Korni sistemu:\n");
for (i=0; i <= n-1; i++)
printf ("%.3f ", -pow(-1,n+i)*DET(pow(2,i))/mainDET);
printf ("\n");
}
cout<<"Detrmenant sistemu raven: "<<mainDET<<endl;
for (i = 0; i <= (n-1); i++)
delete Matrix[i];
delete Matrix;
cout<<"Vuchisleniya zakonchenu. Spasibo chto vubrali nas!\n";
return 0;
}


double DET (unsigned int columns)
{double det = 0;
int i, numCols = 0, lastFalse, cntr = 0;
for (i=0; i<=n; i++)
{
if (PROVCOL(columns, i))
numCols++;
else lastFalse = i;
}
if ((n - numCols) == 0) det = Matrix[n-1][lastFalse];
else
for (i = 0; i <= n; i++)
if (!PROVCOL(columns, i))
{
columns = Column1(columns, i);
det += pow(-1,(cntr))*Matrix[numCols-1][i]*DET(columns);
columns = Column0(columns, i);
cntr++;
}
return det;
}
bool PROVCOL(unsigned int num, char colNum)
{
_asm
{
xor eax, eax;
xor ebx, ebx;
mov bl, colNum;
bt num, ebx;
jnc none;
inc eax;
none:
}
}
unsigned int Column1(unsigned int num, char colNum)
{
_asm
{
xor eax, eax;
mov al, colNum;
bts num, eax;
}
return num;
}
unsigned int Column0(unsigned int num, char colNum)
{
_asm
{
xor eax, eax;
mov al, colNum;
btr num, eax;
}
return num;
}

Drongo
23-06-2008, 16:56
D.Y.,
bool PROVCOL(unsigned int num, char colNum)
{
_asm
{
xor eax, eax;
xor ebx, ebx;
mov bl, colNum;
bt num, ebx;
jnc none;
inc eax;
none:
}
}
unsigned int Column1(unsigned int num, char colNum)
{
_asm
{
xor eax, eax;
mov al, colNum;
bts num, eax;
}
return num;
}
unsigned int Column0(unsigned int num, char colNum)
{
_asm
{
xor eax, eax;
mov al, colNum;
btr num, eax;
}
return num; Ассемблерная вставка _asm

В остальном, чужой код комментировать трудно. Простой ещё можно, а тут, поможет только автор.
Вот тут добавь строку cin>>i; иначе будет программа закрываться после выполнения
...
delete Matrix;
cout<<"Vuchisleniya zakonchenu. Spasibo chto vubrali nas!\n";
cin>>i;
return 0;
...




© OSzone.net 2001-2012