Портал освітньо-інформаційних послуг «Студентська консультація»

  
Телефон +3 8(066) 185-39-18
Телефон +3 8(093) 202-63-01
 (066) 185-39-18
Вконтакте Студентська консультація
 portalstudcon@gmail.com
 facebook.com/studcons

<script>

  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){

  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),

  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)

  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

 

  ga('create', 'UA-53007750-1', 'auto');

  ga('send', 'pageview');

 

</script>

Розробка програми для алгоритму знаходження власних векторів і власних значень методом обертань Якобі

Тип роботи: 
Курсова робота
К-сть сторінок: 
26
Мова: 
Українська
Оцінка: 
Курсова робота на тему:
 
«Розробка програми для алгоритму знаходження власних векторів і власних значень методом обертань Якобі» 
 
Зміст
 
Вступ 
1. Постановка задачі 
2. Опис алгоритмів і програм 
2.1. Основні відомості з лінійної алгебри. Власні значення та власні вектори матриці 
2.2. Знаходження власних векторів і власних значень матриць. Метод обертання Якобі 
2.3. Засоби формування інтерфейсу користувача 
3. Текст програми алгоритму методу обертання Якобі 
4. Результат роботи 
5. Вимоги до програмно-технічного забезпечення 
6. Інструкція користувача 
Список використаних джерел 
 
Вступ
 
Чисельні методи є одним з потужних математичних засобів вирішення задачі. Найпростіші чисельні методи ми використовуємо всюди, наприклад, витягуючи квадратний корінь на листку паперу.
Системи лінійних алгебраїчних рівнянь виникають як проміжний або остаточний етап при вирішенні ряду прикладних задач, що описуються диференціальними, інтегральними або системами нелінійних (трансцендентних) рівнянь. Вони можуть з'являтися як етап в задачах математичного програмування, статистичної обробки даних, апроксимації функцій, при дискретизації крайових диференціальних задач методом кінцевих різниць, методом кінцевих елементів, проекційними методами, в методі граничних елементів, дискретних особливостей, панельному методі аеродинамічного компонування літального апарату і т. д.
Матриці виникаючих систем можуть мати різні структури і властивості. Вже зараз є потреба у вирішенні систем лінійних алгебраїчних рівнянь з матрицями повного заповнення порядку декількох тисяч. При вирішенні низки прикладних задач методом кінцевих елементів в ряді випадків є системи, що володіють симетричними позитивно визначеними стрічковими матрицями порядку декілька десятків тисяч з половиною ширини стрічки до тисячі. І, нарешті, при використанні в ряді завдань методу скінченних різниць необхідно вирішити системи різницевих рівнянь з розрідженими матрицями порядку мільйон.
Одним з найпоширеніших методів вирішення систем лінійних рівнянь є метод обертань Якобі. Цей метод (який також називають методом простих ітерацій) відомий в різних варіантах вже більше 200 років
 
1. Постановка задачі
 
Завдання даної курсової роботи полягає в розробці програми для алгоритму знаходження власних векторів і власних значень методом обертань Якобі.
Першим завданням проекту є створення зрозумілого меню користувача.
Ввід даних та отримання вірного результату. Код меню користувача в додатку Б.
Друге завдання розробка функції що дозволяє знаходити власні вектори та власні значення методом Якобі. Код алгоритму в додатку А.
 
2. Опис алгоритмів і програм
 
2.1. Основні відомості з лінійної алгебри. Власні значення та власні вектори матриці
 
Якщо А – квадратна матриця n-го порядку і  при  , то число називається власним значенням матриці, а ненульовий вектор х – відповідним йому власним вектором. Перепишемо задачу в такому вигляді
  (1)
