МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НУ”ЛЬВІВСЬКА ПОЛІТЕХНІКА”
КАФЕДРА АВТОМАТИКИ І ТЕЛЕМЕХАНІКИ
ЗВІТ
про виконання лабораторної роботи№2
з дисципліни „Алгоритмічні основи криптології”
на тему:
“Ітераційні методи розв’язування
систем лінійних алгебраїчних рівнянь ”
Мета роботи: вивчити найпоширеніші ітераційні методи розв’язку систем лінійних алгебраїчних рівнянь, навчитись розв’язувати на ЕОМ системи алгебраїчних рівнянь, провести порівняльний аналіз розглянутих методів.
Завдання: написати програму на мові програмування Сі яка б розв’язувала систему лінійних алгебраїчних рівнянь методом Зейделя.
24,21+s 2,42 3,85
2,31 31,49 1,52
3,49 4,84 28,72+s
30,24
40,95-r
42,81
де s = 0.2*k , r = 0.2*p
k=0, p=0.
Блок-схема алгоритму.
Повний текст програми.
#include<stdio.h>
#include<math.h>
#include<conio.h>
#define n 3
#define e 0.000001
main()
{ float a[n+1][n+1],b[n+1],l[n+1][n+2],t[n+1],x[n+1][50];
float s=0,x1[n+1]; int i,j,k,p,h;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
scanf("%f",&a[i][j]);
for (i=1;i<=n;i++)
scanf("%f",&b[i]);
for (i=1;i<=n;i++)
{ h=1;
for (j=1;j<=n;j++)
{if (i==j) continue;
l[i][h]=(-a[i][j])/a[i][i];
h++; } }
for (i=1;i<=n;i++)
t[i]=b[i]/a[i][i];
k=0;
printf("%d ",k);
for (i=1;i<=n;i++)
{ x[i][k]=t[i];
printf(" x[%d][%d]=%5.5f",i,k,x[i][k]);}
do { putchar('\n');
k++;
printf("%d ",k);
for (i=1;i<=n;i++)
{h=1; s=0;
for (j=1;j<=n;j++)
{if (i==j) continue;
s+=(l[i][h]*x[j][k-1]);
h++; }
x[i][k]=t[i]+s;
x1[i]=x[i][k];
printf(" x[%d][%d]=%5.5f",i,k,x[i][k]); }
for (i=1;i<=n;i++)
{if (fabs(x[i][k]-x[i][k-1])<e)
{p=1; continue;}
else { p=0; break;}}
} while (p!=1);
for (i=1;i<=n;i++)
{for (j=1;j<=n;j++)
s+=(a[i][j]*x1[j]);
printf("\n%f\n",s);
s=0;}}
Результати обчислень.
0 x[1][0]=1.24907 x[2][0]=1.30041 x[3][0]=1.49060
1 x[1][1]=0.88204 x[2][1]=1.13684 x[3][1]=1.11966
2 x[1][2]=0.95738 x[2][2]=1.18166 x[3][2]=1.19183
3 x[1][3]=0.94142 x[2][3]=1.17265 x[3][3]=1.17512
4 x[1][4]=0.94498 x[2][4]=1.17463 x[3][4]=1.17858
5 x[1][5]=0.94423 x[2][5]=1.17420 x[3][5]=1.17781
6 x[1][6]=0.94440 x[2][6]=1.17429 x[3][6]=1.17798
7 x[1][7]=0.94436 x[2][7]=1.17428 x[3][7]=1.17794
8 x[1][8]=0.94437 x[2][8]=1.17428 x[3][8]=1.17795
9 x[1][9]=0.94437 x[2][9]=1.17428 x[3][9]=1.17795
10 x[1][10]=0.94437 x[2][10]=1.17428 x[3][10]=1.17795
Перевірка:
30.247349
40.950005
42.810001
Висновок:
Розв’язання систем лінійних алгебраїчних рівнянь методом простої ітерації або методом Зейделя можна досить легко реалізувати на ЕОМ за допомогою програми в середовищі Сі. Основна відмінність методу Зейделя полягає в тому, що при обчисленні кожного наступного наближення невідомого аргументу враховуються вже знайдені раніше невідомі поточного наближення. Розв’язання таких систем на ЕОМ є дуже актуальним, оскільки цей процес є набагато легшим та короткотривалішим ніж розв’язання систем лінійних алгебраїчних рівнянь вручну.