Topics

Solve the equation:

where .

Idea

Since f(x) is a non-increasing function on , binary search on real domain can be used to find the root. Note that it can be the case that there’s no solution:

  • f(0) is -ve, so as we go from 0 to 1, our function will continue to be -ve
  • f(1) is +ve, implies that function is +ve for all values in

Code

double eval(double x, double p, double q, double r, double s, double t,
            double u) {
  return p * exp(-x) + q * sin(x) + r * cos(x) + s * tan(x) + t * x * x + u;
}
 
bool check(double x, double p, double q, double r, double s, double t,
           double u) {
  return eval(x, p, q, r, s, t, u) >= 0;
}
 
void solve() {
  double p = -1, q, r, s, t, u;
  cin >> p >> q >> r >> s >> t >> u;
  if (p == -1)
    return;
  double lo = 0, hi = 1;
  double ans, eps = 1e-6;
 
  // comparison with eps just for precision safety
  if (eval(1, p, q, r, s, t, u) >= eps or eval(0, p, q, r, s, t, u) < -eps) {
    cout << "No solution" << endl;
  } else {
    for (int i = 0; i < 50; ++i) {
      double mid = (lo + hi) / 2;
      if (check(mid, p, q, r, s, t, u)) {
        lo = mid;
        ans = lo;
      } else {
        hi = mid;
      }
    }
    cout << fixed << setprecision(4) << ans << endl;
  }
}