Для існування нетривіального розв’язку задачі (1) має виконуватися умова   (2) Цей визначник являє собою многочлен n-ї степені від ; його називають характеристичним многочленом. Значить, існує n власних значень – коренів цього многочлена, серед яких можуть бути однакові (кратні).
Якщо знайдено деяке власне значення, то, при підстановці його в однорідну систему (1), можна визначити відповідний власний вектор. Будемо нормувати власні вектори. Тоді кожному простому (не кратному) власному значенню відповідає один (з точністю до напрямку) власний вектор, а сукупність всіх власних векторів, що відповідають сукупності простих власних значень, лінійно-незалежна. Таким чином, якщо всі власні значення матриці прості, то вона має п лінійно-незалежних власних векторів, які утворюють базис простору.
Кратному власному значенню кратності р може відповідати від 1 до р лінійно-незалежних власних векторів. Наприклад, розглянемо такі матриці четвертого порядку:
  (3)
В кожної з них характеристичне рівняння приймає вигляд  , а отже, власне значення   і має кратність р=4. Проте в першої матриці є чотири лінійно-незалежних власних вектора   (4)
У другої матриці є тільки один власний вектор е1. Другу матрицю називають простою жордановою (або класичною) підматрицею. Третя матриця має так звану канонічну жорданову форму (по діагоналі стоять або числа, або жорданові підматриці, а інші елементи дорівнюють нулеві).
Таким чином, якщо серед власних значень матриці є кратні, то її власні вектори не завжди утворюють базис. Однак і в цьому випадку власні вектори, що відповідають різним власним значенням, являються лінійно-незалежними. [3, стор 156]
При розв’язуванні теоретичних і практичних задач часто виникає потреба визначити власні значення даної матриці А, тобто обчислити корені її вікового (характеристичного) рівняння
det (A – E) = 0 (2)
а також знайти відповідні власні векторі матриці А. Друга задача є простішою, оскільки якщо корені характеристичного рівняння відомі, то знаходження власних векторів зводиться до відшукання ненульових розв’язків деяких однорідних лінійних систем. Тому ми в першу чергу будемо займатися першою задачею – відшуканням коренів характеристичного рівняння (2).
Тут в основному застосовуються два прийоми: 1) розгортання вікового визначника в поліном n-го степеня D () = det (A – E) з подальшим розв’язком рівняння D () = 0 одним з відомих наближених, взагалі кажучи, способів (наприклад, методом Лобачевського-Греффе) наближене визначення коренів характеристичного рівняння (найчастіше найбільших по модулю) методом ітерації, без попереднього розгортання вікового визначника.
Розгортання вікового визначника.
Як відомо, віковим визначником матриці А = [aij] називається визначник вигляду
D () = det (A – E) =   (1)
Прирівнюючи цей визначник до нуля, одержуємо характеристичне рівняння
D () = 0
Якщо потрібно знайти все коріння характеристичного рівняння, то доцільно заздалегідь обчислити визначник (1).
Розгортаючи визначник (1), одержуємо поліном n-го степеня
  (2)
Де  
є сума усіх діагональних мінорів першого порядку матриці А.  
є сума всього діагонального мінору другого порядку матриці А;
- сума всіх діагональних мінорів третього порядку матриці А і т. д. Нарешті
n = det A.
Легко переконатися, що число діагональних мінорів k-го порядку матриці А дорівнює
  (k = 1, 2, …, n).
Звідси одержуємо, що безпосереднє обчислення коефіцієнтів характеристичного полінома (2) еквівалентно обчисленню визначників різних порядків. Остання задача, взагалі кажучи, технічно важко здійснена для скільки-небудь великих значень n. Тому створені спеціальні методи розгортання вікових визначників (методи обертання Якобі, А. М. Данілевського, Леверье, метод невизначених коефіцієнтів, метод інтерполяції та ін.).
 
2.2. Знаходження власних векторів і власних значень матриць. Метод обертання Якобі
 
