МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ІКТА
кафедра БІТ
З В І Т
до лабораторної роботи №5
з курсу: «Комп’ютерні методи дослідження інформаційних процесів та систем»
на тему: «МЕТОД НЬЮТОНА ДЛЯ РОЗВ’ЯЗУВАННЯ СИСТЕМ НЕЛІНІЙНИХ РІВНЯНЬ»
Мета роботи - ознайомлення з найпоширенішим ітераційним методом розв’язування систем нелінійних рівнянь – методом Ньютона.
1.Короткі теоретичні відомості
Стандартний метод Ньютона
Метод Ньютона базується на лінеаризації задачі і заміні розв'язування нелінійної системи (2) на послідовність розв'язувань лінійних систем (найчастіше прямими методами).
Будемо вважати, що система рівнянь (2) має розв'язок; позначимо його через вектор і розкладемо кожну функцію в ряд Тейлора в околі розв'язку
(2)
де - члени другого і вищих порядків.
Вважаючи, що дуже близьке до , знехтуємо членами вищих порядків і запишемо систему рівнянь в лінеаризованій формі:
(3)
або в іншому вигляді
(4)
де – матриця Якобі (якобіан) системи (1)
Враховуючи, що є розв'язком системи, згідно з (2) можемо записати:
Звідси випливає, що і праву частину (4) також можна прирівняти до нуля:
(5)
Розв'язком системи (5) є нове значення вектора X, яке не точно дорівнює значенню вектора (оскільки знехтували членами другого і вищих порядків). Використовуючи верхні індекси для позначення послідовності ітерацій, можна записати
(6)
Звідси
(7)
де - обернена матриця Якобі; .
У достатньо широкому околі розв'язку ітераційний процес (7) збігається, якщо .
Ітераційний процес закінчується при виконанні умови
(8)
де Σ - задана гранична похибка уточнень коренів системи (1).
Таким чином, алгоритм стандартного методу Ньютона можна розбити на декілька кроків.
Крок 1. Вибір вектора початкових уточнень
.
Крок 2. Обчислення елементів матриці Якобі.
Крок 3. Обчислення елементів оберненої матриці Якобі.
Крок 4. Перемноження значень функції (див. формулу (7))
Крок 5. Одержаний на кроці 4 вектор віднімається від вектора , у результаті чого одержується покращений вектор розв'язку .
Крок 6. Перевірка умови закінчення ітерацій (8). Якщо вона не виконується, то за вектор початкових уточнень приймається вектор і проводиться наступна ітерація, починаючи з кроку 2.
При використанні стандартного методу Ньютона слід мати на увазі наступне.
1. Стандартний метод Ньютона надзвичайно ефективний.
2. Збіжність на початку ітераційного процесу, як правило, лінійна.
3. Починаючи з деякого кроку ( уточнити його попередньо неможливо), збіжність різко прискорюється і стає квадратичною.
4. Бувають випадки, коли метод розбігається або спостерігається зациклювання ітерацій. Тому необхідно обмежувати максимальну кількість ітерацій деяким попередньо заданим числом.
Основний недолік методу полягає в повторних обчисленнях на кожному кроці вектора , матриці Якобі , оберненої матриці Якобі . Тому на практиці досить часто з метою зменшення витрат машинного часу використовують стандартний метод Ньютона без обертання матриці Якобі.
Позначаючи
(9)
перепишемо (6) у вигляді
(10)
Таким чином, задача зводиться до пошуку вектора поправок (приростів) із системи лінійних алгебраїчних рівнянь (10), у якій матрицею коефіцієнтів при невідомих є матриця Якобі , а вектором-стовпцем вільних членів служить вектор значень функції – . Розв'язуючи цю систему одним із відомих методів (як правило, це представники групи прямих методів – метод Гаусса з вибором головних елементів, метод LU – факторизації та ін.) , знаходимо . Значення визначаємо із виразу
(11)
Завдання до лабораторної роботи
Розв’яжіть систему нелінійних рівнянь одним із методів, вказаних викладачем, вибираючи за початкові наближення . Ітерації проводити до збігу двох послідовних наближень з похибкою .
13)
3.Блок-схема алгоритму програми
4. Текст програми
using System;
namespace tarasko
{
class Program
{
static void Main()
{
Metod M = new Metod();
M.Obrach();
}
}
class Metod
{
public double f1(double x10, double x20)
{
return x10-x10/(x10*x10+x20*x20)-0.4;
}
public double f2(double x10, double x20)
{
return x20 - ( x20) / (x10 * x10 + x20 * x20)+1;
}
public double df1dx1(double x10, double x20)
{
return 1 - ((x20 * x20 - x10 * x10)/Math.Pow((x10*x10+x20*x20),2.0));
}
public double df1dx2(double x10, double x20)
{
return x10 * 2 * x20 / Math.Pow((x10 * x10 + x20 * x20), 2.0);
}
public double df2dx1(double x10, double x20)
{
return(x20*2*x10)/Math.Pow((x10*x10+x20*x20),2.0);
}
public double df2dx2(double x10, double x20)
{
return 1 - (x20 * x20 - x10 * x10) / Math.Pow((x10 * x10 + x20 * x20), 2.0);
}
public void Obrach()
{
double x10 = -1, x20 = 1, h = 0.00001;
double delX1, delX2, poh;
Console.WriteLine("Початковi наближення \n x10= " + x10 + "\n x20= " + x20 + " \nПохибка= " + h);
if ((df1dx1(x10, x20) * df2dx2(x10, x20) - df1dx2(x10, x20) * df2dx1(x10, x20)) != 0)
do
{
delX1 = df1dx2(x10, x20) * f2(x10, x20) - df2dx2(x10, x20) * f1(x10, x20);
delX2 = df2dx1(x10, x20) * f1(x10, x20) - df1dx1(x10, x20) * f2(x10, x20);
poh = delX1 / x10;
x10 += delX1;
x20 += delX2;
}
while (Math.Abs(poh) > h);
else Console.WriteLine("Визначник Якобiана=0");
Console.WriteLine("Результат :\n x1=" + x10 + "\n x2=" + x20);
Console.ReadKey();
}
}
}
5. Результати роботи програми
/
Висновок:У даній лабораторній роботі я навчився розв’язувати системи нелінійних алгебраїчних рівнянь за допомогою за допомогою методу Ньютона. Використовуючи цей алгоритм ми суттєво скорочуєм час на обчислення нелінійних алгебраїчних рівнянь.