You are on page 1of 20

Звіт

Практична робота 1
з дисципліни ”Чисельні методи”
Варіанти (18 , 22)

Підгрупа 2
Підготували студентки групи ІК-23
Пастушок Тетяна
Семена Дар’я
Пастушок Тетяна 18 варіант

Функція спадає на інтервалах (π/2 + 2kπ, 11π/6 + 2kπ) і (5π/2 + 2kπ, 7π/6 + 2kπ),
та зростає на інтервалах (11π/6 + 2kπ, 5π/2 + 2kπ) і (7π/6 + 2kπ, π/2 + (2k+1)π).
Інтервали невизначеності [(-31/30), (31/30)]
Функція зростає на інтервалах (11π/6 + 2kπ, 11π/6 + (2k+1)π), та спадає на
інтервалах (11π/6 + (2k+1)π, 11π/6 + 2(k+1)π).
Інтервал невизначеності [(-5/3), (5/3)]

Код на c#, за допомогою якого вирішені завдання:

using System;

namespace ЧМ1
{

class Program
{
static void Main(string[] args)
{
string exit = " ";
do
{
Console.WriteLine("Choose a function:");
Console.WriteLine("1. f(x) = (sin(x)^2) + (1/30)*sin(x)-(1/30)");
Console.WriteLine("2. g(x) = (sin(x)^2)- (1/3)*sin(x) + (1/36)");
int s = Convert.ToInt32(Console.ReadLine());
double a, b, e;
input(out a, out b, out e);

if (s == 1)
{
Bissection(a, b, e, f);
hord(a, b, e, f);
sec(a, b, e, f);
}
else if (s == 2)
{
Bissection(a, b, e, g);
hord(a, b, e, g);
sec(a, b, e, g);
}
else
{
Console.WriteLine("Invalid function choice");
}

Console.Write("To continue press 1, to exit press 2:\t ");


exit = Console.ReadLine();
} while (exit != "2");
}

static void Bissection(double a, double b, double e, Func<double, double> f)


{
double c;
int iter = 0;
while (b - a > e)
{
c = ((a + b) / 2);
if ((f(b) * f(c)) < 0) a = c;
else b = c;
iter++;
}
Console.WriteLine($"Bissection\nx={(a + b) / 2}, {iter}");
}

static void sec(double a, double b, double e, Func<double, double> f)


{
int iter = 0;
double res = a;
double f1 = 1;
double f0;
while (Math.Abs(f1) > e)
{
f1 = f(res);
f0 = f(b);
res = res - f1 / (f0 - f1) * (b - res);
iter++;
}
Console.WriteLine($"sec\nx={res}, {iter}");
}
static void hord(double a, double b, double e, Func<double, double> f)
{
double c;
int iter = 0;
while (Math.Abs(b - a) > e)
{
c = b;
b = b - (b - a) * f(b) / (f(b) - f(a));
a = c;
iter++;
}
Console.WriteLine($"hord\nx={b}, {iter}");
}

static void input(out double a, out double b, out double e)


{
Console.Write("Enter a left x\t");
a = Convert.ToDouble(Console.ReadLine());
Console.Write("Enter a right x\t");
b = Convert.ToDouble(Console.ReadLine());
Console.Write("Enter e\t");
e = Convert.ToDouble(Console.ReadLine());
}
static double f(double x)
{
double f = Math.Pow(Math.Sin(x), 2) + 1 / 30.0 * Math.Sin(x) - 1 / 30.0;
return f;
}
static double g(double x)
{
double g = Math.Pow(Math.Sin(x), 2) + (1 / 3.0) * Math.Sin(x) + 1 / 16.0;
return g;
}
}
}
Методи для рівняння f(x)
1) Точність 10 −4

2) Точність10 −5
3) Точність 10 −6

Методи для рівняння g(x)


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

2)Точність 10 −5
3)Точність 10 −6

Похибки :
Для функції f(x)
Ми знаємо точні корені функції через програму С# , то ми можемо обчислити
абсолютну похибку функції для кожної точності, використовуючи формулу:
похибка = |виміряний корінь - точний корінь|
1)
ε 1= | -0,3707 - 0,167449951171875| = 0,203250048828125
ε 2=|-0,37076 - 0,16744613647460938 | = 0,2033138634746094
ε 3= | -0,370768 - 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)
ε 21=¿− 0.3707 −0.16752761309286454∨¿ 0.20317238690713544
ε 21=¿− 0.37076 −0.1674545884523666∨¿ 0.20330541154763343
ε 21=¿− 0.370768 −0.16744861205691702∨¿ 0.20331938794308298