Метод обертань Якобі застосовується тільки для симетричних матриць   (  =  ) і вирішує повну проблему власних значень і власних векторів таких матриць. Він заснований на знаходженні за допомогою ітераційних процедур матриці U в перетворенні подібності
Λ =  , а оскільки для симетричних матриць А матриця перетворення подібності   є ортогональною (  = ), то Λ =  , де Λ – діагональна матриця з власними значеннями на головній діагоналі
Нехай дана симетрична матриця А. Потрібно для неї обчислити з точністю ε всі власні значення і відповідні їм власні вектори. Алгоритм методу обертання наступний:
Нехай відома матриця  на k-й ітерації, при цьому для k = 0  = А.
Вибирається максимальний по модулю недіагональні елемент  матриці  .
Ставиться завдання знайти таку ортогональную матрицю  , щоб в результаті перетворення подібності   =  відбулося обнулення елемента  матриці  . В якості ортогональної матриці вибирається матриця обертання, що має наступний вигляд:
У матриці обертання на перетині i – го рядка і j – го стовпця знаходиться елемент   де  - кут обертання, що підлягає визначенню. Симетрично щодо головної діагоналі (j -й рядок, i -й стовпець) розташований елемент  . Діагональні елементи  дорівнюють відповідно    ; інші діагональні елементи   інші елементи у матриці обертання U (к) дорівнюють нулю.
Кут обертання   визначається з умови :
 ,
причому якщо  
Будується матриця  ,   = ,
в якій елемент  .
В якості критерію закінчення ітераційного процесу використовується умова малості суми квадратів поза діагональних елементів:
Якщо   то ітераційний процес:
  = 
триває. Якщо  , то ітераційний процес зупиняється, і в
якості шуканих власних значень приймаються    
     . Координатними стовпчиками власних векторів матриці А в одиничному базисі будуть стовпці матриці
 , тобто  
причому ці власні вектори будуть ортогональні між собою, тобто
.
 
2.3. Засоби формування інтерфейсу користувача
 
В додатку Б показаний код консольної програми для взаємодії з користувачем. Користувач вводить розмірність матриці (N). Після чого вводятся значення матриці. Коли значення введені перевіряється функцією (isSimmetrial) чи матриця симетрична. Якщо вона не симетрична програма почне роботу спочатку і запропонує ввести дані знову. Якщо ж матриця симетрична програма за допомогою функції (wrachenie) знайде власні вектори та власні значення та видасть їх на екран.
 
3. Текст програми алгоритму методу обертання Якобі
 
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
using System. Threading. Tasks;
 
