Условие
Используйте метод бисекции для того, чтобы отыскать с точностью [latex]\varepsilon[/latex] все действительные корни уравнения [latex]\ln{(1 + x^2 -\sin{x})} = 3^{\cos{2x}}[/latex]. Для подготовки необходимых графиков воспользуйтесь этим ресурсом.
График
Тесты
Точность [latex]\epsilon[/latex] | Корень на [latex](-4; -3)[/latex] | Корень на [latex](-3; -2)[/latex] | Корень на [latex](-1; 0)[/latex] | Корень на [latex](1; 2)[/latex] | Корень на [latex](2; 3)[/latex] | Корень на [latex](3; 4)[/latex] |
0.1 | -3.40625 | -2.78125 | -0.84375 | 1.21875 | 2.71875 | 3.40625 |
0.01 | -3.42578 | -2.75391 | -0.839844 | 1.21484 | 2.72266 | 3.41016 |
0.001 | -3.42627 | -2.75439 | -0.836426 | 1.21729 | 2.72021 | 3.41357 |
0.0001 | -3.42636 | -2.75443 | -0.836884 | 1.21707 | 2.72061 | 3.41391 |
Код
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 |
#include <iostream> #include<cmath> using namespace std; double f(double x) { return log(1 + x*x - sin(x)) - pow(3, cos(2*x)); } double findRoot(double a, double b, double e) // функция, которая ищет ноль на промежутке от a до b { while (b - a > e) // пока не будет достигнута необходимая точность { if (f(a) * f((b + a) / 2) == 0) break; else if (f(a) * f((b + a) / 2) > 0) a = (b + a) / 2; else b = (b + a) / 2; } return (b + a) / 2; } int main() { double e; cin >> e; cout << findRoot(-4, -3, e) << endl; cout << findRoot(-3, -2, e) << endl; cout << findRoot(-1, 0, e) << endl; cout << findRoot(1, 2, e) << endl; cout << findRoot(2, 3, e) << endl; cout << findRoot(3, 4, e) << endl; return 0; } |
Решение
Рассмотрим функцию [latex]f(x) = \ln{(1 + x^2 -\sin{x})} — 3^{\cos{2x}}[/latex]. По графику видно, что функция имеет 6 нулей. Таким образом, уравнение имеет 6 корней, которые находятся на интервалах [latex](-4; -3)[/latex], [latex](-3; -2)[/latex], [latex](-1; 0)[/latex], [latex](1; 2)[/latex], [latex](2; 3)[/latex], [latex](3; 4)[/latex] соответственно. Так как корней довольно много, чтобы не копировать 6 раз алгоритм поиска корня, вынесем его в отдельную функцию [latex]findRoot[/latex], у которой будет 3 параметра: начало отрезка [latex]a[/latex], его конец [latex]b[/latex] и заданная точность [latex]\epsilon[/latex].
Далее воспользуемся методом бисекции : рассмотрим значение функции на середине отрезка (в точке [latex]\frac{a + b}{2}[/latex]) и в точке [latex]a[/latex]. Если их произведение равно нулю, то [latex]\frac{a + b}{2}[/latex] — корень уравнения, если меньше, корень — на промежутке [latex](a; \frac{a + b}{2})[/latex], больше — на промежутке [latex](\frac{a + b}{2}; b)[/latex]. Меняем координаты начала и конца отрезка на соответствующие, продолжаем, пока не будет найден корень или достигнута необходимая точность.
Ссылки
Рабочая версия кода на Ideaone.com.
— Лучше использовать \varepsilon, а не \epsilon.
— Вставьте «необходимые графики» в текст статьи.
Спасибо, исправил эпсилон. Ссылка на график функции присутствует в описании решения.
Да я видел.
Но «вставить ссылку» и «вставить график» это «две большие разницы».
Добавил график.
Отлично! Засчитано.
Есть только несколько просьб по оформлению.
— Вы оформляете findRoot как математическую формулу. Но это не формула, это часть кода. Т.е. оформлять нужно при помощи тега code — findRoot().
— Желательно везде использовать \varepsilon.