Лабораторна робота з «Чисельні методи»
Автор: Matv • Октябрь 31, 2023 • Лабораторная работа • 4,153 Слов (17 Страниц) • 127 Просмотры
Лабораторна робота №2
з дисципліни: «Чисельні методи»
Завдання (Варіант 4):
Напишіть програму визначення нуля заданої функції однією з алгоритмічних мов. Програма має містити чотири алгоритми, які грунтуються на таких методах: половинного ділення, хорд,Ньютона; комбінованого хорд і дотичнихВихіднідані для програми: [а, б]–інтервал ізоляції кореня; f(x) –функція, нуль якої відшукується.Результатом роботи програми є масив, який містить у собі таблицю послідовних наближень нуля функції і значень самої функції,атакож графіки функції та пошуку.
Виконання завдання:
Які методи та формули використані:
- У всіх методах використовується інтервал [a, b] як початковий інтервал для пошуку кореня.
- При обчисленні похибки використовується умова error >= epsilon, де epsilon - задана точність пошуку.
- Метод половинного ділення:
- Використовується формула x = (a + b) / 2 для знаходження середини інтервалу.
- У кожній ітерації перевіряється, на якому півінтервалі розташований корінь функції.
- Вибирається новий інтервал [a, x] або [x, b] залежно від положення кореня.
- Повторюється до досягнення заданої точності.
- Метод хорд:
- Використовується формула x = (a * f(b) - b * f(a)) / (f(b) - f(a)) для знаходження нового наближення до кореня.
- У кожній ітерації розраховується значення функції f(x) для нового x.
- Вибирається новий інтервал [a, x] або [x, b] залежно від знаку f(x).
- Повторюється до досягнення заданої точності.
- Метод Ньютона:
- Використовується формула x = x - f(x) / f'(x) для знаходження нового наближення до кореня.
- У кожній ітерації розраховується значення похідної функції f'(x) для поточного x.
- Вибирається новий інтервал [a, x] або [x, b] залежно від знаку f(x).
- Повторюється до досягнення заданої точності.
- Комбінований метод хорд і дотичних:
- Поєднує принципи методів хорд і Ньютона.
- Використовується формула x = x - f(x) * (xTangent - x) / (f(xTangent) - f(x)), де xTangent - точка перетину дотичної до графіка функції з осі абсцис з відрізком [a, b].
- У кожній ітерації розраховується значення функції f(x) та похідної функції f'(x) для поточного x та xTangent.
- Вибирається новий інтервал [a, x] або [x, b] залежно від знаку f(x).
- Повторюється до досягнення заданої точності.
Код написаних функцій:
//метод половиного ділення
public static List<IterationResult> bisectionMethod(Function function, double a, double b, double epsilon) {
List<IterationResult> results = new ArrayList<>();
double fa = function.evaluate(a);
double fb = function.evaluate(b);
if (fa * fb >= 0) {
System.out.println("No root found in the given interval for Bisection Method");
return results;
}
int iteration = 0;
double x = a;
double fx = fa;
double error = Math.abs(b - a);
while (error >= epsilon) {
double prevX = x;
x = (a + b) / 2;
fx = function.evaluate(x);
if (fa * fx < 0) {
b = x;
fb = fx;
} else {
a = x;
fa = fx;
}
error = Math.abs(x - prevX);
results.add(new IterationResult(iteration, x, fx));
iteration++;
}
return results;
}
//метод хорд
public static List<IterationResult> chordMethod(Function function, double a, double b, double epsilon) {
List<IterationResult> results = new ArrayList<>();
double fa = function.evaluate(a);
double fb = function.evaluate(b);
if (fa * fb >= 0) {
System.out.println("No root found in the given interval for Chord Method");
return results;
}
int iteration = 0;
double x = a;
double fx = fa;
double error = Math.abs(b - a);
while (error >= epsilon) {
double prevX = x;
x = (a * function.evaluate(b) - b * function.evaluate(a)) / (function.evaluate(b) - function.evaluate(a));
fx = function.evaluate(x);
if (fa * fx < 0) {
b = x;
fb = fx;
} else {
a = x;
fa = fx;
}
error = Math.abs(x - prevX);
results.add(new IterationResult(iteration, x, fx));
iteration++;
}
return results;
}
...