You are on page 1of 13

Звіт

Комп’ютерний практикум 2
з дисципліни ”Чисельні методи”
Варіант 18

Підготувала студентка групи ІК-23


Пастушок Тетяна
Завдання 1:
1)Побудувати графіки функцій f (x) і g(x), попередньо дослідивши аналітично їх
характерні точки і особливості поведінки (інтервали зростання та спадання).
Визначити інтервали невизначеності всіх коренів.
2)Складіть програму, що реалізує алгоритм пошуку коренів рівнянь f (x) = 0 і g(x) = 0
методом Ньютона і спрощеним методом Ньютона з точністю 10^-4 ,10^-5 , 10^-6
.Порівняйте їх значення з результатами аналітичного дослідження функцій f (x) і g(x).
Визначте порядок збіжності методів Ньютона.
Код 1 завдання:
using System;

class Program
{
static void Main(string[] args)
{
Console.Write("Enter function (1-f, 2-g): ");
int s = Convert.ToInt32(Console.ReadLine());
Console.Write("Enter initial x:\t ");
double x = Convert.ToDouble(Console.ReadLine());
Console.Write("Enter e:\t ");
double e = Convert.ToDouble(Console.ReadLine());

Console.WriteLine("Newton's method:");
Newton(x, e, s);

Console.WriteLine("Simplified Newton's method:");


Simplified_Newton(x, e, s);
}

static void Newton(double x, double e, int s)


{
if (s == 1)
{
int iter = 0;
double prevx = x;
while (Math.Abs(F(x)) >= e)
{
iter++;
x = prevx - (F(prevx) / df(prevx));
prevx = x;
}
Console.WriteLine("X: " + x + " iterations: " + iter);
}
else
{
int iter = 0;
double prevx = x;
while (Math.Abs(G(x)) >= e)
{
iter++;
x = prevx - (G(prevx) / dg(prevx));
prevx = x;
}
Console.WriteLine("X: " + x + " iterations: " + iter);
}
}

static void Simplified_Newton(double x, double e, int s)


{
if (s == 1)
{
int iter = 0;
double prevx = x;
double df0 = df(x);
while (Math.Abs(F(x)) >= e)
{
iter++;
x = prevx - (F(prevx) / df0);
prevx = x;
}
Console.WriteLine("X: " + x + " iterations: " + iter);
}
else
{
int iter = 0;
double prevx = x;
double dg0 = dg(x);
while (Math.Abs(G(x)) >= e)
{
iter++;
x = prevx - (G(prevx) / dg0);
prevx = x;
}
Console.WriteLine("X: " + x + " iterations: " + iter);
}
}
static double F(double x)
{
double f = Math.Pow(Math.Sin(x), 2) + (1.0 / 30) * Math.Sin(x) - (1.0 / 30);
return f;
}
static double df(double x)
{
double df = Math.Sin(2 * x) + Math.Cos(x) / 30; ;
return df;
}
static double G(double x)
{
double g = Math.Pow(Math.Sin(x), 2) - (1.0 / 3) * Math.Sin(x) + (1.0 / 36);
return g;
}
static double dg(double x)
{
double dg = Math.Sin(2 * x) + Math.Cos(x) / 3;
return dg;
}

Перший метод – метод Ньютона (Newton`s method). Метод, який дозволяє знайти
наближений корінь рівняння. Для використання цього методу функція має бути
диференційовною
Наближення кореня за формулою:
f ( xn )
x n+1=x n −
f ' (xn )
Другий метод – спрощений метод Ньютона(Simplified Newton`s method). Аналогічно
методу Ньютона, функція має бути диференційовною. Даний метод дозволяє не
обчислювати похідну на кожній ітерації, а, отже, і позбутися можливого ділення на
нуль. Однак цей алгоритм має тільки лінійну збіжність.
Наближення кореня виконую за формулою:
f ( xn )
x n+1=x n −
f ' ( x0 )

Результат коду для функції f(x) :


1) Точність 10^-4

2)Точність 10^-5

3)Точність 10^-6
Результат для функції g(x)
1) Точність 10^-4

Точність 10^-5
2) Точність 10^-6