δ 21=¿ 0.16752761309286454 /−0.3707∨¿ 0.4520566589443279


δ 21=¿ 0.1674545884523666/ −0.37076∨¿ 0.4518864641244257
δ 21 =¿ 0.16744861205691702/− 0.370768∨¿ 0.4518782169693005

Для функції g(x)


ε 1= | 0,2254 -(- 0,499969482421875)| = 0.725369482421875
ε 2=|0,225403 -(- 0,499969482421875) | = 0.7253991853027344
ε 3= | 0,225403 - (-0,4999995231628418 )| = 0.7254025231628418

δ 1=|(- 0,499969482421875) / 0,2254| =2.219466266963643


δ 2 = |(- 0,499969482421875) / 0,225403| = 2.2188730089419886
δ 3= |(-0,4999995231628418 ) / 0,225403| = 2.220360454987607

Проаналізувавши похибки можна сказати , що значення абсолютної похибки


збільшується зі зменшенням точності, але залишається досить малим для всіх
випадків.
Відносні похибки зменшуються зі зменшенням точності, що є очікуваним результатом.
Всі значення відносних похибок є досить малими, тому можна сказати, що значення
кореня було обчислено досить точно.

Семена Дар’я 22 варіант


Код:

using System;

namespace ЧМ1
{

class Program
{
static void Main(string[] args)
{
string exit = " ";
do
{
Console.WriteLine("Choose a function:");
Console.WriteLine("1. f(x) = Math.Pow(Math.Log10(x), 2) + (5.0 / 3) * Math.Log10(x) - (2.0 / 3)");
Console.WriteLine("2. g(x) = Math.Pow(Math.Log10(x), 2) - (2.0 / 3) * Math.Log10(x) + 1.0 / 9");
int s = Convert.ToInt32(Console.ReadLine());
double a, b, e;
input(out a, out b, out e);

if (s == 1)
{
Bissection(a, b, e, f);
hord(a, b, e, f);
sec(a, b, e, f);
}
else if (s == 2)
{
Bissection(a, b, e, g);
hord(a, b, e, g);
sec(a, b, e, g);
}
else
{
Console.WriteLine("Invalid function choice");
}

Console.Write("To continue press 1, to exit press 2:\t ");


exit = Console.ReadLine();
} while (exit != "2");
}

static void Bissection(double a, double b, double e, Func<double, double> f)


{
double c;
int iter = 0;
while (b - a > e)
{
c = ((a + b) / 2);
if ((f(b) * f(c)) < 0) a = c;
else b = c;
iter++;
}
Console.WriteLine($"Bissection\nx={(a + b) / 2}, {iter}");
}

static void sec(double a, double b, double e, Func<double, double> f)


{
int iter = 0;
double res = a;
double f1 = 1;
double f0;
while (Math.Abs(f1) > e)
{
f1 = f(res);
f0 = f(b);
res = res - f1 / (f0 - f1) * (b - res);
iter++;
}
Console.WriteLine($"sec\nx={res}, {iter}");
}

static void hord(double a, double b, double e, Func<double, double> f)


{
double c;
int iter = 0;
while (Math.Abs(b - a) > e)
{
c = b;
b = b - (b - a) * f(b) / (f(b) - f(a));
a = c;
iter++;
}
Console.WriteLine($"hord\nx={b}, {iter}");
}

static void input(out double a, out double b, out double e)


{
Console.Write("Enter a left x\t");
a = Convert.ToDouble(Console.ReadLine());
Console.Write("Enter a right x\t");
b = Convert.ToDouble(Console.ReadLine());
Console.Write("Enter e\t");
e = Convert.ToDouble(Console.ReadLine());
}
static double f(double x)
{
double f = Math.Pow(Math.Log10(x), 2) + (5.0 / 3) * Math.Log10(x) - (2.0 / 3);
return f;
}
static double g(double x)
{
double g = Math.Pow(Math.Log10(x), 2) - (2.0 / 3) * Math.Log10(x) + 1.0 / 9;
return g;
}
}
}

Методи для f(x)