namespace yacobi_sharp
{
class Program
{
static void Main (string[] args)
{
int i, j;
int size;
double precision;
Console. Write («Метод обертання Якобi. «) ;
error1:
Console. Write («\nВведiть розмiрнiсть матрицi (NxN) N = «) ;
size = int. Parse (Console. ReadLine ()) ;
double[, ] coefficients = new double[size, size];
double[, ] solution = new double[size, size];
Console. Write («\nВведiть елементи матрицi: \n») ;
 
for (i = 0; i < size; i++)
{
for (j = 0; j < size; j++)
{
solution[i, j] = 0;
}
solution[i, i] = 1;
}
for (i = 0; i < size; i++)
{
for (j = 0; j < size; j++)
{
Console. Write («A[{0}][{1}]: «, i + 1, j + 1) ;
coefficients[i, j] = double. Parse (Console. ReadLine ()) ; ;
}
}
Console. Write («Сформована матриця: \n») ;
for (i = 0; i < size; i++)
{
for (j = 0; j < size; j++)
{
Console. Write (« [{0}] «, coefficients[i, j]) ;
}
Console. WriteLine () ;
}
if (! isSimmetrial (coefficients, size))
{
Console. Write («Матриця не симетрична\n») ;
Console. Write («Введіть данні матриці знову! \n») ;
goto error1;
}
else
{
Console. Write («Введiть точнiсть розрахунку (е) : \n») ;
precision = double. Parse (Console. ReadLine ()) ;
int steps = wrachenie (coefficients, size, solution, precision) ;
Console. Write («Рiшення: \n») ;
for (i = 0; i < size; i++)
{
Console. Write («Власний вектор k {0}: \n», i + 1) ;
for (j = 0; j < size; j++)
{
Console. Write (solution[j, i] + «\n») ;
}
}
Console. Write («Власні значення: \n») ;
for (i = 0; i < size; i++)
{
Console. Write (coefficients[i, i] + «\n») ;
}
Console. Write («Загальна кiлькiсть крокiв: « + steps) ;
Console. Write («\nPress \»Enter\» to continue... «) ;
}
Console. ReadKey () ;
}
public static bool isSimmetrial (double[, ] coefficients, int numberOfEquation) /*функція перевірки
симетричності матриці*/
{
bool result = true;
int i, j;
for (i = 0; i < numberOfEquation; i++) /*перевірка усіх елементів
матриці крім головної дівгоналі*/
{
for (j = i + 1; j < numberOfEquation; j++)
{
if (coefficients[i, j]! = coefficients[j, i])
{
result = false;
break;
}
}
if (! result) { break; }
}
return result;
}
public static int wrachenie (double[, ] coefficients, int numberOfEquation,
double[, ] solution, double precision) /*алгоритм обертання*/ {
int result = 1;
int i, j, k;
int maxI=0, maxJ=0;
double max, fi;
double[, ] matricaPoworota = new double[numberOfEquation, numberOfEquation];
double[, ] temp = new double[numberOfEquation, numberOfEquation];
double fault = 0. 0;
for (i = 0; i < numberOfEquation; i++)
{
for (j = i + 1; j < numberOfEquation; j++)
{
fault = fault + coefficients[i, j] * coefficients[i, j];
}
}
fault = Math. Sqrt (2 * fault) ;
while (fault > precision)
{
max = 0. 0;
for (i = 0; i < numberOfEquation; i++)
{
for (j = i + 1; j < numberOfEquation; j++)
{
if (coefficients[i, j] > 0 && coefficients[i, j] > max)
{
max = coefficients[i, j];
maxI = i;
maxJ = j;
}
else if (coefficients[i, j] < 0 && -coefficients[i, j] > max)
{
max = -coefficients[i, j];
maxI = i;
maxJ = j;
}
}
}
for (i = 0; i < numberOfEquation; i++)
{
for (j = 0; j < numberOfEquation; j++)
{
matricaPoworota[i, j] = 0;
}
matricaPoworota[i, i] = 1;
}
if (coefficients[maxI, maxI] == coefficients[maxJ, maxJ])
{
matricaPoworota[maxI, maxI] = matricaPoworota[maxJ, maxJ] =
matricaPoworota[maxJ, maxI] = Math. Sqrt (2. 0) / 2. 0;
matricaPoworota[maxI, maxJ] = -Math. Sqrt (2. 0) / 2. 0;
}
else
{
fi = 0. 5 * Math. Atan ((2. 0 * coefficients[maxI, maxJ]) /
(coefficients[maxI, maxI] – coefficients[maxJ, maxJ])) ;
matricaPoworota[maxI, maxI] = matricaPoworota[maxJ, maxJ] = Math. Cos (fi) ;
matricaPoworota[maxI, maxJ] = -Math. Sin (fi) ;
matricaPoworota[maxJ, maxI] = Math. Sin (fi) ;
}
for (i = 0; i < numberOfEquation; i++)
{
for (j = 0; j < numberOfEquation; j++)
{
temp[i, j] = 0. 0;
}
}
for (i = 0; i < numberOfEquation; i++)
{
for (j = 0; j < numberOfEquation; j++)
{
for (k = 0; k < numberOfEquation; k++)
{
temp[i, j] = temp[i, j] + matricaPoworota[k, i] * coefficients[k, j];
}
}
}
for (i = 0; i < numberOfEquation; i++)
{
for (j = 0; j < numberOfEquation; j++)
{
coefficients[i, j] = 0. 0;
}
}
for (i = 0; i < numberOfEquation; i++)
{
for (j = 0; j < numberOfEquation; j++)
{
for (k = 0; k < numberOfEquation; k++)
{
coefficients[i, j] = coefficients[i, j] +
temp[i, k] * matricaPoworota[k, j];
}
}
}
fault = 0. 0;
for (i = 0; i < numberOfEquation; i++)
{
for (j = i + 1; j < numberOfEquation; j++)
{
fault = fault + coefficients[i, j] * coefficients[i, j];
}
}
fault = Math. Sqrt (2 * fault) ;
for (i = 0; i < numberOfEquation; i++)
{
for (j = 0; j < numberOfEquation; j++)
{
temp[i, j] = 0. 0;
}
}
for (i = 0; i < numberOfEquation; i++)
{
for (j = 0; j < numberOfEquation; j++)
{
for (k = 0; k < numberOfEquation; k++)
{
temp[i, j] = temp[i, j] + solution[i, k] * matricaPoworota[k, j];
}
}
}
for (i = 0; i < numberOfEquation; i++)
{
for (j = 0; j < numberOfEquation; j++)
{
solution[i, j] = temp[i, j];
}
}
result++;
}
return result;
}
}
}
 
