Решение системы линейных алгебраических уравнений методом Гаусса

Ненулевой минор максимального порядка. Рассмотрение решения системы линейных алгебраических уравнений методом Гаусса. Использование метода последовательного исключения переменных. Порядок создания массива под матрицу с помощью программного языка C++.

Рубрика Программирование, компьютеры и кибернетика
Вид практическая работа
Язык русский
Дата добавления 25.12.2015
Размер файла 130,2 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Министерство образования и науки Российской Федерации

Федеральное государственное бюджетное образовательное

учреждение высшего профессионального образования

ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)

Кафедра экономической математики информатики и статистики (ЭМИС)

Отчет по практической работе №4

по дисциплине «Моделирование систем»

Студент группы 542:

Лошакова Н.Ю.

Преподаватель:

Зариковская Н.В.

Томск 2015

1. Постановка задачи

Решение системы линейных алгебраических уравнений методом Гаусса.

2. Краткая теория

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

Метод Гаусса - классический метод решения системы линейных алгебраических уравнений (СЛАУ). Это метод последовательного исключения переменных, когда с помощью элементарных преобразований система уравнений приводится к равносильной системе ступенчатого (или треугольного) вида, из которого последовательно, начиная с последних (по номеру) переменных, находятся все остальные переменные.

Пусть исходная система выглядит следующим образом

Матрица  называется основной матрицей системы,  -- столбцом свободных членов.

Тогда, согласно свойству элементарных преобразований над строками, основную матрицу этой системы можно привести к ступенчатому виду (эти же преобразования нужно применять к столбцу свободных членов):

При этом будем считать, что базисный минор (ненулевой минор максимального порядка) основной матрицы находится в верхнем левом углу, то есть в него входят только коэффициенты при переменных .

Тогда переменные  называются главными переменными. Все остальные называются свободными.

Если хотя бы одно число , где , то рассматриваемая система несовместна, т.е. у неё нет ни одного решения.

Пусть  для любых .

Перенесём свободные переменные за знаки равенств и поделим каждое из уравнений системы на свой коэффициент при самом левом  (, где  -- номер строки):

где

Если свободным переменным системы (2) придавать все возможные значения и решать новую систему относительно главных неизвестных снизу вверх (то есть от нижнего уравнения к верхнему), то мы получим все решения этой СЛАУ. Так как эта система получена путём элементарных преобразований над исходной системой (1), то по теореме об эквивалентности при элементарных преобразованиях системы (1) и (2) эквивалентны, то есть множества их решений совпадают.

3. Алгоритм

1. Подключили библиотеки, необходимые в данной программе (stdio.h,math.h,conio.h).

2. Создаем массив под матрицу и инициализируем ее.

3. Приводим матрицу к верхнетреугольному виду (прямой ход).

4. Делаем обратный и выводим решения на экран.

4. Результат

Результат работы программы представлен на рисунке 1.

Рисунок 1 результат работы программы

гаусс линейных алгебраический программный

В данной практической работе мы решили СЛАУ методом Гаусса.

Приложение А

Код программы

#include <stdio.h>

#include <math.h>

#include <stdlib.h>

#include <locale.h>

void vyvod(int,int *, float *, float *);

void forward(int, int *, float *, float *);

void f_add(int, int *, float*, float *);

void nevyazka(int, float *, float *, int *, float *);

int main()

{

setlocale(LC_ALL,"Russian");

int a, i, j, size;

float *mas, *mas_2, *mas_pogr, *mas_2pogr;

int *mas_in;

printf("Введите размер матрицы : ");

scanf_s("%d",&a);

size=a*a;

mas=new float [size];

mas_2=new float [a];

mas_in=new int [a];

for(i=0;i<a;i++)

mas_in[i]=i;

printf("Введите коэффициенты матрицы\n");

for (j=0;j<size;j++)

{

scanf_s("%f",&mas[j]);

}

printf("Введите вектор b\n");

for (j=0;j<a;j++)

{

scanf_s("%f",&mas_2[j]);

}

printf("\n\n");

forward(a, mas_in, mas, mas_2);

delete mas;

delete mas_2;

delete mas_in;

return 0;

}

