Реферат: Метод релаксации переменных при решении систем линейных уравнений
Вступ
Бурхливий розвитокновітньої техніки й все більше впровадження сучасних розділів математикинезмірно підвищили вимоги до математичної підготовки фахівців і вдосконалюваннютехніки програмування. Програмістам, що займаються прикладним, системним або 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"">