4. Результат роботи
 
Запуск програми
 
Введення значень
 
Якщо матриця несиметричнa
 
Після правильно введених даних ввести точність визначення
 
Результат
 
5. Вимоги до програмно-технічного забезпечення
 
Створена програма не потребує високих системних вимог для її функціонування, оскільки була протестована на комп’ютері з наступними характеристиками:
  • операційна система – Windows XP Professional;
  • частота процесора – 1, 09 ГГц;
  • об’єм оперативної пам’яті – 512 Мб;
  • відеопам’ять відеокарти – 256 Мб.
Враховуючи, що програму було розроблено на платформі. NET Framework 4. 0, яка сумісна з операційними системами Windows XP Professional та вище, мінімальні вимоги до системи наступні:
  • операційна система – Windows: XP Professional, Vista, 7, 8;
  • частота процесора – 1 ГГц та вище;
  • об’єм оперативної пам’яті – 512 Мб та вище;
  • відеопам’ять відеокарти – 256 Мб та вище;
  • вільна пам’ять на диску – 2 Мб;
  • програмна платформа -. NET Framework 4. 0 або вище.
 
6. Інструкція користувача
 
Запуск програми
При запуску програми на екрані користувача висвітится назва алгоритму, та запропонує ввести величину матриці. Оскільки використовуєтся квадратна матриця (NxN) вводиться тільки одне значення N.
Введення значень матриці А
Після величини матриці потрібно ввести значення матриці.
Перевірка симетричності
Після введених даних йде перевірка симетричності матриці оскільки тільки з такою матрицею працює метод Якобі. Якщо матриця не симетрична програма повертається на момент введення величина
матриці. Якщо ж симетрична алгоритм йде далі.
Введення точності
Після перевірки в минулому кроці потрібно ввести точність ε.
Результат
Після правильного введення всіх даних на екрані висвітиться результат
на екран. Буде показано власні вектори та власні значення вказаної матриці.
 
Висновок
 
При виконанні даної курсової роботи було вивчено метод обертання Якобі рішення симетрично повної проблеми власних значень.
Цей метод при невеликих розмірах матриць дає непогані результати, і дозволяє з великою точністю обчислювати власні значення. При великих розмірах матриць реалізація методу наштовхується на великі втрати машинних ресурсів (через необхідність пошуку максимального елемента матриці, і перемноження матриць великої розмірності). Також різко звужує можливість застосувати даний метод на практиці тому, що він може бути застосований лише до симетричних матриць.
Зважаючи на вищесказане, цей метод на практиці застосовується рідко, частіше застосовується циклічний метод Якобі з бар'єрами. Швидкість збіжності якого так само асимптотично квадратична.
 
Список використаних джерел:
 
  1. Демидович Б. П., Марон І. А. Основи обчислювальної математики. – 3-е вид. – М. : Наука, 1966. – 560 с.
  2. Ільїн В. А., Позняк Е. Г. Лінійна алгебра: Підруч. Для вузів – 4-е вид. – М. : Наука. Фізмат. літ, 1999. – 296 с.
  3. Каліткін Н. Н. Чисельні методи. – М. : Мир, 1988. – 512 с.
  4. Мальцев А. І. Основи лінійної алгебри. – 3-вид. – М. : Наука, 1968. – 402 с.
  5. Марчук Г. И. Методи обчислювальної математики – М. : Наука, 1977. – 392с.
  6. Форсайт Дж., Малькольм М., Моулер К. Машинні методи математичних обчислень: Пер. з англ. – М. : Мир, 1980. – 277 с.
Фото Капча