Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СЛАУ.docx
Скачиваний:
4
Добавлен:
14.07.2019
Размер:
34.9 Кб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ

УЧРЕЖДЕНИЕ ОБРАЗОВАНИЯ

“БРЕСТСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ”

КАФЕДРА ИИТ

Отчёт по лабораторной работе № 2

Решение систем линейных алгебраических уравнений

Выполнил:

Студент группы АС-33 Вакульский Д.Ю. Проверила:

Глущенко Т.А.

Брест 2011

Решение систем линейных алгебраических уравнений Задание

  1. Написать программу для решения СЛАУ методом простых итераций и методом Зейделя. Методы оформить в виде отдельных подпрограмм Точность нахождения решения СЛАУ . В методе простых итераций вычислить нормы матрицы B. Проверить выполнение достаточных условий сходимости методов. При необходимости переставить местами уравнения системы. Предусмотреть ограничение числа итераций до 30 при невыполнении достаточных условий сходимости методов.

  2. Решить СЛАУ в системе MathCAD.

  3. Сравнить число необходимых итераций в обоих методах. Сделать выводы.

А = b =

Для решения данной системы итерационными методами необходимо поменять местами первую и вторую строки матрицы, иначе условие сходимости не будет выполняться.

Текст программы

#include <stdio.h>

#include <math.h>

#include <conio.h>

#include <stdlib.h>

#include <ctype.h>

const float e = 0.0001;

const float A[3][3] = {{5,-2,1},

{2,-4,1},

{1,2,-6}},

b[3] = {13,-9,-4};

float B[3][3],c[3];

int k;

void MI();

void MZ();

void main()

{

int end = 0;

while (end != 1)

{

system ("cls");

printf("....RSHENIE SLAU...\n1.METOD PROSTIH (I)TERACIY\n2.METOD (Z)EYDELYA\n3.(E)xit\n");

printf("MATRICA:\n");

for(int i=0;i<=2;i++)

{

for(int j=0;j<=2;j++)

printf("%.0f ", A[i][j]);

printf("%.0f\n", b[i]);

}

int choice = toupper(getch());

switch (choice)

{

case 'I': MI();

break;

case 'Z': MZ();

break;

case 'E': end = 1;

break;

default: break;

}

}

}

void MI()

{

k = 0;

system("cls");

printf("...METOD PROSTIH ITERACIY...\n");

float x0[3],x1[3];

for(int i=0;i<=2;i++) //находим матрицы B и c

{

for(int j=0;j<=2;j++)

{

if(i == j)

B[i][j] = 0;

else

B[i][j] = -A[i][j]/A[i][i];

}

c[i] = b[i]/A[i][i];

}

printf("MATRICA B:\n");

for(int i=0;i<=2;i++) //вывод матриц B и c на экран

{

for(int j=0;j<=2;j++)

printf("%.1f ", B[i][j]);

printf("%.1f\n", c[i]);

}

// нахоим норма матрицы В

float sum, max;

for(int i=0;i<=2;i++)

{

sum = 0;

for(int j=0;j<=2;j++)

sum = sum + fabs(B[i][j]);

if (sum > max)

max = sum;

}

float norma1 = max;

printf("NORMA 1 = %f\n", norma1);

sum = 0;

for(int i=0;i<=2;i++)

{

sum = 0;

for(int j=0;j<=2;j++)

sum = sum + pow(B[i][j],2);

}

float norma2 = pow(sum,0.5);

printf("NORMA 2 = %f\n", norma2);

sum = 0; max = 0;

for(int i=0;i<=2;i++)

{

sum = 0;

for(int j=0;j<=2;j++)

sum = sum + fabs(B[j][i]);

if (sum > max)

max = sum;

}

float norma3 = max;

printf("NORMA 3 = %f\n", norma3);

if ((norma1 < 1) || (norma2 < 1) || (norma3 < 1)) //проверка условия сходимасти

printf("DOSTATOCHNOE USLOVIE SHODIMOSTI VIPOLNYAETSYA!\n");

else

printf("DOSTATOCHNOE USLOVIE SHODIMOSTI NE!!! VIPOLNYAETSYA!\n");

float pogr = 0;

for(int i=0;i<=2;i++) // задаём начальное приближение

x0[i] = A[i][i]/b[i];

printf("NACHALNOE PRIBLIJENIE:\nx1 = %f\nx2 = %f\nx3 = %f\n", x0[0], x0[1], x0[2]);

printf("| k| x1 | x2 | x3 |pogrech.|\n");

do

{

k++;

x1[0] = (-A[0][1]*x0[1]-A[0][2]*x0[2]+b[0])/A[0][0];

x1[1] = (-A[1][0]*x0[0]-A[1][2]*x0[2]+b[1])/A[1][1];

x1[2] = (-A[2][0]*x0[0]-A[2][1]*x0[1]+b[2])/A[2][2];

pogr = fabs(x1[0] - x0[0]);

for(int i=1;i<=2;i++)// находим наибольшую погрешность

if(fabs(x1[i] - x0[i]) > pogr)

pogr = fabs(x1[i] - x0[i]);

printf("|%2d| %.5f | %.5f | %.5f | %.5f|\n", k, x1[0], x1[1], x1[2], pogr);

x0[0] = x1[0];

x0[1] = x1[1];

x0[2] = x1[2];

}

while((pogr > e) && (k < 30));

printf("x1 = %.0f\nx2 = %.0f\nx3 = %.0f\n", x1[0], x1[1], x1[2]);

getch();

}

void MZ()

{

k = 0;

system("cls");

printf("...METOD ZEYDELYA...\n");

float x0[3], x1[3], pogr = 0;

float a = 0; // если a=0 - метод сходится

// если a=1 - метод расходится

for(int i=0;i<=2;i++) //проверка преобладания диагональных элементов по строкам

for(int j=0;j<=2;j++)

{

if (fabs(A[i][j]) > fabs(A[i][i]))

a = 1;

}

if(a == 0)

printf("DIAGONALNIE ELEMENTI PREOBLADAUT\nDOSTATOCHNOE USLOVIE SHODIMOSTI VIPOLNYAETSYA!\n");

else

printf("DOSTATOCHNOE USLOVIE SHODIMOSTI NE!!! VIPOLNYAETSYA!\n");

for(int i=0;i<=2;i++) // задаём начальное приближение

x0[i] = A[i][i]/b[i];

printf("NACHALNOE PRIBLIJENIE:\nx1 = %f\nx2 = %f\nx3 = %f\n", x0[0], x0[1], x0[2]);

printf("| k| x1 | x2 | x3 |pogrech.|\n");

do

{

k++;

x1[0] = (-A[0][1]*x0[1]-A[0][2]*x0[2]+b[0])/A[0][0];

x1[1] = (-A[1][0]*x1[0]-A[1][2]*x0[2]+b[1])/A[1][1];

x1[2] = (-A[2][0]*x0[0]-A[2][1]*x1[1]+b[2])/A[2][2];

pogr = fabs(x1[0] - x0[0]);

for(int i=1;i<=2;i++)// находим наибольшую погрешность

if(fabs(x1[i] - x0[i]) > pogr)

pogr = fabs(x1[i] - x0[i]);

printf("|%2d| %.5f | %.5f | %.5f | %.5f|\n", k, x1[0], x1[1], x1[2], pogr);

x0[0] = x1[0];

x0[1] = x1[1];

x0[2] = x1[2];

}

while((pogr > e) && (k < 30));

printf("x1 = %.0f\nx2 = %.0f\nx3 = %.0f\n", x1[0], x1[1], x1[2]);

getch();

}