#include #include #include using namespace std; typedef long double real; real m_cos(real k, real a, real b) { real result = k*(a - b) + cos(k*a); if (result <= -1) { return -1; } return result; } real M_cos(real k, real a, real b) { real result = k*(b - a) + cos(k*b); if (result >= 1) { return 1; } return result; } real m_sin(real k, real a, real b) { real result = k*(a - b) + sin(k*a); if (result <= -1) { return -1; } return result; } real M_sin(real k, real a, real b) { real result = k*(b - a) + sin(k*b); if (result >= 1) { return 1; } return result; } real m_f(real a, real b) { return m_cos(314, a, b) - M_cos(650, a, b) - 1; } real M_f(real a, real b) { return M_cos(314, a, b) - m_cos(650, a, b) - 1; } real m_fp(real a, real b) { return m_sin(650, a, b) - M_sin(314, a, b); } real M_fp(real a, real b) { return M_cos(650, a, b) - m_cos(314, a, b); } real f(real x) { return cos(314*x) - cos(650*x); } ofstream out("results.txt"); real eps = 10; void update_eps(real x) { x = abs(x); if (eps > x) { eps = x; } } int sgn(real x) { return (x > 0) - (x < 0); } real binary_search(real a, real b) { if (a > b) { throw("The empty segment error"); } while (true) { if (a == b) { return a; } real c = (a + b)/2; if (c < a || c > b) { if (abs(f(a)) < abs(f(b))) { return a; } else { return b; } } real f_a = f(a); real f_b = f(b); if (f_a == 0 && f_b == 0) { return c; } if (f_a == 0) { return a; } if (f_b == 0) { return b; } if (c == a || c == b) { return c; } real f_c = f(c); if (f_c == 0 || sgn(f_a) == sgn(f_b)) { return c; } if (sgn(f_a) == sgn(f_c)) { a = c; } else { b = c; } } } void search(real a, real b) { if (a > b) { return; } if (m_f(a, b) > 0 || M_f(a, b) < 0) { return; } update_eps(m_f(a, b)); update_eps(M_f(a, b)); if (m_fp(a, b) >= 0 || M_fp(a, b) <= 0) { out << "There is the unique solution " << binary_search(a, b) << " in the interval " << (f(a) == 0 ? '[' : '(') << a << "," << b << (f(b) == 0 ? ']' : ')') << "\n"; return; } update_eps(m_fp(a, b)); update_eps(M_fp(a, b)); real c = (a + b)*0.5; if (c <= a || c >= b) { cout << "The solutions in the segment [" << a << "," << b << "] are possible\n"; out << "The solutions in the segment [" << a << "," << b << "] are possible\n"; return; } search(a, c); search(c, b); } int main() { search(0, M_PI); cout << "Epsilon = " << eps << endl; return 0; }