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

Вступ

Бурхливий розвитокновітньої техніки й все більше впровадження сучасних розділів математикинезмірно підвищили вимоги до математичної підготовки фахівців і вдосконалюваннютехніки програмування. Програмістам, що займаються прикладним, системним або Webпрограмуванням необхідно чітко бачити алгоритм створюваного проекту, будь тетекстовий процесор або серйозна операційна система. Математичне утворення даєпрограмістові можливість простіше й оптимальніше побудувати як сам алгоритм,так і програму.

Сьогодні серйознікомпанії працюють над новими мовами програмування й засобами реалізації коду.Так, завдяки Б.Страуструпу було уведено об’єктно — орієнтоване програмування,  створений їм мова C++ відкрив передпрограмістами нові обрії. Але час не коштує на місці й C++ перестає бутипопулярним, на зміну йому приходить JAVA, що має винятково класову структуру,написані на ньому програми займають менший об'єм пам'яті й виконуються набагатошвидше. Але деякі мови не мають об’єктно — орієнтованої структури еволюціонувалий представляють саму перспективну галузь серед інших мов, такими мовами єDelphi (Остання версія якого — 2006), Visual Basic 2005(Visual Studio 2005).

У своєму проекті я будувикористовувати Borland C++ версії 4.5, тому що вважаю його найбільш оптимальнимдля поставленої мною задачі.

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

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

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

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

 

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

П.З.:

Дана система лінійних рівнянь, необхідно знайти <img src="/cache/referats/24968/image002.gif" v:shapes="_x0000_i1025"> та ін.

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

<img src="/cache/referats/24968/image004.gif" v:shapes="_x0000_i1026">                                                        (1)

Перетворимо цю систему в такий спосіб: перенесемовільні члени ліворуч і розділимо перше рівняння на — <img src="/cache/referats/24968/image006.gif" v:shapes="_x0000_i1027"><img src="/cache/referats/24968/image008.gif" v:shapes="_x0000_i1028"> і т.д. Тоді одержимосистему, приготовлену до релаксації,

<img src="/cache/referats/24968/image010.gif" v:shapes="_x0000_i1029">                                                       (2)

де

<img src="/cache/referats/24968/image012.gif" v:shapes="_x0000_i1030">   <img src="/cache/referats/24968/image014.gif" v:shapes="_x0000_i1031"> и. <img src="/cache/referats/24968/image016.gif" v:shapes="_x0000_i1032">

Нехай <img src="/cache/referats/24968/image018.gif" v:shapes="_x0000_i1033"> початкове наближеннярішення системи (2). Підставляючи ці значення в систему (2), одержимо нев'язання

<img src="/cache/referats/24968/image020.gif" v:shapes="_x0000_i1034">                                                     (3)

Якщо однієї з невідомих <img src="/cache/referats/24968/image022.gif" v:shapes="_x0000_i1035"> дати приріст <img src="/cache/referats/24968/image024.gif" v:shapes="_x0000_i1036"><img src="/cache/referats/24968/image026.gif" v:shapes="_x0000_i1037"> зменшиться на величину<img src="/cache/referats/24968/image024.gif" v:shapes="_x0000_i1038"><img src="/cache/referats/24968/image029.gif" v:shapes="_x0000_i1039"> збільшаться навеличини <img src="/cache/referats/24968/image031.gif" v:shapes="_x0000_i1040"><img src="/cache/referats/24968/image033.gif" v:shapes="_x0000_i1041"> в 0, досить величині <img src="/cache/referats/24968/image022.gif" v:shapes="_x0000_i1042"> дати приріст

   <img src="/cache/referats/24968/image036.gif" v:shapes="_x0000_i1043">

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

         <img src="/cache/referats/24968/image038.gif" v:shapes="_x0000_i1044">

и

         <img src="/cache/referats/24968/image040.gif" v:shapes="_x0000_i1045"> при <img src="/cache/referats/24968/image042.gif" v:shapes="_x0000_i1046">

Метод релаксації (по-російському: ослаблення) уйого найпростішій формі полягає в тім, що на кожному кроці перетворюють у нульмаксимальну по модулі нев'язання шляхом зміни значень відповідного компонентанаближення. Процес закінчується, коли всі нев'язання останньої перетвореноїсистеми будуть рівні 0 із заданою точністю. Питання про збіжність цього процесуми залишаємо без розгляду .

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

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

<img src="/cache/referats/24968/image044.gif" v:shapes="_x0000_i1047">                                                            (4)

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

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

<img src="/cache/referats/24968/image046.gif" v:shapes="_x0000_i1048">

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

<img src="/cache/referats/24968/image048.gif" v:shapes="_x0000_i1049">

Знаходимо відповідні їм нев'язку

