Частина тексту файла (без зображень, графіків і формул):
Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Інститут комп’ютерних наук та інформаційних технологій
/
ЛАБОРАТОРНА РОБОТА № 4
з дисципліни:
"Чисельні методи"
на тему:
«Метод хорд і дотичних»
ЛАБОРАТОРНА РОБОТА № 4
Тема роботи:
Метод хорд і дотичних.
Мета роботи:
Вивчити і засвоїти ітераційні методи розв’язування алгебраїчних і трансцендентних рівнянь.
Теоретичні відомості:
Метод хорд – метод лінійної інтерполяції (метод пропорційних частин, метод січних). Ідея методу полягає в тому, що на досить малому проміжку дугу кривої заміняють хордою, а за наближене значення кореня приймають точку перетину хорди з віссю ОХ.
Значення функції визначаються в точках, що розташовані на осі через рівні інтервали. Це робиться доти, поки кінці інтервалів , не будуть мати різні знаки. Тоді пряма, що проведена через ці дві точки, перетинає вісь абсцис у точці
/
У методі дотичних здійснюється екстраполяція за допомогою дотичної до кривої в даній точці :
/
Початкове наближення слід вибирати з умови
/
Однією з головних проблем при застосуванні методу Ньютона є необхідність аналітичного опису похідної. Якщо це складно чи неможливо, то можна застосувати її наближену оцінку. Тоді замість методу дотичних застосовується метод січних, за яким
/
де F′ () – наближена оцінка похідної, що розглядається як січна, а не як дотична, і може бути оцінена за формулою
/
Варіант 24:
Знайти один з коренів рівняння f(x)=0, використовуючи методи дотичних, хорд і простої ітерації. Провести дослідження кількості ітерацій для кожного з методів при зміні точності від до .
Код програми:
#include <iostream>
#include <Windows.h>
#include <cmath>
using namespace std;
double Function_Value(double x) { return x - cos(x); }
double Derivative_Value (double x) { return 1 + sin(x); }
double Derivative2_Value (double x) { return cos(x); }
int main() {
SetConsoleOutputCP(1251);
double X_n, X_m, X_mid;
double F_mid; double eps;
int count = 0;
cout << "ЛАБОРАТОРНА РОБОТА № 4" << endl;
for (int i = 0; i < 10; i++) {
X_n = Function_Value(i) > 0 ? 1 : -1;
X_m = Function_Value(i + 1) > 0 ? 1 : -1;
if (X_n != X_m) {
X_n = i;
X_m = i + 1;
break;
}
}
cout << "МЕТОД ХОРД:" << endl;
cout << "Точність\t Значення X\t Кількість ітерацій" << endl;
eps = 0.1;
for (int i = 0; i < 10; i++, eps /= 10) {
while (fabs(X_m - X_n) > eps) {
X_n = X_m - (X_m - X_n)*Function_Value(X_m) / (Function_Value(X_m) - Function_Value(X_n));
X_m = X_n - (X_n - X_m)*Function_Value(X_n) / (Function_Value(X_n) - Function_Value(X_m));
count++;
}
cout << eps << "\t\t" << X_m << "\t\t" << count << endl;
}
cout << "МЕТОД ДОТИЧНИХ:" << endl;
cout << "Точність\t Значення X\t Кількість ітерацій" << endl;
for (int i = 0; i < 10; i++) {
double k = Derivative2_Value(i)*Function_Value(i);
double squad = Derivative_Value(i)*Derivative_Value(i);
if (k > 0 && k < squad) {
X_n = i; break;
}
}
double X0 = X_n, X1 = X_n + 0.1;
eps = 0.1;
for (int i = 0; i < 10; i++, eps /= 10) {
count = 0;
do {
X_n = X_n - Function_Value(X_n) / Derivative_Value(X_n);
count++;
} while (fabs(Function_Value(X_n)) >= eps);
cout << eps << "\t\t" << X_n << "\t\t" << count << endl;
}
cout << "МЕТОД СІЧНИХ:" << endl;
cout << "Точність\t Значення X\t Кількість ітерацій" << endl;
for (eps = 0.1; eps > 1e-10; eps /= 10) {
count = 0;
double F_X0 = Function_Value(X0), F_X1 = Function_Value(X1);
while (1) {
count++;
X_mid = X0 - F_X0*(X1 - X0) / (F_X1 - F_X0);
F_mid = Function_Value(X_mid);
if (fabs(F_mid) < eps) break;
X0 = X1; F_X0 = F_X1;
X1 = X_mid; F_X1 = F_mid;
}
cout << eps << "\t\t" << X_mid << "\t\t" << count << endl;
}
system("pause>>void");
return 0;
}
Результат:
/
Графік:
/
/
/
/
Висновок:
В результаті виконання цієї лабораторної роботи, я вивчила ітераційні методи розв’язування алгебраїчних рівнянь, проаналізувала методи хорд, дотичних та січних. Привела залежності кількості ітерацій від точності обчислень. В результаті виконання обрахунків, за допомогою трьох методів, знайдено корінь рівняння, який дорівнює 0.739085.