Похибки:
Ми можемо обчислити абсолютну похибку функції для кожної точності,
використовуючи формулу:
похибка = |виміряний корінь - точний корінь|
Виміряний корінь :
Root p(x) :
Для точності 10^-4: x = 0.7391
Для точності 10^-5: x = 0.739085
Для точності 10^-6: x = 0.739085
Root q(x) = 0.8654
1)ε 1= | 0.7391 - 0,167449951171875| = 0,203250048828125
ε 2=|0.739085 - 0,16744613647460938 | = 0,2033138634746094
ε 3= | 0.739085 - 0,1674485206604004 | = 0,2033194796604004
Обчислити відносну похибку можна за формулою:
δ 0=
||ε1
ε
δ 1=|0.167449951171875 / -0.3707| = 0.451848884058167
δ 2 = |0.16744613647460938 / -0.37076| = 0.45178701476875126
δ 3= |0.1674485206604004 / -0.370768| = 0.45178900549972214
2)
ε 21 = |-0.3707 - (-6.1157372)| = 5.7450372
ε 22 = |-0.37076 - (-6.1157372)| = 5.7449772
ε 23 = |-0.370768 - (-6.1157372)| = 5.7449682

δ 21 = |-6.1157372 / (-0.3707)| = 16.4798051


δ 22 = |-6.1157372 / (-0.37076)| = 16.4788998
δ 23 = |-6.1157372 / (-0.370768)| = 16.4788721

Завдання 3:
1) Побудувати графіки функцій p (x) і q(x), попередньо дослідивши
аналітично їх характерні точки і особливості поведінки (інтервали зростання та
спадання). Визначити інтервали невизначеності всіх коренів.
Завдання 4. Складіть програму, що реалізує алгоритм пошуку коренів рівнянь p (x) = 0
і q(x) = 0 методом простої ітерації з точністю
10^-4,10^-5,10^-6. Порівняйте їх значення з результатами аналітичного дослідження
функцій f (x) і g(x). Дайте визначення умов збіжності методу.

Корінь :0,0286263100802898
(-∞ ;+∞ )
• Функція зростає на інтервалах (-∞, -√(cos x / 3)] та [√(cos x / 3), +∞);
• Функція спадає на інтервалах [-√(cos x / 3), 0] та [0, √(cos x / 3)].
2)
Корінь : 0,9098757319152355
(-∞ ;+∞ )
Тому функція зростає на інтервалах (-∞, -0,298) та (0,499, +∞), та спадає на інтервалі (-
0,298, 0,499).

Код для завдання 4:

using System;

namespace SimpleIterationMethod
{
class Program
{
static void Main(string[] args)
{
const double e1 = 1e-4; // accuracy of 10^-4
const double e2 = 1e-5; // accuracy of 10^-5
const double e3 = 1e-6; // accuracy of 10^-6

Console.WriteLine("Finding the roots of p(x) = x^3 - sin(x) using simple iteration method...");
double p1 = SimpleIterationMethod(x => Math.Pow(Math.Sin(x), 1.0 / 3.0), 0.5, e1);
double p2 = SimpleIterationMethod(x => Math.Pow(Math.Sin(x), 1.0 / 3.0), 0.5, e2);
double p3 = SimpleIterationMethod(x => Math.Pow(Math.Sin(x), 1.0 / 3.0), 0.5, e3);
Console.WriteLine($"Root of p(x) with accuracy of {e1}: {p1}");
Console.WriteLine($"Root of p(x) with accuracy of {e2}: {p2}");
Console.WriteLine($"Root of p(x) with accuracy of {e3}: {p3}");

Console.WriteLine();

Console.WriteLine("Finding the roots of q(x) = x^3 + 0.1(x^2) + 0.4x - 1.2 using simple iteration method...");
double q1 = SimpleIterationMethod(x => Math.Pow(1.2 - 0.4 * x - 0.1 * x * x, 1.0 / 3.0), 0.5, e1);
double q2 = SimpleIterationMethod(x => Math.Pow(1.2 - 0.4 * x - 0.1 * x * x, 1.0 / 3.0), 0.5, e2);
double q3 = SimpleIterationMethod(x => Math.Pow(1.2 - 0.4 * x - 0.1 * x * x, 1.0 / 3.0), 0.5, e3);
Console.WriteLine($"Root of q(x) with accuracy of {e1}: {q1}");
Console.WriteLine($"Root of q(x) with accuracy of {e2}: {q2}");
Console.WriteLine($"Root of q(x) with accuracy of {e3}: {q3}");

Console.ReadKey();
}

static double SimpleIterationMethod(Func<double, double> f, double x0, double e)


{
double x = x0;
int i = 0;
while (Math.Abs(f(x) - x) > e)
{
x = f(x);
i++;
}
Console.WriteLine($"Number of iterations: {i}");
return x;
}
}
}
Результат коду :

Даний код використовує метод простої ітерації для знаходження коренів двох різних
функцій: p(x) = x^3 - sin(x) та q(x) = x^3 + 0.1x^2 + 0.4x - 1.2.