void vyvod(int a,int *mas_in, float *mas, float *mas_2)

{

int i,j,c;

c=0;

for(i=0;i<a;i++)

{

for(j=0;j<a;j++)

{

printf("%.2f ", mas[a*mas_in[i]+j]);

c++;

}

printf("| %.2f",mas_2[mas_in[i]]);

printf("\n");

}

printf("\n\n\n");

}

void forward(int a, int *mas_in, float *mas, float *mas_2)

{

int s, i, j, index, korni , flag=1, temp_1;

float temp,*mas_pogr,*mas_2pogr;

mas_pogr=new float[a*a];

mas_2pogr=new float[a];

for (j=0;j<a;j++)

{

for (i=0;i<a;i++)

{

mas_pogr[a*j+i]=mas[a*j+i];

}

mas_2pogr[j]=mas_2[j];

}

//основной цикл

for (s=0; s<a; s++)

{

if (mas[a*mas_in[s]+s]==0)

{

for (i = s+1; i<a; i++)

{

if (mas[a*mas_in[i]+s])

{

temp = mas_in[s];

mas_in [s] = mas_in[i];

mas_in[i] = temp;

break;

}

}

}

if (mas[a*mas_in[s]+s]!=0)

{

mas_2[mas_in[s]]=mas_2[mas_in[s]]/mas[a*mas_in[s]+s];

for (i=a-1; i>=s; i--)

mas[a*mas_in[s]+i]=mas[a*mas_in[s]+i]/mas[a*mas_in[s]+s];

for(i=1+s; i<a; i++)

{

if (mas[a*mas_in[i]+s]!=0)

{

mas_2[mas_in[i]]=mas_2[mas_in[i]]+ mas_2[mas_in[s]]*(-mas[a*mas_in[i]+s]);

for(j=a-1; j>=s;j--)

{

mas[a*mas_in[i]+j]=mas[a*mas_in[i]+j]+mas[a*mas_in[s]+j]*(-mas[a*mas_in[i]+s]);

}

}

}

}

}

vyvod(a,mas_in, mas, mas_2);printf("\n");

f_add(a, mas_in, mas, mas_2);

vyvod(a, mas_in,mas, mas_2);

index=a;korni=0;

for (i=a-1;i>=0;i--)

{

flag=1;

for (j=0;j<a;j++)

{

if (mas[a*mas_in[i]+j]!=0)

{

flag=0;

break;

}

}

if(flag==1)

{

if (mas_2[mas_in[i]]==0)

{

index--;

}

else

{

printf("Решений нет!\n");

korni=1;

break;

}

}

}

if (korni==0)

{

if (index==a)

{

for (i=0; i<a; i++)

{

printf("X_%d= %.2f ",i+1, mas_2[mas_in[i]]);

printf("\n");

}

printf("\n\n");

nevyazka(a,mas_pogr,mas_2,mas_in,mas_2pogr);

}

else

printf ("Решений бесконечно много!\n");

}

}

void f_add(int a, int *mas_in, float *mas, float *mas_3)

{

int s, i, j;

for (s=a-1; s>0; s--)

{

for (i=s-1; i>=0; i--)

{

mas_3[mas_in[i]]=mas_3[mas_in[i]]+(-1)*mas[a*mas_in[i]+s]*mas_3[mas_in[s]];

for (j=a-1;j >= i; j--)

{

mas[a*mas_in[i]+j]=mas[a*mas_in[i]+j]+(-1)*mas[a*mas_in[s]+j]*mas[a*mas_in[i]+s];

}

}

}

}

void nevyazka(int a, float *mas_pogr, float *mas_3, int *mas_in, float *mas_2pogr)

{

int i,j;

long double pogresh=0;

for(i=0;i<a;i++)

{

for(j=0;j<a;j++)

{

pogresh=mas_pogr[a*mas_in[i] + j]*mas_3[mas_in[j]]+pogresh;

}

pogresh=pogresh-mas_2pogr[mas_in[i]];

printf(" e%d = %e\n", i+1, pogresh);

pogresh=0;

}

}

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.