Рисунок 1 - Блок-схема процедуры ввода данных
Блок-схема метода Жордана
Рисунок 2 - Блок-схема метода Жордана
Алгоритм основной программы
Рисунок 3 - Тело основной программы
ТЕКСТ ПРОГРАММЫ И РЕЗУЛЬТАТ ВЫПОЛНЕНИЯ
Текст программы
#include<stdio.h>
float a[100][100], a_temp[100][100], nev[100], x[100];
intn,where[100];
// Процедура ввода данных
void input() {
inti, j;
FILE * fin = fopen("input.txt", "r"); // Открываем файл для ввода данных
fscanf(fin, "%d", &n); // Ввод размера матрицы
for (i = 0; i< n; i++) {
for (j = 0; j < n + 1; j++) {
fscanf(fin, "%f", &a[i][j]); // Ввод матрицы A и последний элемент - свободный коэффициент
}
}
}
// Процедура вычисления корней
intjordan_gauss() {
inti, j, k, col, row;
for (i = 0; i< n; i++) {
where[i] = -1; // Инициализируеммассив where
for (j = 0; j <= n; j++) a_temp[i][j] = a[i][j]; // Икопируемматрицу
}
for (col = 0,row = 0; col< n &&row< n; col++) { // Цикл, в котором будем выполнять все преобразования
intsel = row; // Выбираем очередную строку
for (i = row; i < n; i++) // Цикл по всем строкам ниже
if (fabs(a[i][col]) >fabs(a[sel][col])) sel = i; // Выбираем максимальный элемент на позиции col среди всех строк
if (fabs(a[sel][col]) < 1e-5) continue; // Если максимальный элемент равен 0, то переходим к следующей итерации
for (i = col; i <= n; i++) { // Цикл по всем оставшимся столбцам
float t = a[sel][i]; // Меняем элементы стркоsel и row в этих столбцах
a[sel][i] = a[row][i];
a[row][i] = t;
}
where[col] = row; // Для столбца colсоохраняем номер строки, в которой он был преобразован
for (i = 0; i < n; i++) // Цикл по всем строкам
if (i!= row) { // выбираем только строки, которые не row
float c = a[i][col] / a[row][col]; // Вычисляемкоэффициент
for (j = col; j <= n; j++) // И все элементы строки начиная от col заменяем на новое значение, чтобы появились 0
a[i][j] -= a[row][j] * c;
}
row++; // Переходим к следующей строке
}
for (i = 0; i< n; i++)
if (where[i]!= -1)
x[i] = a[where[i]][n] / a[where[i]][i]; // Вычисляемответы
for (i = 0; i < n; i++) { // Делаем проверку, подходит ли это решение
floatsum = 0; // набранная сумма
for (j = 0; j < n; j++) // Цикл по всем найденным иксам
sum += x[j] * a[i][j]; // Подставляем значение в формулу
if (fabs(sum - a[i][n]) > 1e-5) return 0; // Если разница между полученным значением и действительным больше заданной точности, то решение не подходит
}
for (i = 0; i < n; i++)
if (where[i] == -1) return 2; // Если какой-то столбец не задействован, то есть он нулевой, то имеется множество решений
return 1;
}
// Тело основной программы. Вызываются нужные методы и выводятся данные
void main() {
input();
inti, j;
int verdict = jordan_gauss(); // ВызовметодаЖордана-Гаусса
printf("Initial system: \n");
for (i = 0; i< n; i++) {
for (j = 0; j <= n; j++) printf("%.2f\t", a_temp[i][j]); // Выводисходнойсистемы
printf("\n");
}
if (verdict == 0) { // Из функции пришел 0 - нет решения
printf("Noroots\n");
} elseif (verdict == 1) { // из функции пришел 1 - единственное решение
printf("Found roots: \n");
for (i = 0; i< n; i++) printf("x[%d] = %.4f\n", i + 1, x[i]); // Выводимкорни
printf("Error vector: \n");
for (i = n - 1; i>= 0; i--) { // Считаемошибку
float err = a_temp[i][n];
for (j = 0; j < n; j++) err -= a_temp[i][j] * x[j];
printf("%f\t", err);
}
} else { // Иначе - многорешений
printf("Infinite number of solutions\n");
}
}
Результат выполнения
Рисунок 4 - Результат выполнения на тесте №1
Рисунок 5 - Результат выполнения на тесте №2
ЗАКЛЮЧЕНИЕ
В ходе выполнения курсового проекта была разработана программа на языке С для решения линейных уравнений n-ного порядка методом Жордана и выполняющая проверку решения, если оно найдено. Была сформулирована математическая формализация задачи. Также была составлена блок-схема алгоритма.