Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2012, 16:49   #1
nat@
 
Аватар для nat@
 
Регистрация: 13.12.2011
Сообщений: 7
Печаль обратная матрица

Привет всем,мне нужна помощь ..

Нужно написать программу на Си. Задача звучит так:
Задано целое число н, является размерностью квадратной матрицы действительных чисел. Найти для заданной пользователем матрицы обратную матрицу методом Гауса.Хид выполнения выводить на экран и в файл (название файла вводит пользователь). Осуществить проверку полученного результата.
я попробовала что-то написать, но моя программа работает неправильно ..
#include<stdio.h>
#include<conio.h>
int main(){
clrscr();
float M[100][100],O[100][100],E[100][100];
int i,j,k,N;
printf("N=");
scanf("%d",&N);
for(i=0;i<N;i++)
for(j=0;j<N;j++){
printf("N[%d][%d]=",i,j);
scanf("%f",&M[i][j]);}
printf("--------------\n");
printf("Matrix:\n");
for(i=0;i<N;i++){
for(j=0;j<N;j++)
printf("%5.1f",M[i][j]);
printf("\n");}
for(k=0;k<N;k++){
for(i=0;i<N;i++)
for(j=0;j<N;j++){
if(i==k&&j==k)
O[i][j]=1/M[k][k];
if(i!=k&&j==k)
O[i][j]=-M[i][j]/M[k][k];
if(i!=k&&j!=k)
O[i][j]=M[i][j]-M[k][j]*M[i][k]/M[k][k];}
for(i=0;i<N;i++)
for(j=0;j<N;j++)
M[i][j]=O[i][j];}
for(i=0;i<N;i++){
for(j=0;j<N;j++)
E[i][j]=0;}
for(i=0;i<N;i++){
for(j=0;j<N;j++){
for(k=0;k<N;k++)
E[i][j]+=M[i][k] *O[k][j];}}
printf("\n Obernena matrucia\n");
for(i=0;i<N;i++){
for(j=0;j<N;j++)
printf("%10.1f",M[i][j]);
printf("\n");}
printf("-----------------\n");
printf("M*O=E\n");
for(i=0;i<N;i++){
for(j=0;j<N;j++)
printf("%10.1f",E[i][j]);
printf("\n");}

getch();
return 0;
}