Метод простої ітерації є ітеративним методом чисельного аналізу, який заснований на


ітераційному виконанні функції. Виконання методу простої ітерації вимагає збіжності
ітераційної послідовності до кореня функції. Ця послідовність будується на основі
початкової точки x_0, і функції f(x) такої, що x=f(x).

Умовою збіжності методу є те, що похідна функції f(x) на інтервалі, що містить


корінь, повинна бути меншою за одиницю за модулем. Ця умова може бути записана
як |f'(x)|<1.
У даному коді функції p(x) та q(x) мають похідні, які менші за одиницю за модулем на
відповідних інтервалах, тому метод простої ітерації збігається до коренів цих функцій.

Отже, виконання коду дає коректні результати, які представлені на екрані.

Контрольні запитання:

1.Основна ідея методу Ньютона полягає у знаходженні нуля нелінійної функції шляхом
апроксимації її лінійною функцією та знаходженням точки перетину цієї лінії з віссю
абсцис.

2.Розрхункова формула методу Ньютона:


f ( xn )
x n+1=x n −
f ' (xn )
Розрахункова формула спрощеного методу Ньютона :
f ( xn )
x n+1=x n −
f ' ( x0 )
3.Основна відмінність між методом Ньютона і спрощеним методом Ньютона полягає в
тому, що в методі Ньютона при кожному кроці використовується поточна точка для
обчислення похідної функції, тоді як у спрощеному методі Ньютона використовується
початкова точка.

4.Геометрична ілюстрація методу Ньютона полягає в знаходженні нуля функції шляхом


побудови лінії, яка касається графіку функції та перетинає вісь абсцис в точці нуля
функції. Геометрична ілюстрація спрощеного методу Ньютона полягає в знаходженні
нуля функції шляхом побудови лінії, яка касається графіку функції та перетинає вісь
абсцис в точці, що відповідає початковій точці.

5. Швидкість збіжності методу Ньютона є квадратичною, тоді як швидкість збіжності


спрощеного методу Ньютона є лінійною.
6. Достатні умови збіжності методу Ньютона:
*Початкове наближення повинно бути достатньо близьким до кореня.
*Похідна функції на всьому інтервалі між початковим наближенням та коренем
*повинна бути неперервною та відмінною від нуля.
*Значення похідної функції не повинно змінюватися занадто швидко на цьому
інтервалі.
7. Основна ідея методу простих ітерацій полягає в тому, щоб замінити складну
функцію, корені якої потрібно знайти, еквівалентною функцією, яка має корінь на тому
ж самому інтервалі, але є досить простою для ітераційного процесу.
8. Розрахункові формули методу простих ітерацій:
*Початкове наближення: x0.
*Загальна формула: xi+1 = g(xi), де g(x) - ітераційна функція.
*Формула з лінеаризацією: xi+1 = xi - f(xi) / f'(xi), де f(x) - складна функція.
9. Достатні умови збіжності методу ітерацій:
*Ітераційна функція g(x) повинна бути неперервною на відрізку [a, b] та
диференційованою на (a, b).
*Максимальне значення похідної ітераційної функції на відрізку [a, b] повинно бути
менше за одиницю: |g'(x)| < 1, ∀x ∈ [a, b].
*Початкове наближення повинно бути достатньо близьким до кореня.
10.

Метод простих ітерацій - це ітераційний чисельний метод для розв'язування рівнянь, який базується
на перетворенні вихідного рівняння у вигляд, який дозволяє легко знаходити корені. Метод простих
ітерацій використовується для розв'язування рівнянь у вигляді f(x) = 0, де f(x) - це функція, яка задає
рівняння.

Для методу простих ітерацій різні варіанти збіжності можуть відрізнятися за вибором функції г, яка
використовується для ітерацій. Одним з варіантів є використання функції г(x) = x - λf(x), де λ - додатня
константа. У цьому випадку, збіжність методу залежить від значення λ та властивостей функції f(x).
Якщо λ вибрано надто великим, метод може не збігатися, а якщо занадто малим, то метод може
збігатися дуже повільно.

Геометрично ілюструючи метод простих ітерацій для функції г(x) = x - λf(x), можна представити
процес ітерації як рух точки x по прямій y = x, під кутом, що дорівнює нахилу функції г(x) в точці x.
Якщо нахил функції г(x) в точці x менший за одиницю, то точка x збігається до кореня рівняння. Якщо
нахил дорівнює одиниці, то точка x стає нерухомою, що свідчить про незбіжність методу. Якщо нахил
більший за одиницю, то точка x віддаляється від кореня рівняння, що свідчить про нестабільність
методу.

You might also like