1) 10 −4

2) 10 −5

3) 10 −6
Методи для g(x)
1) 10 −4

2) 10 −5

3) 10 −6
Похибки :
Для функції f(x)
1)
ε 1= | 0,8355 – 2,1544720001220696 | = 1.31897200012
ε 2= | 0,83555 - 2,154434819221496 | = 1.31888481922
ε 3= | 0,835493 - 2,154434461712837 | = 1.31894146171

δ 1= | 2,1544720001220696 / 0,8355 | = 2.57866187926


δ 2= | 2,154434819221496 / 0,83555 | = 2.5784630713
δ 3= | 2,154434461712837 / 0,835493 | = 2.57863855438
2)
ε 21 = | 0,8355 - 2,154434690107338 | = 1.31893469011
ε 22 = | 0,83555 - 2,154434690107338 | = 1.31888469011
ε 23 = | 0,835493 - 2,1544346900318834 | = 1.31894169003

δ 21 = | 2,154434690107338 / 0,8355 | = 2.57861722335


δ 22 = | 2,154434690107338 / 0,83555 | = 2.57846291677
δ 23 = | 2,1544346900318834 / 0,835493 | = 2.57863882765
3)
ε 31 = | 0,8355 - 2,1544104291682276 | = 1.31891042917
ε 32 = | 0,83555 - 2,1544343600803937 | = 1.31888436008
ε 33 = | 0,835493 - 2,1544347285106977 | = 1.31894172851

δ 31 = | 2,1544104291682276 / 0,8355 | = 2.57858818572


δ 32 = | 2,1544343600803937 / 0,83555 | = 2.57846252179
δ 33 = | 2,1544347285106977 / 0,835493 | = 2.57863887371

Для функції g(x)


1)
ε 1= | 0,1509 – 0,0010457611083984374 | = 0.14985423889
ε 2= | 0,15083 - 0,0010028600692749024 | = 0.14982713993
ε 3= | 0,150826 - 0,0010003575086593628 | = 0.14982564249

δ 1= | 0,0010457611083984374 / 0,1509 | = 0.00693015976


δ 2= | 0,0010028600692749024 / 0,15083 | = 0.00664894297
δ 3= | 0,0010003575086593628 / 0,150826 | = 0.00663252694
2)
ε 21 = | 0,1509 - 2,15457842473032 | = 2.00367842473
ε 22 = | 0,15083 - 2,1544476497915195 | = 2.00361764979
ε 23 = | 0,150826 - 2,1544358586193706 | = 2.00360985862

δ 21 = | 2,15457842473032 / 0,1509 | = 14.2781870426


δ 22 = | 2,1544476497915195 / 0,15083 | = 14.2839464947
δ 23 = | 2,1544358586193706 / 0,150826 | = 14.2842471366
3)
ε 31 = | 0,1509 - 2,198224122602517 | = 2.0473241226
ε 32 = | 0,15083 - 2,1695719161379623 | = 2.01874191614
ε 33 = | 0,150826 - 2,1593362431064294 | = 2.00851024311

δ 31 = | 2,198224122602517 / 0,1509 | = 14.5674229463


δ 32 = | 2,1695719161379623 / 0,15083 | = 14.3842200898
δ 33 = | 2,1593362431064294 / 0,150826 | = 14.3167374531

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

1. Сформулюйте постановку задачі розв'язування


нелінійного рівняння з одним невідомим.
Постановка задачі розв'язування нелінійного рівняння з
одним невідомим полягає в знаходженні значення цього
невідомого, яке задовольняє нелінійне рівняння.
Формально, ми маємо нелінійне рівняння з одним невідомим
x:
f(x) = 0
де f(x) - нелінійна функція.
Задача полягає в знаходженні всіх значень x, для яких
виконується f(x) = 0.
Зазвичай, це рівняння не можна вирішити аналітично, тому
використовуються чисельні методи для знаходження
наближених значень розв'язку. Найпростіші з цих методів -
ітераційні методи, такі як метод Ньютона або метод простої
ітерації.
У загальному випадку, задача розв'язування нелінійного
рівняння є важливою складовою чисельних методів та
застосовується в багатьох областях науки та інженерії, де
необхідно знайти наближений розв'язок складних
математичних моделей.

2. Дайте пояснення термiнів «вiдокремлення коренiв


