Частина тексту файла (без зображень, графіків і формул):
Міністерство освіти та науки України
Національний університет “Львівська політехніка”
Звіт до лабораторної роботи № 3
з курсу “Комп’ютерні методи дослідження систем керування”
МЕТОДИ УТОЧНЕННЯ КОРЕНІВ
НЕЛІНІЙНИХ РІВНЯНЬ
Варіант #3
Мета роботи: вивчити основні методи уточнення коренів нелінійних рівнянь з одним невідомим.
Теоретичні відомості:
Нехай нам дано відрізок на якому є локалізовано корінь , при цьому В якості початкового наближення кореня приймаємо середину цього відрізку
. (2.1)
Далі досліджуємо значення функції на кінцях відрізків та , тобто в крапках , , . Той з відрізків, на кінцях якого приймає значення різних знаків, містить шуканий корінь, і тому його приймаємо в якості нового відрізку . Другу половину відрізку , на якому знак не змінюється, відкидаємо. В якості першого наближення кореня приймаємо середину нового відрізку
(2.2)
і т.д. Таким чином, k-е наближення обчислюється так
. (2.3)
Після кожної ітерації відрізок, на якому розміщений корінь, зменшується вдвоє, а після k ітерацій він звужується в разів:
. (2.4)
Графічна ілюстрація методу зображена на рис. 3.
Якщо наближений розв’язок необхідно знайти з точністю до деякого заданого малого числа , тоді має виконуватися така умова
. (2.5)
Ітераційний процес можна завершити і тоді, коли значення функції після k-ї ітерації стане по модулю меншим , тобто
.
Завдання:
Метод поділу ділянки навпіл з пошуком ділянки локалізації
№3
Код програми:
//Метод поділу ділянки навпіл з пошуком
//ділянки локалізаціїї
#include <iostream>
#include <math.h>
#include <iomanip>
using namespace std;
double a = 0.0, b = 0, h = 0.001, x = 0;
double eps = 0.0001;
double fa = 0, fb = 0, fx = 0;
int i = 1;
void main()
{
setlocale(0, "");
//Пошук ділянки локалізації
b = a + h;
fa = sin(a / 4) - log(a);
fb = sin(b / 4) - log(b);
if ((fabs(fb) > fabs(fa)) && (fa*fb > 0))
h *= (-1);
b = a + h;
fb = sin(b / 4) - log(b);
while (fa*fb > 0)
{
a = b;
b = a + h;
fa = sin(a / 4) - log(a);
fb = sin(b / 4) - log(b);
}
cout << endl;
//Ітераційний процес
do
{
x = (a + b) / 2;
fa = sin(a / 4) - log(a);
fx = sin(x / 4) - log(x);
if (fx*fa > 0) a = x;
else b = x;
cout << "\t" << setw(4) << " X[" << i << "]= "
<< setw(8)<< x << "\t" << endl;
i += 1;
} while (fx < eps);
cout << endl;
//Перевірка
double part = sin(x / 4) - log(x);
int int_part = (int)part;
cout << endl;
if ((int_part) == 0)
cout <<"\t Вiдповiдь вiрна!" << endl;
else cout << "\t Вiдповiдь не вiрна!" << endl;
cout << "\t Значення виразу при пiдстановцi знайденого Х" << endl
<< "\t у задану функцiю: " << sin(x / 4) - log(x);
fgetchar();
}
Результат роботи програми:
/