- •О. О. Абакумова «Обчислювальна математика-2»
- •Теоретичні відомості
- •Метод простої ітерації
- •Метод Гауса
- •Зразок виконання завдання
- •Приклади програм
- •Контрольні питання
- •Теоретичні відомості
- •Метод бісекції
- •Метод Ньютона (метод дотичних) Для уточнення наближеного розв’язку рівняння зручно використовуватиметод Ньютона, який також називають методом дотичних.
- •Зразок виконання завдання
- •Приклади програм
- •Контрольні питання
- •Теоретичні відомості.
- •Метод простої ітерації
- •Метод Ньютона
- •Зразок виконання завдання
- •Приклади програм
- •Контрольні питання
- •Теоретичні відомості
- •Метод Ейлера
- •Метод Ейлера з уточненням
- •Зразок виконання завдання
- •Приклади програм
- •Контрольні питання
- •Теоретичні відомості
- •Зразок виконання завдання
- •Приклад програми
- •Контрольні питання
- •Теоретичні відомості.
- •Метод золотого перетину
- •Зразок виконання завдання
- •Приклад програми
- •Контрольні питання
Зразок виконання завдання
Завдання: 1) Методом простої ітерації розв’язати систему лінійних рівнянь з точністю до 0.001:
(7)
Розв’язання:
Перепишемо систему (7) в матричній формі:
Перевіримо достатню умову збіжності ітераційного процесу:
За нульові наближення коренів системи приймемо значення вільних членів:
, , ,.
Підставимо ці значення в праві частини рівнянь системи (7) й отримаємо для ,,,перші наближення. Й так далі.
Обчислення розташуємо у таблиці:
k |
|
|
|
|
0 |
2.15 |
-0.83 |
1.16 |
0.44 |
1 |
2.9719 |
-1.0775 |
1.5093 |
-0.4326 |
2 |
2.3555 |
-1.0721 |
1.5075 |
-0.7317 |
3 |
3.5017 |
-1.0106 |
1.5015 |
-0.8111 |
4 |
3.5511 |
-0.9277 |
1.4944 |
-0.8321 |
5 |
3.5637 |
-0.9563 |
1.4834 |
-0.8298 |
6 |
3.5678 |
-0.9566 |
1.4890 |
-0.8332 |
7 |
3.5700 |
-0.9575 |
1.4889 |
-0.8356 |
8 |
3.5709 |
-0.9573 |
1.4890 |
-0.8362 |
Критерієм закінчення ітераційного процесу є виконання умови
Оскільки
то ітераційний процес зупиняється.
В якості розв’язку системи рівнянь беремо ,,,.
Відповідь: ,,,.
2) Використовуючи схему Гауса, розв’язати систему лінійних рівнянь, з точністю до 0.001:
Розв’язання:
Виключимо з другого та третього рівнянь системи. Для цього спочатку помножимо перше рівняння на 0.3 й результат додамо до другого. А потім помножимо перше рівняння на -0.5 й результат додамо до третього. Матимемо:
Продовжимо виключення невідомих. Помножимо друге рівняння на 25 й результат додамо до третього рівняння. Отримаємо систему у трикутному вигляді:
На цьому закінчується прямий хід Гауса.
Зворотній хід Гауса полягає у послідовному обчисленні ,тавідповідно з третього, другого та першого рівнянь:
Відповідь:
Приклади програм
// 1) Розв’язання системи лінійних рівнянь методом простої ітерації
#include <conio.h>
#include <iostream>
#include <cmath>
using namespace std;
void main()
{
float a[4][4]={{0.13, 0.23, -0.44, -0.05},
{0.24, 0,-0.31, 0.15},
{0.06, 0.15, 0, -0.23},
{0.72, -0.08, -0.05, 0}};
float f[4]={2.13, -0.18, 1.44, 2.42};
float n, j, x[4], x0[4];
int i, q, c;
cout<<"Rozvjazok SLAR metodom iteraciy"<<endl<<endl;
cout<<"Zadana systema:"<<endl<<endl;
for (i=0; i<4; i++)
{
cout<<"x"<<i+1<<"= "<<"("<<a[i][0]<<")"<<"x1+"<<"("<<a[i][1]<<")"<<"x2+"
<<"("<<a[i][2]<<")"<<"x3+"<<"("<<a[i][3]<<")"<<"x4;"<<endl;
}
n=-2;
for (i=0;i<=3;i++)
{
j=fabs(a[i][0])+fabs(a[i][1])+fabs(a[i][2])+fabs(a[i][3]);
if (n<j) n=j;
}
cout.precision(3);
cout<<endl<<"Norma A= "<<n<<endl;
if (n<1) cout<<"Metod zbizhnyj"<<endl<<endl;
else
{
cout<<"Metod rozzbizhnyj"<<endl;
getch();
exit(1);
}
for (i=0; i<=3; i++) x[i]=f[i];
c=1;
do{
q=0;
for (i=0; i<=3; i++)
{
x0[i]=x[i];
x[i]=a[i][0]*x[0]+a[i][1]*x[1]+a[i][2]*x[2]+a[i][3]*x[3]+f[i];
if (fabs(x0[i]-x[i])<0.001) q++;
}
c++;
}while (q!=4);
cout.precision(3);
cout<<"Rozvjazok sustemu:"<<endl;
for (i=0; i<=3; i++) cout<<"x"<<i+1<<"="<<x[i]<<endl;
cout.precision(0);
cout<<endl<<"i="<<c<<endl;
getch();
}
// 2) Розв’язання системи лінійних рівнянь методом Гауса
#include <iostream>
#include <conio.h>
#include <cmath>
using namespace std;
void vuvid(float v[100][100], int q)
{
for (int i=0; i<q; i++)
{
for (int j=0; j<=q; j++)
{
if (j==q) cout<<"|\t";
cout<<v[i][j]<<"\t";
}
cout<<"\n";
}
};
void vvod(float a[100][100], int q)
{
cout<<"Vvedit matrucjy koeficientiv\n";
for (int i=0; i<q; i++)
{
for (int j=0; j<q; j++)
{
cout<<"a["<<i+1<<"]["<<j+1<<"]=";
cin>>a[i][j];
}
}
cout<<"\n\nVvedit matrucjy vilnuh chleniv\n";
for (int i=0; i<q; i++)
{
int j;
j=q;
cout<<"b["<<i+1<<"]=";
cin>>a[i][j];
}
};
void tform(float v[100][100], int q)
{
float e;
for (int k=0; k<q; k++)
{
for (int i=1+k; i<q; i++)
{
e=v[i][k];
for (int j=0; j<=q; j++)
v[i][j]=v[i][j]-e/v[k][k]*v[k][j];
}
}
};
void xxx(float v[100][100], float x[100], int q)
{
float dx=0;
for (int i=0; i<100; i++)
x[i]=0;
for(int i=q-1; i>=0; i--)
{
dx=0;
for(int j=i; j<q; j++)
dx=dx+x[j]*v[i][j] ;
x[i]=(v[i][q]-dx)/v[i][i];
}
};
void main()
{
clrscr();
int q=3, p=0;
float a[100][100], x[100];
do {
cout<<"\n\n\tRozvjazok SLAR metodom Gaysa:\n\n";
cout<<"\n\t1) Obchuslutu zi standartnumu znachennjamu \n\n";
cout<<"\t2) Vvestu znachennja\n\n";
cout<<"\t3) Exit\n\n";
cout<<"Vash vubir (1, 2, 3)\t";
cin>>p;
if(p==3) exit(1);
if(p==2)
{
clrscr();
cout<<"\nVvedit kilkist rivnjan: ";
cin>>q;
if((q<1)||(q>=100))
{
cout<<"Zaveluka kilkist rivnjan";
getch();
exit(1);
}
else
{
cout<<"\n";
vvod(a, q);
cout<<"\n\tObjednana matrucja\n";
vuvid(a, q);
}
}
if (p==1)
{
clrscr();
q=3;
a[0][0]=3.6; a[0][1]=1.8; a[0][2]=-4.7;
a[1][0]=2.7; a[1][1]=-3.6; a[1][2]=1.9;
a[2][0]=1.5; a[2][1]=4.5; a[2][2]=3.3;
a[0][3]=3.8; a[1][3]=0.4; a[2][3]=-1.6;
cout<<"\n\tObjednana matrucja\n";
vuvid(a, q);
}
tform(a, q);
xxx(a, x, q) ;
cout<<"\n\n\tRozvjazok sustemu\n\n";
for (int i=0; i<q; i++)
cout<<"x"<<i+1<<"="<<x[i]<<"\n";
getch();
}while(p!=3);
getch();
}