快速计算三角方程c ++解的方法

时间:2017-11-03 07:15:55

标签: c++ equation-solving

c ++中下面的等式中最快的计算方法x是什么?

sin (a x) + b sin (c x)== d * x + e

我不需要非常精确的x值。 0.001的近似值是可以接受的。我也知道解决方案的间隔[x_0,x_1]。

我知道牛顿方法但是因为我要模拟一个系统,我需要解决数千次,我不知道如何给出第一个解决方案

2 个答案:

答案 0 :(得分:0)

我假设您正在寻找一个数字解决方案,给定已知参数abcd,{{ 1}}。通过这种脏迭代可以找到近似解。 但是不能保证收敛所有参数值。 唯一的方法是为解决方案提供分析上限和下限,并使用二分根发现进行迭代。

e

(为简单起见,这是C ++ 11)

答案 1 :(得分:0)

您可以将等式重新表示为

sin(a x)+ b sin(c x) - d * x - e == 0

现在,这是一个根发现问题。以下是root finding algorithms的列表。

Newton的方法非常快速且易于实现,因为可以通过分析计算方程的导数。

#include <array>
#include <iostream>
#include <cmath>

template <typename T> double func(const T &parameter, const double x) {
  const auto a = parameter[0];
  const auto b = parameter[1];
  const auto c = parameter[2];
  const auto d = parameter[3];
  const auto e = parameter[4];
  return sin(a * x) + b * sin(c * x) - (d * x + e);
}

template <typename T> double derivative(const T &parameter, const double x) {
  const auto a = parameter[0];
  const auto b = parameter[1];
  const auto c = parameter[2];
  const auto d = parameter[3];

  return a * cos(a * x) + b * c * cos(c * x) - d;
}

template <typename T> double solve(const T &parameter) {
  double x = 0.0;
  const double eps = 1e-9;
  while (fabs(func(parameter, x)) > eps) {
    x = x - func(parameter, x) / derivative(parameter, x);
  }
  return x;
}

int main() {
  const std::array<double, 5> parameter{1.1, 1.2, 0.9, 0.1, 0.1};
  const auto x = solve(parameter);
  std::cout << "solution is x=" << x << " f(x)=" << func(parameter, x) << '\n';
}

double转到float以加快速度,如果您希望的准确度允许的话。