<img src="/cache/referats/24968/image050.gif" v:shapes="_x0000_i1050">

Відповідно до загальної теорії думаємо:

<img src="/cache/referats/24968/image052.gif" v:shapes="_x0000_i1051">

Звідси одержуємо нев'язку

<img src="/cache/referats/24968/image054.gif" v:shapes="_x0000_i1052">

<img src="/cache/referats/24968/image056.gif" v:shapes="_x0000_i1053">

<img src="/cache/referats/24968/image058.gif" v:shapes="_x0000_i1054">

<img src="/cache/referats/24968/image060.gif" v:shapes="_x0000_i1055">

<img src="/cache/referats/24968/image062.gif" v:shapes="_x0000_i1056">

<img src="/cache/referats/24968/image064.gif" v:shapes="_x0000_i1057">

<img src="/cache/referats/24968/image066.gif" v:shapes="_x0000_i1058">

0,60

0,70

0,80

0,16

0,16

-0,80

0,76

0,86

0,17

0,86

-0,86

0,09

0,93

0,09

0,93

-0,93

0,09

0,09

0,09

0,18

0,18

0,04

0,04

-0,18

0,04

0,13

0,13

0,03

 

-0,13

 

0,01

0,07

0,07

0,01

-0,07

 

0,01

 

0,01

0,01

0,02

0,02

-0,02

0,01

0,01

 

 

-0,01

 

<img src="/cache/referats/24968/image068.gif" v:shapes="_x0000_i1059">

1,00

1,00

1,00

Далі, думаємо

<img src="/cache/referats/24968/image070.gif" v:shapes="_x0000_i1060">

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

Підсумовуючи всі прирости <img src="/cache/referats/24968/image072.gif" v:shapes="_x0000_i1061">

<img src="/cache/referats/24968/image074.gif" v:shapes="_x0000_i1062">

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

Висновки

Я навчився розв’язувати системи лінійнихрівнянь методом релаксації змінних, та закріпив отримані навички розробкоюпрограми  на мові BorlandC++ 4.5.

Додаток А

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

<img src="/cache/referats/24968/image044.gif" v:shapes="_x0000_i1063">

<img src="/cache/referats/24968/image076.jpg" v:shapes="_x0000_i1064">

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

<span Courier New CYR";mso-ansi-language: EN-US">#include<iostream.h>

<span Courier New CYR";mso-ansi-language: EN-US">#include<math.h>

<span Courier New CYR";mso-ansi-language: EN-US">

<span Courier New CYR";mso-ansi-language: EN-US">int maximal(int n,double R0[]);

<span Courier New CYR";mso-ansi-language: EN-US">