помогите пожалуйста .. я не знаю что делать, а скоро нужно сдавать .. ((

Последний раз редактировалось nat@; 17.04.2012 в 16:53. Причина: забыла указать язык
nat@ вне форума Ответить с цитированием
Старый 17.04.2012, 17:31   #2
denisbrain
Форумчанин
 
Регистрация: 29.05.2011
Сообщений: 449
По умолчанию

напиши алгоритм нахождения обратной матрицы
словами или мат формулами по действиям
задания на pascal/delphi ICQ 368254335
Tel +79177425326 mail denis-naymov1985(at)mail.ru login skype denis.new.skype
denisbrain вне форума Ответить с цитированием
Старый 17.04.2012, 17:36   #3
nat@
 
Аватар для nat@
 
Регистрация: 13.12.2011
Сообщений: 7
По умолчанию

Возьмём две матрицы: саму A и единичную E. Приведём матрицу A к единичной матрице методом Гаусса—Жордана. После применения каждой операции к первой матрице применим ту же операцию ко второй. Когда приведение первой матрицы к единичному виду будет завершено, вторая матрица окажется равной A-1.
nat@ вне форума Ответить с цитированием
Старый 17.04.2012, 17:48   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

nat@, это конечно алгоритм, но denisbrain, как мне кажется, хотел более развернутого ответа. Например, как работает метод Гаусса—Жордана?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.04.2012, 17:49   #5
denisbrain
Форумчанин
 
Регистрация: 29.05.2011
Сообщений: 449
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
nat@, это конечно алгоритм, но denisbrain, как мне кажется, хотел более развернутого ответа. Например, как работает метод Гаусса—Жордана?
да точно
как работает метод
Гаусса—Жордана. точно по пунктам
задания на pascal/delphi ICQ 368254335
Tel +79177425326 mail denis-naymov1985(at)mail.ru login skype denis.new.skype
denisbrain вне форума Ответить с цитированием
Старый 17.04.2012, 17:57   #6
nat@
 
Аватар для nat@
 
Регистрация: 13.12.2011
Сообщений: 7
По умолчанию

берем матрицу А, любого размера и берем единичную матрицу Е такого же размера нужно свести заданную матрицу А к единичной при том все действия (элементарные преобразования) выполняемых ИЗ А нужно выполнять также с единичной матрицей Е. Когда А будет сведена к единичной, Е будет обращенной к А.
Надеюсь, это то о чем вы спрашивали ..
nat@ вне форума Ответить с цитированием
Старый 17.04.2012, 18:04   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

nat@, да, это формально то, о чем я спрашивал. Но это интуитивный алгоритм, который легко (для большинства людей) выполняется человеком. Такой алгоритм не подходит для компьютера
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.04.2012, 18:19   #8
nat@
 
Аватар для nat@
 
Регистрация: 13.12.2011
Сообщений: 7
По умолчанию

это алгоритм для матрицы, элементы которой являются нули и единицы, а мне нужно чтобы были действительные числа ..
#include< stdio.h>
#include<conio.h>
#define N 5
void main(){
int i,j,k;
int Ai[N][N]={{0,1,0,1,0},{1,0,0,0,0},{1,1,1,0, 1},{1,1,0,1,1},{1,1,0,0,0}};
int A[N][2*N];
for (i=0;i<N;i++)
for(j=0;j<N;j++)
A[i][j]=Ai[i][j];
for (i=0;i<N;i++)
for(j=0;j<2*N;j++)
{
if(i+N==j)
A[i][j]=1;
else
A[i][j]=0;}
for (i=0;i<N;i++)
{if(A[i][i]==0)
for(j=i+1;j<N;j++)
{if(A[j][i]==1){
for(k=0;k<2*N;k++)
{int c=A[j][k];
A[j][k]=A[i][k];
A[i][k]=c;}
break;
}}
for(k=i+1;k<N;k++)
{if(A[k][i]==1){
for(j=0;j<2*N;j++){
for(j=0;j<2*N;j++)
{A[k][j]^=A[i][j];
}}}}
for(i=N-1;i>=0;i--)
{for(k=i-1;k>=0;k--){
if(A[k][i]==1){
for(j=0;j<2*N;j++)
A[k][j]^=A[i][j];
}}}
я знаю, что я плохой программист .. ((
nat@ вне форума Ответить с цитированием
Старый 17.04.2012, 19:31   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Вот. Вроде даже работает
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 3 //размер матрицы
#define E 0.000001

double a[N][2*N];

void
mover(double *a,int to,int from,int n)
{
    double tmp[2*n];
    int i;
    memcpy(tmp,(a+2*from*n),2*sizeof(double)*n);
    for(i=from; i>to; i--)
        memcpy((a+2*i*n),(a+2*(i-1)*n),2*sizeof(double)*n);
    memcpy((a+2*to*n),tmp,2*sizeof(double)*n);
}

void
adder(double *a,int to,int from,int n)
{
    double d=*(a+2*to*n+from)/(*(a+2*from*n+from));
    int i;
    for (i=0; i<2*n; i++)
        *(a+2*to*n+i)-=(*(a+2*from*n+i))*d;
}

void
printmatrix(double *a, int n)
{
    int i,j;
    for(i=0; i<N; i++)
    {
        for (j=0; j<n; j++)
            printf("%3.1lf  ",*(a+2*n*i+j));
        putchar('\n');
    }
}

void
printtranspmatrix(double *a, int n)
{
    int i,j;
    for(i=0; i<N; i++)
    {
        for (j=0; j<n; j++)
            printf("%3.1lf  ",*(a+2*n*i+j+n));
        putchar('\n');
    }
}

int
main(void)
{
    int i,j,q;
    for (i=0; i<N; i++)
        a[i][N+i]=1;

    for(i=0; i<N; i++)//этот цикл заполняет матрицу, вместо него можно ввод
    {
        for (j=0; j<N; j++)
            a[i][j]=(1+j+i*N) % 5;
    }

    printf("Source matrix:\n");
    printmatrix(a,N);

    for (i=0; i<N; i++)
    {
        j=i;
        while((fabs(a[j][i])<E)&&(j<N))
            j++;
        if (j==N)
        {
            printf("Matrix does not have the inverse matrix");
            return 0;
        }
        if (j!=i)
            mover(a,i,j,N);
        for (q=2*N-1; q>=i; q--)
            a[i][q]/=a[i][i];
        for (q=i+1; q<N; q++)
            adder(a,q,i,N);
    }

    for (i=N-1; i>=0; i--)
    {
        for (q=2*N-1; q>=i; q--)
            a[i][q]/=a[i][i];
        for (q=i-1; q>=0; q--)
            adder(a,q,i,N);
    }

    printf("\nThe inverse matrix:\n");
    printtranspmatrix(a,N);
    return 0;
}
[offtop]Рад, что мой 400-ый пост получился таким большим[/offtop]
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 17.04.2012 в 19:33.
BDA вне форума Ответить с цитированием
Старый 17.04.2012, 19:36   #10
nat@
 
Аватар для nat@
 
Регистрация: 13.12.2011
Сообщений: 7
По умолчанию

Очень Вам благодарна))
nat@ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обратная матрица ivan.tiran Паскаль, Turbo Pascal, PascalABC.NET 1 04.10.2011 13:43
Обратная матрица kati412 Помощь студентам 0 09.04.2011 18:29
Обратная матрица на VB Vitek.i Помощь студентам 1 21.01.2011 19:34
обратная матрица LastBreath Помощь студентам 1 04.06.2010 20:30
Обратная матрица Artemm Общие вопросы C/C++ 6 26.05.2009 17:55