Читайте данную работу прямо на сайте или скачайте

Скачайте в формате документа WORD


Метод релаксации переменных при решении систем линейных равнений

Вступ

Бурхливий розвиток новтньо

Сьогодн серйозн компанÿ працюють над новими мовами програмування й засобами реалзацÿ коду. Так, завдяки Б.Страуструпу було ведено обТ

ктно - орúнтоване програмування, створений

У сво

му проект я буду використовувати Borland C++ версÿ 4.5, тому що вважаю його найбльш оптимальним для поставлено

1.1 Загальна характеристика методв ршення систем нйних рвнянь.

Способи виршення систем лнйних рвнянь в основному роздляються на дв групи: 1) точн методи, що представляють собою кнцев алгоритми для обчислення корнь системи ( до таких методв ставляться: правило Крамера, метод Гаусса, метод головних елементв, метод квадратних корнь н.), 2) терацйн методи, що дозволяють одержувати корнь системи з заданою точнстю, шляхом збжних нескнченних процесв (до

Внаслдок неминучих округлень результати навть точних методв

наближеними, причому оцнка погршностей корнь у загальному випадку скрутна. При використанн терацйних процесв, поверх того, дода

ться погршнсть методу.

Однак ефективне застосування терацйних методв стотно залежить вд вибору початкового наближення й швидкост збжност процесу.


1.2 Метод релаксацÿ змнних систем нйних рвнянь

П.З.:

Дана система нйних рвнянь, необхдно знайти ата н.

Нехай ма

мо наступну систему нйних рвнянь:

(1)

Перетворимо цю систему в такий спосб: перенесемо вльн члени воруч роздлимо перше рвняння на - а т.д. Тод одержимо систему, приготовлену до релаксацÿ,

(2)

де

аи.

Нехай апочаткове наближення ршення системи (2). Пдставляючи ц значення в систему (2), одержимо нев'язання

(3)

Якщо одн㺿 з невдомих адати прирст азменшиться на величину азбльшаться на величини ав 0, досить величин адати прирст

ми будемо мати:

и

апри

Метод релаксацÿ (по-росйському: ослаблення) у його найпростшй форм поляга

в тм, що на кожному кроц перетворюють у нуль максимальну по модул нев'язання шляхом змни значень вдповдного компонента наближення. Процес закнчу

ться, коли вс нев'язання останньо

1.3 Використання метода релаксацÿ змнних в системах нйних рвнянь на приклад

Приклад. Методом релаксацÿ виршити систему

(4)

роблячи обчислення з двома десятковими знаками.

Ршення. Приводимо систему (4) до виду, зручному для релаксацÿ

Вибираючи як початков наближення корнь нульов значення

Знаходимо вдповдн

Вдповдно до загально

Звдси одержу

мо нев'язку

0

0,60

0

0,70

0

0,80

0,16

0,16

-0,80

0,76

0,86

0

0,17

0,86

-0,86

0,09

0,93

0

0,09

0,93

-0,93

0,09

0,09

0

0,09

0,18

0,18

0,04

0,04

-0,18

0,04

0,13

0,13

0

0,03

-0,13

0,01

0,07

0,07

0

0,01

-0,07

0,01

0,01

0

0,01

0,02

0,02

0

0

-0,02

0

0

0,01

0,01

0

0

-0,01

0

0

0

0

1,00

1,00

1,00

Дал, дума

мо

т.д. Вдповдн результати обчислень наведен в таблиц.

Пдсумовуючи вс прирости

Для контролю пдставля

мо знайден значення корнь у вихдн рвняння; у цьому випадку система виршена точно.

Висновки

Я навчився розвТязувати системи нйних рвнянь методом релаксацÿ змнних, та закрпив отриман навички розробкою програми на мов Borland C++ 4.5.

Додаток А

Виршити систему нйних рвнянь методом релаксацÿ змнних.

Лстинг програми 1.1:

#include<iostream.h>

#include<math.h>

int maximal(int n,double R0[]);

void main(){

int i,j,n,f,k,iter;

double S,det;

cout<<"Введите размерность матрицы(матрица должна быть квадратной)= ";cin>>n;

double *x=new double [n];

double **b=new double *[n];

for(i=0;i<n;i++)

b[i]=new double[n+1];

double **a=new double *[n];

for(i=0;i<n;i++)

a[i]=new double[n+1];

cout<<"Введите количество итераций:";

cin>>iter;

cout<<"Введите расширенную матрицу:\n";

for(i=0;i<n;i++){

for(j=0;j<=n;j++)

cin>>b[i][j];

}

cout<<"Подготавливаю матрицу к релаксации...\n";

for(i=0;i<n;i++){

for(j=0;j<n;j++)

a[i][j]=-b[i][j]/b[i][i];

a[i][n]=b[i][n]/b[i][i];

}

for(i=0;i<n;i++){

for(j=0;j<n+1;j++)

cout<<"а "<<a[i][j]<<" || ";

cout<<"\n";

}

double *x0=new double [n];

for(i=0;i<n;i++)

x[i]=0.0;

double *R0=new double [n];

cout<<"Введите значения начальных приближений:\n";

for(i=0;i<n;i++)

cin>>x0[i];

S=0.0;

for(i=0;i<n;i++){

for(j=0;j<n;j++)

S=S+a[i][j]*x0[i];

}

for(i=0;i<n;i++){

R0[i]=a[i][n]-x0[i]+S;

cout<<"R("<<i<<")="<<R0[i]<<" | ";

}

f=maximal(n,R0);

det=R0[f];

for(k=0;k<iter;k++){

cout<<"det{"<<k<<"}="<<det<<"\n";

for(i=0;i<n;i++){

if(i!=f) R0[i]=R0[i]+a[i][f]*det;

аelse R0[i]=R0[i]-det;

}

for(i=0;i<n;i++)

cout<<"R["<<i+1<<"]="<<R0[i]<<" ";

x[f]=x[f]+det;

f=maximal(n,R0);

det=R0[f];

}

cout<<"\n";

for(i=0;i<n;i++)

cout<<"X{"<<i+1<<"}="<<x[i]<<"\n";

delete []x;

delete []R0;

delete []x0;

delete []a;

}

int maximal(int n,double R0[]){

int i,f;

f=0.0;

for(i=0;i<n-1;i++){

if(R0[i+1]>R0[i]) f=i+1;

}

return f;

}