-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRootFinder.java
More file actions
110 lines (87 loc) · 3.74 KB
/
RootFinder.java
File metadata and controls
110 lines (87 loc) · 3.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import java.util.Scanner;
import java.util.Locale;
// Задача 3: Нахождение корня функции
public class RootFinder {
public static double f(double x) {
return Math.pow(x, 3) + x + 1;
}
public static double fPrime(double x) {
return 3 * Math.pow(x, 2) + 1;
}
// Метод половинного деления
public static double bisectionMethod(double a, double b, double epsilon) {
if (f(a) * f(b) >= 0) {
System.out.println("На отрезке [" + a + ", " + b + "] нет корня или несколько корней");
return Double.NaN;
}
double c = a;
while ((b - a) >= epsilon) {
c = (a + b) / 2;
if (f(c) == 0.0) {
break;
} else if (f(c) * f(a) < 0) {
b = c;
} else {
a = c;
}
}
return c;
}
// Метод Ньютона
public static double newtonMethod(double initialGuess, double epsilon) {
double x = initialGuess;
int maxIterations = 100;
int iteration = 0;
while (iteration < maxIterations) {
double h = f(x) / fPrime(x);
x = x - h;
if (Math.abs(h) < epsilon) {
break;
}
iteration++;
}
return x;
}
public static void main(String[] args) {
// Устанавливаем локаль для корректного чтения чисел с точкой
Scanner scanner = new Scanner(System.in).useLocale(Locale.US);
System.out.println("Выберите метод решения:");
System.out.println("1 - Метод половинного деления");
System.out.println("2 - Метод Ньютона");
System.out.print("Ваш выбор (1 или 2): ");
int choice = 0;
if (scanner.hasNextInt()) {
choice = scanner.nextInt();
} else {
System.out.println("Ошибка: введите целое число 1 или 2");
scanner.close();
return;
}
double root = Double.NaN;
switch (choice) {
case 1:
System.out.print("Введите левую границу a: ");
double a = scanner.nextDouble();
System.out.print("Введите правую границу b: ");
double b = scanner.nextDouble();
System.out.print("Введите точность (например, 0.000001): ");
double epsilon1 = scanner.nextDouble();
root = bisectionMethod(a, b, epsilon1);
break;
case 2:
System.out.print("Введите начальное приближение: ");
double initialGuess = scanner.nextDouble();
System.out.print("Введите точность (например, 0.000001): ");
double epsilon2 = scanner.nextDouble();
root = newtonMethod(initialGuess, epsilon2);
break;
default:
System.out.println("Неверный выбор. Допустимые значения: 1 или 2");
}
if (!Double.isNaN(root)) {
System.out.printf("Найденный корень: %.6f\n", root);
System.out.printf("Значение функции в точке корня: %.10f\n", f(root));
}
scanner.close();
}
}