ПР1
.docxЦели работы
а) освоение основных методов решения систем линейных алгебраических уравнений (СЛАУ);
б) совершенствование навыков по алгоритмизации и программированию вычислительных задач.
Постановка задачи
Вариант 5
Решить систему линейных уравнений методом Зейделя, где
Математическая часть
Аналитические расчеты
На рисунке 1 представлены входные данные для онлайн калькулятора, использованного для осуществления аналитических расчетов(«ручного счета»).
Рисунок 1 – входные данные
Решение:
Приведем к виду: x1=0.3333 - (0.67x2+0.33x3+0.89x4) x2=0.25 - (0.5x1+0.38x3+0.88x4) x3=0.1429 - (0.57x1+0.86x2+0.57x4) x4=1.3333 - (0.67x1+x2+1.67x3) Покажем вычисления на примере нескольких итераций. N=1 x1=0.3333 - 0*0.6667 - 0*0.3333 - 0*0.8889=0.3333 x2=0.25 - 0.3333*0.5 - 0*0.375 - 0*0.875=0.0833 x3=0.1429 - 0.3333*0.5714 - 0.0833*0.8571 - 0*0.5714=-0.119 x4=1.3333 - 0.3333*0.6667 - 0.0833*1 - (-0.119)*1.6667=1.2262 N=2 x1=0.3333 - 0.0833*0.6667 - (-0.119)*0.3333 - 1.2262*0.8889=-0.7725 x2=0.25 - (-0.7725)*0.5 - (-0.119)*0.375 - 1.2262*0.875=-0.392 x3=0.1429 - (-0.7725)*0.5714 - (-0.392)*0.8571 - 1.2262*0.5714=0.2196 x4=1.3333 - (-0.7725)*0.6667 - (-0.392)*1 - 0.2196*1.6667=1.8743 N=3 x1=0.3333 - (-0.392)*0.6667 - 0.2196*0.3333 - 1.8743*0.8889=-1.1446 x2=0.25 - (-1.1446)*0.5 - 0.2196*0.375 - 1.8743*0.875=-0.9001 x3=0.1429 - (-1.1446)*0.5714 - (-0.9001)*0.8571 - 1.8743*0.5714=0.4974 x4=1.3333 - (-1.1446)*0.6667 - (-0.9001)*1 - 0.4974*1.6667=2.1675 Остальные расчеты сведем в таблицу(полученная таблица приведена на рисунке 2).
Рисунок 2 – Таблица значений
Схема алгоритма решения задачи
Рисунок 3 - Схема функции okr
Рисунок 4 - Схема функции swp
Рисунок 5 – Часть схемы функции main
Рисунок 6 – Часть схемы функции main
Рисунок 7 – Часть схемы функции main
Рисунок 8 – Часть схемы функции main
Рисунок 9 – Часть схемы функции main
Рисунок 10 – Часть схемы функции main
На рисунках 5-10 изображена схема функции main.
Текст программы на языке C++
#include<iostream>
#include<conio.h>
using namespace std;
float okr(float x, double eps)
{
int i = 0;
double neweps = eps;
while (neweps < 1)
{
i++;
neweps *= 10;
}
int okr = pow(double(10), i);
x = int(x * okr + 0.5) / double(okr);
return x;
}
void swp(float* a, float* b)
{
float temp = *a;
*a = *b;
*b = temp;
}
int main(void)
{
setlocale(LC_ALL, "Russian");
float a[10][10], b[10], m[10], n[10];
int p, q = 0, i = 0, j = 0;
double eps = 0;
cout << "Введите размер матрицы A: ";
cin >> p;
for (i = 0; i < p; i++)
{
for (j = 0; j < p; j++) {
cout << "a[" << i << ", " << j << " ]=";
cin >> a[i][j];
}
}
cout << "\nВведите значения матрицы B \n";
for (i = 0; i < p; i++)
{
cout << "b[" << i << "]=";
cin >> b[i];
}
cout << "\nВаше уравнение: " << endl;
for (i = 0; i < p; i++)
{
cout << a[i][0] << "*" << "X1" << " + " << a[i][1] << "*" << "X2" << " + " << a[i][2] <<
"*" << "X3" << " + " << a[i][3] << "*" << "X4" << " = " << b[i];
cout << endl;
}
float max;
int z = p + 1;
int t = 0;
for (j = 0; j < p; j++)
{
max = 0;
for (i = t; i < z; i++)
{
if (a[i][j] > max)
{
max = a[i][j];
for (int q = 0; q < p; q++)
{
swp(&a[i][q], &a[j][q]);
}
swp(&b[i], &b[j]);
}
}
t++;
}
cout << "\nВаше модифицированное уравнение: " << endl;
for (i = 0; i < p; i++)
{
cout << a[i][0] << "*" << "X1" << " + " << a[i][1] << "*" << "X2" << " + " << a[i][2] << "*"
<< "X3" << " + " << a[i][3] << "*" << "X4" << " = " << b[i];
cout << endl;
}
// погрешность
cout << "\nВведите точность вычислений: ";
cin >> eps;
// начальное приближения столбца решения
for (i = 0; i < p; i++) {
m[i] = 0;
}
cout << "\nВведите номер итеррации: ";
cin >> q;
while (q > 0)
{
for (i = 0; i < p; i++)
{
n[i] = (b[i] / a[i][i]);
for (j = 0; j < p; j++)
{
if (j == i)
continue;
n[i] = n[i] - ((a[i][j] / a[i][i]) * m[j]);
m[i] = n[i];
}
cout << "x" << i + 1 << "=" << okr(n[i], eps) << " ";
}
cout << "\n";
q--;
}
return 0;
}
Результат программных расчетов
На рисунке 5 представлен результат работы программы
Рисунок 5 – Результат работы программы
Сравнение результатов программных и аналитических расчетов
В ходе тестирования программы выявлено, что полученные результаты совпадают с предсказанными в ходе аналитических расчетов с точностью до округления.
Выводы
В ходе выполнения лабораторной работы были изучены способы решения системы линейных алгебраических уравнений(СЛАУ). Составлена схема решения поставленной задачи. Так же была написана программа, позволяющая решать СЛАУ методом Зейделя. Полученные после работы программы результаты совпадают с аналитическими расчетами, следовательно программа работает корректно. При отладке ошибок не обнаружено.