МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
ІКТА
кафедра ЗІ
ЗВІТ
До лабораторної роботи №5
з курсу: «Комп’ютерні методи дослідження інформаційних процесів та систем»
на тему: «Метод Ньютона для розв’язування систем нелінійних алгебраїчних рівнянь (СНЛАР)»
Варіант №9
МЕТА РОБОТИ
Ознайомлення з найпоширенішим ітераційним методом розв’язування систем нелінійних рівнянь – методом Ньютона.
КОРОСТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ
Модифікований метод Ньютона.
При використанні стандартного методу Ньютона на кожній ітерації доводиться обчислювати новий якобіан , хоч зрозуміло, що при закінченні ітерацій він повинен прийняти стабільне значення , де –розв'язок. У модифікованому або спрощеному методі Ньютона якобіан заміняють правильно підібраною матрицею А. Звичайно, найкращим, але практично недосяжним варіантом була б заміна , де - розв'язок.
Але на практиці користуються компромісним рішенням:
– вибирають за А якобіан в початковій точці , a ітерації проводять за наступною формулою
– зберігають А протягом певного числа ітерацій;
– на певній r-й ітерації змінюють А, прирівнюючи її якобіану і з новим значенням знову виконують певне число ітерацій і т.д.
Отже, якобіан обчислюється тільки час від часу, за рахунок чого досягається економія машинного часу. Однак, збіжність методу при цьому близька до лінійної.
ЗАВДАННЯ
БЛОК-СХЕМА АЛГОРИТМУ
СПИСОК ІДЕНТИФІКАТОРІВ КОНСТАНТ, ЗМІННИХ, ФУНКЦІЙ, ВИКОРИСТАНИХ У ПРОГРАМІ, ТА ЇХ ПОЯСНЕННЯ
Main() – головний метод; input() – метод зчитування введених даних;
class Program – клас, який містить тільки головну функцію Main(); class Main – клас, у якому відбуваються усі дії;
Console.ReadLine() та Console.ReadKey() – функція зчитування з клавіатури;
Console.WriteLine() та Console.Write() – функції виведення на екран;
Convert.ToDouble() – функція конвертування у тип Double;
try {} catch (Exception) {} – функція перехоплення винятку;
goto – оператор переходу виконання коду до відповідної мітки; for() – оператор циклі з передумовою; if {} else {} – оператор умови;
ТЕКСТ ПРОГРАМИ
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace kmd_lab5
{
class Program
{
static void Main(string[] args)
{
Main p = new Main();
p.input(); p.iterations();
p.output(); p.verify();
Console.Write("\nPress <Enter> to exit..."); Console.ReadKey();
}
}
class Main
{
double[,] A = new double[2, 2]; double[,] A1 = new double[2, 2];
double[] X = new double[2]; double[] X1 = new double[2];
double[] D = new double[2]; double[] F = new double[2];
double det, x1, x2, d, e; int h, n = 0;
public void input()
{
Console.WriteLine(" --- Введiть початковi наближення, похибку та крок:");
for (int i = 0; i < 2; i++)
{
Console.Write(" x{0} = ", i + 1);
X[i] = Convert.ToDouble(Console.ReadLine());
}
Console.Write(" e = "); e = Convert.ToDouble(Console.ReadLine());
Console.Write(" h = "); h = Convert.ToInt32(Console.ReadLine());
}
public void prJakob(double[] J)
{ // якобіан
A[0, 0] = 1.0 - 2 * J[0];
A[0, 1] = -2.0 * J[1];
A[1, 0] = -2.0 * J[1];
A[1, 1] = 1.0 - 2.0 * J[0];
det = A[0, 0] * A[1, 1] - A[0, 1] * A[1, 0];
A1[0, 0] = A[1, 1] / det;
A1[0, 1] = -A[0, 1] / det;
A1[1, 0] = -A[1, 0] / det;
A1[1, 1] = A[0, 0] / det;
}
public void prFunk(double[] R)
{
F[0] = R[0] - R[0] * R[0] + R[1] * R[1] - 0.1;
F[1] = R[1] - 2.0 * R[0] * R[1] - 0.1;
}
public void prDob(double[,] J, double[] G)
{
D[0] = 0.0; D[1] = 0.0;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
D[i] += J[i, j] * G[j];
}
}
}
public void prX1()
{
for (int i = 0; i < 2; i++)
{
X1[i] = X[i] - D[i];
}
}
public void prod()
{
prFunk(X);
prDob(A1, F);
prX1();
}
public void iterations()
{
do
{
if (n % h == 0) prJakob(X);
prod();
x1 = Math.Abs(F[1] + F[0]) / 2.0;
prFunk(X1);
x2 = Math.Abs(F[1] + F[0]) / 2.0;
d = Math.Abs(x1 - x2);
X = X1; n++;
} while (d > e);
}
public void output()
{
Console.WriteLine("\n --- Коренi: ");
for (int i = 0; i < 2; i++)
{
Console.Write(" X[{0}] = {1:0.#####}\n", i + 1, X1[i]);
}
}
public void verify()
{
Console.WriteLine("\n --- Перевiрка:");
Console.WriteLine(" Рiвняння 1:\t " + (X1[0] - Math.Pow(X1[0], 2) + Math.Pow(X1[1], 2) - 0.1) + " = 0");
Console.WriteLine(" Рiвняння 2:\t " + (X1[1] - 2 * X1[0] * X1[1] - 0.1) + " = 0");
}
}
}
РЕЗУЛЬТАТ РОБОТИ ПРОГРАМИ
ВИСНОВОК
Отже, під час лабораторної роботи я ознайомився з найпоширенішим ітераційним методом розв’язування систем нелінійних рівнянь – методом Ньютона. За допомогою методу Ньютона склав алгоритм розв’язування СНЛАР.