Быстрый способ вычисления решения треугольного уравнения Stack Overflow

Какой самый быстрый способ вычисления х в уравнении ниже в C ++?

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

Мне не нужно очень точное значение х. приближение с 0,001 является приемлемым. Я также знаю взаимосвязь для решения [x_0, x_1].

Я знаю метод Ньютона, но поскольку я собираюсь смоделировать систему, и мне нужно решить, если тысячу раз, я не знаю, как дать первое решение

-5

Решение

Вы можете переформулировать свое уравнение как

грех (a x) + b sin (c x) — d * x — e == 0

Теперь это проблема поиска корня. Вот список для алгоритмы поиска корней.

Метод Ньютона очень быстр и прост в реализации, поскольку производная вашего уравнения может быть рассчитана аналитически.

#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 ускорить его, если ваша желаемая точность позволяет это.

0

Другие решения

Я полагаю, вы ищете численный решение, учитывая известные параметры a,b,c,d,e, Приблизительное решение может быть найдено с помощью этой грязной итерации.
Но не гарантируется сходство для всех значений параметров.
Единственный способ сделать это — дать аналитическую верхнюю и нижнюю границу для решения и выполнить итерацию с поиском корня пополам.

#include<numeric>
#include<iostream>
#include<cmath>

using std::cout;

int main(){
auto a = 1.1;
auto b = 1.2;
auto c = 0.9;
auto d = 0.1;
auto e = 0.1;

auto N = 1000;

auto x = 0.;
for(int n = 0; n != N; ++n)
x = 0.999*x + 0.001*(sin(a*x) + b*sin(c*x) - e)/d;

cout << sin(a*x) + b*sin(c*x) << " == " << d*x + e << '\n';
cout << "solution is x = " << x << '\n';
}

(для простоты это C ++ 11)

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector