51353
Решение системы линейных уравнений методом Гаусса
Лабораторная работа
Информатика, кибернетика и программирование
Руководство программиста Описание структуры программы Функции PHod осуществляет прямой ход; OHod осуществляет обратный ход; Описание структур данных Описание глобальных переменных использующихся в программе: int n размер матрицы; flot rr массив в котором хрантся элементы матрицы; flot ms копия масива rr; flot x массив решений системы уравнений; FILE file файл из которого берется матрица; FILE file2 файл в который записываются результаты; Описание алгоритмов Метод Гаусса для решения системы линейных...
Русский
2014-02-10
158 KB
15 чел.
Федеральное агентство по образованию Российской Федерации
Государственное образовательное учреждение
высшего профессионального образования
Нижегородский государственный университет им. Н.И. Лобачевского
Факультет вычислительной математики и кибернетики
Отчёт по лабораторной работе
Выполнил:
студент ф-та ВМК гр. 81-05
Ляшук Д.А.
Проверил:
ассистент каф. МО ЭВМ, ВМК
Кукаева С.А.
Нижний Новгород
2013 г.
Содержание
[1] Решение системы линейных уравнений методом Гаусса [2] Введение [3] Постановка задачи [4] Руководство пользователя
[5] [5.1] Описание структур данных [5.2] Описание алгоритмов
[6] [7] Приложения [7.1] Приложение 1 |
Метод Гаусса классический метод решения системы линейных алгебраических уравнений. Это метод последовательного исключения переменных, когда с помощью элементарных преобразований система уравнений приводится к равносильной системе ступенчатого (или треугольного) вида, из которой последовательно, начиная с последних (по номеру) переменных, находятся все остальные переменные.
Пусть исходная система выглядит следующим образом
Матрица называется основной матрицей системы, столбцом свободных членов.
Тогда согласно свойству элементарных преобразований над строками основную матрицу этой системы можно привести к ступенчатому виду (эти же преобразования нужно применять к столбцу свободных членов):
При выполнении лабораторной работы необходимо разработать программный комплекс для поиска методом Гаусса решений систем линейных уравнений вида
A*x = b,
где А - числовая не особая (т.е. имеющая не равный нулю детерминант) квадратная матрица размером N на N, b - числовой вектор-столбец размером N, а x - искомый вектор-столбец размером N. Программный комплекс должен обеспечивать:
задание пользователем исходной системы уравнений в текстовом файле;
решение полученной системы уравнений методом Гаусса;
экранное отображение формирующейся системы уравнений, результата, а так же запись результатов в текстовый файл.
Для работы с программой пользователю необходимо ввести значения элементов матрицы в файл inp.txt. Причем матрица в файле должна быть записана следующим образом первое число должно означать размер матрицы, а далее со следующей строки записана сама матрица, элементы которой разделены пробелом. Затем запустить программу.
Файл inp.txt.
Работа программы.
Результаты вычислений записываются в файл out.txt.
Описание структуры программы
Функции
PHod осуществляет прямой ход;
OHod осуществляет обратный ход;
Описание глобальных переменных, использующихся в программе:
int n размер матрицы;
float** arr массив, в котором хрантся элементы матрицы;
float** mas копия масива arr;
float* x массив решений системы уравнений;
FILE* file файл, из которого берется матрица;
FILE* file2 файл в который записываются результаты;
Метод Гаусса для решения системы линейных уравнений состоит в приведении матрицы А посредством эквивалентных преобразований (не меняющих решение системы [12]) к треугольному виду и последующему поиску решений для вновь полученной матрицы. Краткая схема первой части метода Гаусса - прямого хода - состоит в следующем.
Алгоритм прямого хода.
Выбор главного элемента. Полагается R:=A[I, I]. Если R=0, то реализуется поиск главного элемента.
Преобразование текущей строки матрицы путем деления всех значений ее элементов на главный элемент. В цикле по переменной J от I до N+1 выполняются вычисления
A[I, J]:= A[I, J] / R.
Вычитание текущей строки из всех ниже расположенных строк с занулением I - ого элемента в каждой из них. В цикле по K от I + 1 до N выполняются Шаг 5 - Шаг 6.
Полагается m:= A[K, I].
Вычитание из очередной строки текущей строки. В цикле по J от I до N+1 делаем A[K, J]:= A[K, J] - A[I, J]* m.
Конец алгоритма.
Алгоритм обратного хода.
Задается начальное значение элемента x[I].
x[I]:=A[I,N] .
Корректируется искомое значение x[I]. В цикле по J от N-1 до I+1 (в случае, когда I=N, этот шаг не выполняется) производятся вычисления x[I]:= x[I] - x[J]* A[I, J].
Конец алгоритма.
Поиск главного элемента
В данной программе реализован метод гаусса, с помощью которого решаются системы линейных уравнений. В ней реализован прямой ход, где считается сначала верхняя треугольная матрица, и обратный ход, где находятся решения уравнений.
Исходный код программы
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<Windows.h>
void phod(float**,int);
void ohod(float**, float*, int);
int main()
{
int n,i,j;
float** arr;
float** mas;
float* x;
FILE* file;
FILE* file2;
{
file=fopen("inp.txt","r+");
fscanf(file,"%d\n",&n);
}
x=(float*)malloc(n*sizeof(float));
arr=(float**)malloc(n*sizeof(float*));
for(i=0; i<n; ++i)
{
arr[i]=(float*)malloc(n*sizeof(float));
}
mas=(float**)malloc(n*sizeof(float*));
for(i=0; i<n; ++i)
{
mas[i]=(float*)malloc(n*sizeof(float));
}
for(i=0; i<n; ++i)
{
for(j=0; j<n+1; ++j)
{
fscanf(file,"%f ",&arr[i][j]);
mas[i][j]=arr[i][j];
}
}
//вывод массива
for(i=0; i<n; ++i)
{
for(j=0; j<n+1; ++j)
{
printf("%.3f ", arr[i][j]);
}
printf("\n");
}
printf("\n");
//прямой ход
phod(arr,n);
//зануляем массив x
for(i=0; i<n+1; ++i)
{
x[i]=0;
}
//обратный ход
ohod(arr,x,n);
for(i=0; i<n; ++i)
{
printf("\n x%d=%.4f ",i+1,x[i]);
}
//запись результатов в файл
file2=fopen("out.txt","w");
for(i=0; i<n; ++i)
{
fprintf(file2,"x%d=%.4f ",i+1,x[i]);
}
fprintf(file2,"\n\n");
fclose(file2);
{
return 0;
}
}
//прямой ход
void phod(float** arr,int n)
{
int i,j,k,l;
float r,m;
float h;
for(i=0; i<n; ++i)
{
if (arr[i][i]==0)
{
for(l=i+1; l<n; ++l)
{
if (arr[l][i]!=0)
{
for(j=0; j<n+1; ++j)
{
h=arr[l][j];
arr[l][j]=arr[i][j];
arr[i][j]=h;
}
}
}
}
r=(arr[i][i]);
for(j=0; j<n+1; ++j)
{
(arr[i][j])= (arr[i][j])/r;
}
for(k=i+1; k<n; ++k)
{
m=arr[k][i];
for(j=i; j<n+1; ++j)
{
arr[k][j]= arr[k][j]- arr[i][j]*m;
}
}
}
// вывод прямого хода
for(i=0; i<n; ++i)
{
for(j=0; j<n+1; ++j)
{
printf("%.3f ", arr[i][j]);
}
printf("\n");
}
}
//обратный ход
void ohod(float** arr, float* x, int n)
{
int i,j;
float c;
for(i=n-1; i>=0; --i)
{
c=arr[i][n];
x[i]=c;
for(j=n-1; j>i; j--)
{
x[i]=x[i]-x[j]*arr[i][j];
}
}
system("pause");
}