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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2010, 12:39   #1
iScream
 
Регистрация: 17.03.2010
Сообщений: 4
Печаль Система уравнений. С++

Вообщем, ребят, такая проблема. Учусь на заочном отделении технического вуза. Специальность, ну, никаким образом не связана с программированием, но, как посчитали люди, составляющие программу обучения, для общего развития надо знать поверхностно С++ (боже мой, какой бред). Главное сделать, сдавать - да, каким-нибуддь образом сдам. Так как моё знание компьютера ограничивается поверхностным знанием МС оффис и не вылазит за пределы обновления антивируса ^^, хочу обратиться к вам за помощью. Задача состоит в следующем:
Решить систему уравнений с помощью обратной матрицы:

Работа выполняется на языке С в интегрированной среде Borland C++ (вер. 3.1) или как консольное приложение в среде Borland C++ Builder (вер. 5 или 6). Преподаватель сказал, что в среде Borland C++ Builder проще сделать...
Буду очень признателен всем, кто протянет руку помощи.
iScream вне форума Ответить с цитированием
Старый 17.03.2010, 15:47   #2
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Код:
#include <stdio.h>

#define N 3    // Размерность матрицы

/*
 *    Определитель м-цы 2x2
 */
double GetDet2( double x[][2] ) {

   return x[0][0]*x[1][1]-x[0][1]*x[1][0];

}


/*
 * Вычисление алгебраического дополнения к эл-ту a[i0][j0]
 */
double GetAlgDop( double a[][N], int i0, int j0 ) {

   int i, iDop, j, jDop;
   double aDop[N-1][N-1];

   iDop = 0;
   for (i = 0; i < N; i++ ) {
      if ( i == i0 )
         continue;      // Пропускаем строку i0
      jDop = 0;
      for ( j = 0; j < N; j++ ) {
         if ( j == j0 )
            continue;   // Пропускаем столбец j0
         aDop[iDop][jDop] = a[i][j];
         ++jDop;
      }
      ++iDop;
   }

   if ( (i0+j0) % 2 == 0 )
      return GetDet2( aDop );
   else
      return -GetDet2( aDop );

}



/*
 * Печать матрицы n x m
 */
void PrintMatrix( double* x, // Адрес первого эл-та м-цы, которую нужно распечатать
                  int n,     // К-во строк в м-це, 
                  int m      // К-во столбцов
                 ) {

   int i;

   for (i = 0; i < n*m; i++ ) {
      printf( "%6.1g", x[i] );
      if ( (i+1) % m == 0 )
         printf( "\n" );
   }

}


int main() {

   int      i, j;
   double   a[N][N] = {1.,  2.,  1.,
                       3., -5.,  3.,
                       2.,  7., -1. };
   double   aM1[N][N];  // Обратная матрица
   double   x[N];       // Решение
   double   b[N] = {4., 1., 8.}; // Свободные члены
   double   det = 0;             // Определитель исх. м-цы

   // Исходная матрица
   printf( "Исходная м-ца:\n" );
   PrintMatrix( &a[0][0], N, N );

   // Столбец свободных членов
   printf( "Столбец свободных членов:\n" );
   PrintMatrix( &b[0], N, 1 );

   // Определитель
   for ( j = 0; j < N; j++ )
      det = det + a[0][j]*GetAlgDop( a, 0, j );
   printf( "Det = %6.1g\n", det );

   // Обратная м-ца
   for ( i = 0; i < N; i++ )
      for ( j = 0; j < N; j++ ) 
         // Сразу и транспонируем
         aM1[j][i] = GetAlgDop( a, i, j ) / det;

   printf( "Обратная м-ца:\n" );
   PrintMatrix( &aM1[0][0], N, N );

   // Решение
   for ( i = 0; i < N; i++ ) {
      x[i] = 0.;
      for ( j = 0; j < N; j++ ) 
         x[i] = x[i] + aM1[i][j] * b[j];
   }

   printf( "Решение:\n" );
   PrintMatrix( &x[0], N, 1 );
   printf( "\n" );

   return 0;

}
1. "Плюсы" (да даже и просто C) заочникам - это сурово, конечно...

2. Программа "заточена" под м-цу именно 3x3, никакой универсальности при декомпозиции в ходе вычисления определителя тут нет, думаю от вас её и не ждут

3. Лежащая в основе несложная математика легко доступна в книгах и в интернете, поэтому подробных комментариев я тоже не делал. Будет что-то непонятно - спрашивайте.

4. От работы на C-spoken Pascal'е, Бог миловал, но любителей этого пакета тут полно, поэтому шаги по созданию борландовского проекта, народ, надеюсь, если нужно, подскажет.

Added 14:05 CET
5. Да, матрицу на вырожденность я тоже не проверял... Добавьте тогда, если хотите, после печати определителя:
Код:
   if ( det == 0. ) {
      printf( "Вырожденная матрица к-тов!\n" );
      return -1;
   }

Последний раз редактировалось Vago; 17.03.2010 в 16:05.
Vago вне форума Ответить с цитированием
Старый 17.03.2010, 17:32   #3
iScream
 
Регистрация: 17.03.2010
Сообщений: 4
По умолчанию

Я даже и не знаю, как Вас отблагодарить. Огромное, Вам, человеческое СПАСИБО!!!
iScream вне форума Ответить с цитированием
Старый 17.03.2010, 17:53   #4
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию



Удачи при сдаче!
Vago вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
система уравнений ioda1986 Помощь студентам 1 23.02.2010 20:42
Система обыкновенных дифференциальных уравнений Anarki Помощь студентам 1 05.11.2009 00:19
Метод наименьших квадратов. Система линейных уравнений. Jarik Microsoft Office Excel 1 18.08.2009 12:53
Графка, система уравнений Sarumjan Помощь студентам 2 23.04.2009 02:09
паскаль система линейных уравнений student77rus Помощь студентам 1 19.11.2008 21:48