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

  
Телефон +3 8(066) 185-39-18
Телефон +3 8(093) 202-63-01
 (093) 202-63-01
 studscon@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
Мова: 
Українська
Оцінка: 

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 с.
Фото Капча