Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Звіт про виконання лабораторної роботи № 2
«Прямі та ітераційні методи Розвязування систем лінійних алгебричних рівнянь»
з курсу
«Компютерні методи дослідження систем керування»
Виконав: ст. гр.СІ-21
Перевірив:
Самотий В.В.
Львів 2012
Завдання
Згідно варіанту завдання (таблиця 1), написати програму для реалізації алгоритму вказаного методу.
Таблиця 1
№ п/п |
Завдання |
Вхідні дані |
2 |
Розвязати систему рівнянь методом Гауса з вибором головного елемента по стовпцю |
система №1 |
Вхідні дані: |
Система №1 де ; ; порядковому № завдання; № групи (наприклад, для КС-21 ) |
Остаточна версія програми
#include "stdafx.h"
#include "iostream"
#include "iomanip"
#include "conio.h"
using namespace std;
void main ()
{
int n=4;
double A[4][4]={{8.3, 2.66, 4.1, 1.9},{3.92, 8.45, 7.74, 2.46},{3.77, 7.25, 8.04, 2.28},{2.21, 3.61, 1.69, 6.69}};
double B[4]={{-10.23},{12.21},{15.03},{-8.35}};
double V[4][4], C[4][4], P[4], X[4], Y[4];
for (int i=0;i<n;i++)
for (int j=0;j<n;j++)
{
V[i][j]=A[i][j];
P[i]=B[i];
}
//Прямий хід
//Вивід матриці
cout<<"Matrucja do sortuvannja:"<<endl;
for (int i=0; i<n; i++)
{
for(int j=0,l=1; j<n; j++,l++)
{
cout<<A[i][j]<<"*X"<<l;
if(l<4)
cout<<" + ";
}
cout<<" = "<<B[i]<<endl<<endl;
}
for(int k=0;k<n;k++)
{
double max=fabs(V[k][k]); //Сортування по стовпцям
int w=k;
for (int l=k+1;l<n;l++)
{
if(max<fabs(V[l][k]))
{
max=fabs(V[l][k]);
w=l;
}
}
double value=P[k];
P[k]=P[w];
P[w]=value;
for(int d=1;d<n;d++)
{
value=V[k][d];
V[k][d]=V[w][d];
V[w][d]=value;
} //Кінець сортування
Y[k]=P[k]/V[k][k];
for (int i=k+1;i<n;i++)
{
P[i]+=-V[i][k]*Y[k];
for (int j=k+1;j<n;j++)
{
C[k][j]=V[k][j]/V[k][k];
V[i][j]+=-V[i][k]*C[k][j];
}
}
}
//Обернений хід
for (int i=0;i<n;i++)
X[i]=0;
X[n-1]=Y[n-1];
for (int i=n-2;i>=0;i--)
{
for (int j=i+1;j<n;j++)
X[i]+=C[i][j]*X[j];
X[i]=Y[i]-X[i];
}
//Перевірка результату
double eps=0.01;
cout << "Perevirka:" << endl;
for(int i=0; i<n; i++)
{
double sum=0;
for(int j=0; j<n; j++)
{
sum += A[i][j] * X[j];
}
double q;
q=sum - B[i];
if (q<eps)
{
q=0;
}
cout <<"Rivnyannya nomer "<< (i+1) << ": " << q << endl;
}
//Вивід
for(int i=0; i<n; i++)
{
cout<<"X"<<(i+1)<<"="<< setw(7)<<X[i]<<" ";
cout<<endl;
}
getch();
}
Короткий опис програми
Результати роботи програми
Matrucja do sortuvannja:
8.3*X1 + 2.66*X2 + 4.1*X3 + 1.9*X4 = -10.23
3.92*X1 + 8.45*X2 + 7.74*X3 + 2.46*X4 = 12.21
3.77*X1 + 7.25*X2 + 8.04*X3 + 2.28*X4 = 15.03
2.21*X1 + 3.61*X2 + 1.69*X3 + 6.69*X4 = -8.35
Perevirka:
Rivnyannya nomer 1: 0
Rivnyannya nomer 2: 0
Rivnyannya nomer 3: 0
Rivnyannya nomer 4: 0
X1=-2.82916
X2=-0.808384
X3=4.19036
X4=-0.935875
Висновок
Отже, в даній лабораторній роботі ми вивчили найпоширеніші прямі та ітераційні методи розвязування систем лінійних алгебричних рівнянь та способи їх застосування для обчислення визначників і обертання матриць та реалізували їх на мові програмування C++. В даній програмі був використаний метод Гауса, що полягає у зведенні матриці коефіцієнтів до трикутного вигляду, що дозволяє достатньо просто і точно знаходити невідомі змінні, а також вибір головного елемента по стовпцю.