<span Courier New CYR";mso-ansi-language: EN-US">void main(){

<span Courier New CYR";mso-ansi-language: EN-US">int i,j,n,f,k,iter;

<span Courier New CYR"">double S,det;

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

<span Courier New CYR";mso-ansi-language: EN-US">double *x=new double [n];

<span Courier New CYR";mso-ansi-language: EN-US">double **b=new double *[n];

<span Courier New CYR";mso-ansi-language: EN-US">for(i=0;i<n;i++)

<span Courier New CYR";mso-ansi-language: EN-US">  b[i]=new double[n+1];

<span Courier New CYR";mso-ansi-language: EN-US">double **a=new double *[n];

<span Courier New CYR";mso-ansi-language: EN-US">for(i=0;i<n;i++)

<span Courier New CYR";mso-ansi-language: EN-US">  a[i]=new double[n+1];

<span Courier New CYR"">cout<<«Введитеколичество итераций:»;

<span Courier New CYR"">cin>>iter;

<span Courier New CYR"">cout<<«Введитерасширенную матрицу:n»;

<span Courier New CYR";mso-ansi-language: EN-US">for(i=0;i<n;i++){

<span Courier New CYR";mso-ansi-language: EN-US">      for(j=0;j<=n;j++)

<span Courier New CYR";mso-ansi-language: EN-US">           

<span Courier New CYR"">cin>>b[i][j];

<span Courier New CYR"">}

<span Courier New CYR"">cout<<«Подготавливаюматрицу к релаксации...n»;

<span Courier New CYR";mso-ansi-language: EN-US">for(i=0;i<n;i++){

<span Courier New CYR";mso-ansi-language: EN-US">      for(j=0;j<n;j++)

<span Courier New CYR";mso-ansi-language: EN-US">        a[i][j]=-b[i][j]/b[i][i];

<span Courier New CYR";mso-ansi-language: EN-US">      a[i][n]=b[i][n]/b[i][i];

<span Courier New CYR";mso-ansi-language: EN-US">}

<span Courier New CYR";mso-ansi-language: EN-US">for(i=0;i<n;i++){

<span Courier New CYR";mso-ansi-language: EN-US">      for(j=0;j<n+1;j++)

<span Courier New CYR";mso-ansi-language: EN-US">            cout<<"  "<<a[i][j]<<" ||";

<span Courier New CYR";mso-ansi-language: EN-US">cout<<«n»;

<span Courier New CYR";mso-ansi-language: EN-US">}

<span Courier New CYR";mso-ansi-language: EN-US">double *x0=new double [n];

<span Courier New CYR";mso-ansi-language: EN-US">for(i=0;i<n;i++)

<span Courier New CYR";mso-ansi-language: EN-US">  x[i]=0.0;

<span Courier New CYR";mso-ansi-language: EN-US">double *R0=new double [n];

<span Courier New CYR"">cout<<«Введитезначения начальных приближений:n»;

<span Courier New CYR";mso-ansi-language: EN-US">for(i=0;i<n;i++)

<span Courier New CYR";mso-ansi-language: EN-US">      cin>>x0[i];

<span Courier New CYR";mso-ansi-language: EN-US">S=0.0;

<span Courier New CYR";mso-ansi-language: EN-US">for(i=0;i<n;i++){

<span Courier New CYR";mso-ansi-language: EN-US">      for(j=0;j<n;j++)

<span Courier New CYR";mso-ansi-language: EN-US">        S=S+a[i][j]*x0[i];

<span Courier New CYR";mso-ansi-language: EN-US">}

<span Courier New CYR";mso-ansi-language: EN-US">for(i=0;i<n;i++){

<span Courier New CYR";mso-ansi-language: EN-US">      R0[i]=a[i][n]-x0[i]+S;

<span Courier New CYR";mso-ansi-language: EN-US">      cout<<«R(»<<i<<")="<<R0[i]<<"| ";

<span Courier New CYR";mso-ansi-language: EN-US">}

<span Courier New CYR";mso-ansi-language: EN-US">f=maximal(n,R0);

<span Courier New CYR";mso-ansi-language: EN-US">det=R0[f];

<span Courier New CYR";mso-ansi-language: EN-US">for(k=0;k<iter;k++){

<span Courier New CYR";mso-ansi-language: EN-US">cout<<«det{»<<k<<"}="<<det<<«n»;

<span Courier New CYR";mso-ansi-language: EN-US"> for(i=0;i<n;i++){

<span Courier New CYR";mso-ansi-language: EN-US">      if(i!=f)R0[i]=R0[i]+a[i][f]*det;

<span Courier New CYR";mso-ansi-language: EN-US">       else R0[i]=R0[i]-det;

<span Courier New CYR";mso-ansi-language: EN-US"> }

<span Courier New CYR";mso-ansi-language: EN-US"> for(i=0;i<n;i++)

<span Courier New CYR";mso-ansi-language: EN-US">            cout<<«R[»<<i+1<<"]="<<R0[i]<<"    ";

<span Courier New CYR"">x[f]=x[f]+det;

<span Courier New CYR";mso-ansi-language: EN-US">f=maximal(n,R0);

<span Courier New CYR";mso-ansi-language: EN-US">det=R0[f];

<span Courier New CYR";mso-ansi-language: EN-US">}

<span Courier New CYR";mso-ansi-language: EN-US">cout<<«n»;

<span Courier New CYR";mso-ansi-language: EN-US">for(i=0;i<n;i++)

<span Courier New CYR";mso-ansi-language: EN-US"> cout<<«X{»<<i+1<<"}="<<x[i]<<«n»;

<span Courier New CYR";mso-ansi-language: EN-US">delete []x;

<span Courier New CYR";mso-ansi-language: EN-US">delete []R0;

<span Courier New CYR";mso-ansi-language: EN-US">delete []x0;

<span Courier New CYR";mso-ansi-language: EN-US">delete []a;

<span Courier New CYR";mso-ansi-language: EN-US">}

<span Courier New CYR";mso-ansi-language: EN-US">

<span Courier New CYR";mso-ansi-language: EN-US">int maximal(int n,double R0[]){

<span Courier New CYR";mso-ansi-language: EN-US">int i,f;

<span Courier New CYR";mso-ansi-language: EN-US">f=0.0;

<span Courier New CYR";mso-ansi-language: EN-US">for(i=0;i<n-1;i++){

<span Courier New CYR";mso-ansi-language: EN-US">  if(R0[i+1]>R0[i]) f=i+1;

<span Courier New CYR";mso-ansi-language: EN-US">}

<span Courier New CYR";mso-ansi-language: EN-US">return f;

<span Courier New CYR"">}

<span Courier New CYR"">

еще рефераты
Еще работы по математике