- •Студенты
- •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
- •Метод Гаусса
- •Метод простых итераций
- •Метод Зейделя
- •Результаты и их анализ
- •Список использованной литературы
Метод простой итерации
Таблица идентификаторов
В таблице 3 приведены основные идентификаторы, используемые в программе, реализующей метод простой итерации на языке С++.
Таблица 3 – Идентификаторы для метода простой итерации
matrix |
Матрица коэффициентов исходной СЛАУ |
oldResult, newResult |
Результат последней и текущей итерации соответственно |
eps |
Величина погрешности |
sum |
Переменная, хранящая промежуточное значение суммы |
Код программы:
#include<iostream> #include<stdio.h> #include<math.h> using namespace std; double eps=0.001; const int size=4; bool epsChecking(double* oldResult, double* newResult, int size) { bool res=false; for(int i=0; i<size; i++) if(fabs(newResult[i]-oldResult[i])>eps) res=true; return res; } int main() { double** matrix=new double*[size]; for(int i=0; i<size; i++) matrix[i]=new double[size+1]; cout << "Enter observational error: "; cin >> eps; FILE* f=freopen("input", "r", stdin); for(int i=0; i<size; i++) for(int j=0; j<size+1; j++) cin>>matrix[i][j]; for(int i=0; i<size; i++) { double sum=0.0; for(int j=0; j<size; j++) { if(i!=j) sum+=fabs(matrix[i][j]); }; if(fabs(matrix[i][i])<sum) { cout << "Error!" << endl; return 1; }; }; double* oldResult=new double[size]; double* newResult=new double[size]; for(int i=0; i<size; i++) oldResult[i]=0; int k=0; while(true) { for(int i=0; i<size; i++) { double sum=matrix[i][size]; for(int j=0; j<size; j++) if(i!=j) sum+=(-oldResult[j])*matrix[i][j]; newResult[i]=(sum)/matrix[i][i]; }; for(int i=0; i<size; i++) { cout << newResult[i] << " "; }; cout << endl; cout << endl; if(epsChecking(oldResult, newResult, size)) { for(int i=0; i<size; i++) oldResult[i]=newResult[i]; k++; } else { for(int i=0; i< size; i++) cout << newResult[i] << " "; cout << endl; return 0; }; };
system(“pause”);return0; }
На рисунках 2.7 и 2.8 показаны результаты работы программы, реализующей метод простой итерации на языке С/С++. Программа предлагает ввести погрешность. Исходная система считывается из файла, после чего результат выводится на экран.
Пример работы программы:
Рисунок 2.7 - окно с результатом работы программы, реализующей метод простой итерации на языке С/С++ (Король)
Рисунок 2.8 - окно с результатом работы программы, реализующей метод простой итерации на языке С/С++ (Скворцова)
Метод Зейделя
Таблица идентификаторов
В таблице 4 приведены основные идентификаторы, используемые в программе, реализующей метод Зейделя на языке С++.
Таблица 4 – Идентификаторы для метода Зейделя
matrix |
Матрица коэффициентов исходной СЛАУ |
oldResult, newResult |
Результат последней и текущей итерации соответственно |
eps |
Величина погрешности |
sum |
Переменная, хранящая промежуточное значение суммы |
Код программы:
#include<iostream> #include<stdio.h> #include<math.h> using namespace std; double eps=0.0001; const int size=3; bool epsChecking(double* oldResult, double* newResult, int size) { bool res=false; for(int i=0; i<size; i++) if(fabs(newResult[i]-oldResult[i])>eps) res=true; return res; } int main() { double** matrix=new double*[size]; for(int i=0; i<size; i++) matrix[i]=new double[size+1]; cout << "Enter observational error: "; cin >> eps; FILE* f=freopen("input", "r", stdin); for(int i=0; i<size; i++) for(int j=0; j<size+1; j++) cin>>matrix[i][j]; for(int i=0; i<size; i++) { double sum=0.0; for(int j=0; j<size; j++) { if(i!=j) sum+=fabs(matrix[i][j]); }; if(fabs(matrix[i][i])<sum) { cout << "Error!" << endl; return 1; }; }; double* oldResult=new double[size]; double* newResult=new double[size]; double koefs[size]; for(int i=0; i<size; i++) oldResult[i]=0; for(int i=0; i<size; i++) newResult[i]=0; int k=0; while(true) { for(int i=0; i<size; i++) { double sum=matrix[i][size]; for(int j=0; j<size; j++) { if(i!=j) sum+=(-newResult[j])*matrix[i][j]; }; newResult[i]=(sum)/matrix[i][i]; //oldResult[i]=newResult[i]; }; for(int i=0; i<size; i++) { cout << newResult[i] << " "; }; cout << endl; cout << endl; if(epsChecking(oldResult, newResult, size)) { for(int i=0; i<size; i++) oldResult[i]=newResult[i]; k++; } else { for(int i=0; i< size; i++) cout << newResult[i] << " "; cout << endl; return 0; }; }; return 0; }