нелінійного
рiвняння» та «уточнення коренiв нелінійного рiвняння».
Знаходження наближених розв’язків рівняння
складається з двох етапів:
1. Відокремлення коренів, тобто знаходження досить
малих відрізків, на кожному з яких міститься один і
лише один корінь рівняння. У загальному випадку
формалізувати цей процес неможливо.
2. Уточнення коренів (обчислення коренів із неперед
заданою точністю ε).
Розв’язок починається з вибору початкової точки x 0

і оцінки нев’язки рівняння ξ = f( x ) ≠ 0. Далі будується


0

послідовність уточнень x з використанням або


n

інформації про знак нев’язки (нев’язка змінює знак


при проходженні через точку розв’язку), або про
значення самої нев'язки ξ , або про швидкість її зміни
∂ξ/∂x.
3. Сформулюйте теореми, на яких грунтуються
аналітичні методи вiдокремлення коренiв.

Теорема 1 (існування кореня). Якщо функція


неперервна на і набуває на кінцях цього відрізка
протилежних значень, тобто то всередині
відрізка існує хоча б один корінь рівняння .

Теорема 2 (існування і єдиності кореня). Якщо функція
неперервна та диференційована на і
набуває на кінцях цього відрізка протилежних значень, а
похідна зберігає сталий знак всередині відрізка, то
рівняння всередині відрізка має корінь, причому
єдиний.
4. Що означає фраза «корiнь рівняння обчислено iз
заданою точнiстю» ?
Фразу «корiнь рівняння обчислено iз заданою точнiстю»треба
розумiти так. Нехай ξ – точний корiнь рiвняння, а x¯ – його
наближення з точнiстю ε. Це означає, що |ξ − x¯| ≤ ε.
5. Основна ідея методів бісекції та хорд. Запишiть
розрахунковi формули для кожного з цих методiв.

Метод хорд має також назви: метод пропорційних


частин, метод хибного положення, метод лінійного
інтерполювання.

Точка x ділить відрізок на дві частини і для продовження


1

ітерацій вибирають ту з них, на кінцях якої функція f(x) має


протилежні знаки.
Продовжуючи цей процес, дістанемо послідовність x , x , ... , x , ...
1 2 n

наближень до кореня x рівняння.


Метод хорд – це метод простої ітерації з функцією


Метод бісекції  або метод поділу  відрізка  навпіл —
найпростіший чисельний метод для вирішення нелінійних
рівнянь виду f(x)=0. Передбачається тільки безперервність
функції f(x). Пошук ґрунтується на теоремі про проміжні
значення

6. Дайте геометричну iлюстрацiю методу бісекції та


хорд.
Метод бісекції

Метод хорд
Полягає в тому, що на досить малому відрізку функція
замінюється хордою і точка перетину хорди з
віссю Ox є наближеним значенням кореня.
7. Який порядок збіжності мають методи бісекції та
хорд?
Метод половинного ділення, ітерацій і хорд мають
лінійну збіжність.

8. Яким чином можна з’ясувати порядок збіжності


методу, аналізуючи залежність похибки поточного
наближення від номера ітерації?
Для визначення порядку збіжності чисельного методу
розв'язання задачі можна використовувати залежність
похибки поточного наближення від номера ітерації.
Нехай ми маємо чисельний метод з послідовністю
наближень {x_n} для розв'язання задачі. Для знаходження
порядку збіжності необхідно виконати наступні кроки:
1 Обчислити значення розв'язку методом для двох
початкових значень, які відрізняються на малий крок h: x_h =
x_0 + h і x_2h = x_0 + 2h.
2 Обчислити відповідні похибки методу: e_h = |x_h - x| і e_2h
= |x_2h - x|, де x - справжній розв'язок задачі.
3 Обчислити оцінку порядку збіжності методу за формулою:
p = ln (e_h / e_2h) / ln 2
де ln - натуральний логарифм.
Отримане значення p вказує на порядок збіжності методу.
Якщо p = 1, то метод має лінійну збіжність, якщо p > 1, то
метод має супер-лінійну або квадратичну збіжність, а якщо p
< 1, то метод має погану збіжність.
Для більш точних оцінок порядку збіжності можна
виконувати обчислення для більш ніж двох початкових
значень, використовуючи більш складні формули для оцінки
порядку збіжності, такі як формула Річардсона.

You might also like