Міністерство освіти і науки України
Національний університет «Львівська Політехніка»
Інститут комп’ютерних технологій автоматики та метрології
Кафедра Безпеки Інформаційних Технологій
Звіт
Про виконання лабораторної роботи № 3
«Комп’ютерні методи дослідження
інформаційних процесів і систем»
Львів 2010
Мета роботи: – ознайомлення з ітераційними методами розв’язування систем лінійних алгебраїчних рівнянь.
Короткі теоретичні відомості:
Є система лінійних алгебраїчних рівнянь, що зведена до нормального вигляду
.
Тоді за методом Зейделя, вибираючи вектор початкових наближень
(як правило, це стовпець вільних членів ), уточнення значень невідомих проводять наступним чином:
1) перше наближення:
2) k + 1 наближення
k = 0, 1, 2, … .
Таким чином ітераційний процес подібний до методу простих ітерацій, однак уточнені значення одразу ж підставляються в наступні рівняння:
– метод Зейделя.
Іншими словами, метод Зейделя відрізняється від методу простої ітерації тим, що при обчисленні на “k+1”-му кроці враховуються значення , , , обчислені на цьому самому кроці.
Завдання:
Розв’язати систему лінійних алгебраїчних рівнянь методами простої ітерації або Зейделя.
,
Список ідентифікаторів, констант, методів, використаних в програмі та блок-схемі алгоритму:
Std::cout<< – метод який забезпечує введення в програму вхідних величин.
Cin>> – метод класу STD., який забезпечує зчитування значення з клавиатури.
int Main() – метод класу Program, який забезпечує початок роботи програми.
M,n- Змінні, в даній програмі константи які задають розмір матриці.
I,l,j-Ітераційні змінні
A-двовимірний масив для збереження матриці.
X,p- одновимірні масиви для обчислення Хі, один зберігає значення попереднього кроку(початкове наближення) інший даного.
E-масив для обчислення похибок.
dE-Допустима похибка.
maxE-максимальна пхибка серед одержаних значень
Блок-схема:
Остаточна версія програми:
#include<stdio.h>
#include<math.h>
#include <iostream>
const int n=4;
const int m=5;
void main(void)
{
int i,l,j;
double a[4][5],x[4],p[4],E[4],dE,maxE;
std::cout<<"vvedit matrycju:\n";
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
std::cout<<" a["<<i+1<<"."<<j+1<< "]= ";
std::cin>>a[i][j];
}
std::cout<<"\n";
}
std::cout<<"vvedit to4nist:";
std::cin>>dE;
for(i=0;i<n;i++)
{
for(j=0;j<m-1;j++)
{
if(j==i)a[i][j]=a[i][j];
else a[i][j]=-a[i][j]/a[i][i];
}
a[i][m-1]/=a[i][i];
a[i][i]=0;
}
for(i=0;i<n;i++)p[i]=a[i][m-1];
do{
for(i=0;i<n;i++)
{
x[i]=a[i][m-1];
for(j=0;j<i;j++)
{
x[i]+=a[i][j]*x[j];
}
for(j=i;j<n;j++)
{
x[i]+=a[i][j]*p[j];
}
}
maxE=0;
for(i=0;i<n;i++)
{
E[i]=fabs(x[i]-p[i]);
if(maxE<E[i])maxE=E[i];
p[i]=x[i];
}
}
while(dE<maxE);
for(i=0;i<n;i++)
std::cout<<"\n"<<"x["<<i+1<<"]="<<x[i]<<"\n";
std::cout<<" this is the end...";
std::cin>>a[i][i];
}
Результати роботи програми:
Висновок: На даніій лабораторній роботі я ознайоммвся з ітераційними методами розв’язування систем лінійних алгебраїчних рівнянь.А саме з методом Зейделя