- •Студенты
- •1. Содержание
- •2. Постановка задачи
- •3. Методы решения систем линейных алгебраических уравнений
- •Метод Гаусса
- •3.1.1 Условия применимости метода Гаусса
- •3.1.2 Обоснование и вывод формул
- •Теоремы с доказательствами Теорема об lu-разложении
- •Следствие
- •Элементарные треугольные матрицы
- •3.1.4 Алгоритм метода Гаусса
- •Метод простой итерации
- •3.2.1 Условия применимости метода простой итерации
- •3.2.3 Алгоритм метода простой итерации
- •Метод Зейделя
- •3.3.1 Обоснование и вывод формул
- •3.3.2 Условия применимости метода Зейделя
- •3.3.3 Приведение системы к виду, удобному для итераций
- •3.3.4 Алгоритм метода Зейделя
- •Метод Крамера
- •3.4.1 Условия применимости метода Крамера
- •Метод главных элементов
- •3.5.1 Условия применимости метода главных элементов.
- •3.5.2 Обоснование и вывод формул
- •Метод квадратных корней
- •3.6.1 Обоснование и вывод формул
- •3.6.2 Условие применимости метода квадратных корней
- •3.7.1 Условия применимости схемы Халецкого
- •3.7.2 Обоснование и вывод формул
- •Теория погрешностей
- •3.8.1 Источники и классификация погрешностей результата
- •3.8.2 Типы погрешностей
- •Проверка ручного счета средствами Excel
- •Метод Крамера
- •Метод простой итерации
- •Метод Зейделя
- •Метод Гаусса с выбором главного элемента
- •Метод квадратных корней
- •Язык Fortran
- •Метод Гаусса
- •Метод простых итераций
- •Метод Зейделя
- •Результаты и их анализ
- •Список использованной литературы
Метод Крамера
Таблица идентификаторов
В таблице 2 приведены основные идентификаторы, используемые в программе, реализующей метод Крамера на языке С++.
Таблица 2 – Идентификаторы для метода Крамера
A |
Исходная матрица коэффициентов СЛАУ |
matrix |
Промежуточная матрица коэффициентов, необходимая для подсчета опеределителей |
result |
Матрица коэффициентов решения |
det |
Определитель исходной СЛАУ |
agreed |
Флаг отличия определителя от 0 |
factor, temp, counter, sum |
Переменные, необходимые для сохранения промежуточных результатов подсчета определителя |
Код программы:
#include <iostream> #include <math.h> using namespace std; ons tint nMax = 100; int n = 0; double A[nMax][nMax + 1]; double result[nMax]; bool agreed = false; double factor; double e = 0.0001; double matrix[nMax][nMax]; double temp, sum, counter, det; int I, j, k, m; double Det() { counter = 0; for(I = 0; I < n – 1; i++) { if(matrix[i][i] == 0) { for(j = I + 1; j < n && matrix[i][i] == 0; j++) { if(matrix[j][i] != 0) { for(k = 0; k < n + 1; k++) { temp = matrix[i][k]; matrix[i][k] = matrix[j][k]; matrix[j][k] = temp; counter++; } } } } for(j = I + 1; j < n; j++) { factor = -(matrix[j][i]/matrix[i][i]); for(k = 0; k < n + 1; k++) { matrix[j][k] += matrix[i][k]*factor; } } } sum = matrix[0][0]; for(I = 1; I < n; i++) { sum *= matrix[i][i]; } return pow(-1, counter)*sum; } double startdDet() { for(I = 0; I < n; i++) { for(j = 0; j < n; j++) { matrix[i][j] = A[i][j]; } } return Det(); } double modDet(int num) { for(I = 0; I < n; i++) { for(j = 0; j < n; j++) { if(j != num) { matrix[i][j] = A[i][j]; } else { matrix[i][j] = A[i][n]; } } } return Det(); } void Cramer() { det = startdDet(); if(det == 0) { cout <<”determinant is 0.”<< endl; agreed = false; } else { for(m = 0; m < n; m++) { result[m] = modDet(m)/det; } cout << endl; agreed = true; } } int main() { do { cout <<”Enter number of equations (1 – 100): “; cin >> n; } while(n < 1 || n > 100); cout <<”--------------------------“<< endl; for(I = 0; I < n; i++) { for(j = 0; j < n; j++) { cout <<”Input a(“<< I + 1<<’,’<< j + 1 <<”): “; cin >> A[i][j]; } cout <<”Input b(“<< I + 1 <<”): “; cin >> A[i][n]; } Cramer(); cout <<”--------------------------“<< endl; if(agreed) { for(I = 0; I < n; i++) { cout <<”X(“<< I + 1 <<”) = “<< result[i] << endl; } } else { cout <<”impossible to solve the system of linear equations with this method.”<< endl; } cout << endl; system (“pause”); return 1; }
Пример работы программы:
Рисунок 2.5 – окно с результатом работы программы, реализующей метод Крамера на языке С/С++ (Король)
Рисунок 2.6 – окно с результатом работы программы, реализующей метод Крамера на языке С/С++ (Скворцова)
На рисунках 2.5 и 2.6 показаны результаты работы программы, реализующей метод Крамера на языке С/С++. Программа предлагает ввести количество неизвестных, затем последовательно ввести коэффициенты при неизвестных и заполнить столбец свободных членов. После чего результат выводится на экран.