快速计算三角方程 c++ 解的方法
Fast way to calculate solution of a triangular equation c++
在 C++ 中计算以下方程中 x 的最快方法是什么?
sin (a x) + b sin (c x)== d * x + e
我不需要一个非常精确的x值,0.001的近似值是可以接受的。我也知道一个解决方案的中间人[x_0,x_1]。
我知道牛顿方法,但是由于我要模拟一个系统并且我需要解决数千次,我不知道如何给出第一个解决方案
您可以将等式重新表述为
罪 (a x) + b 罪 (c x) - d * x - e == 0
现在,这是一个根本查找问题。以下是根查找算法的列表。
牛顿的方法非常快速且易于实现,因为方程的导数可以通过解析计算。
#include <array>
#include <iostream>
#include <cmath>
template <typename T> double func(const T ¶meter, 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 ¶meter, 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 ¶meter) {
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
以加快速度,如果您所需的精度允许的话。
我假设你正在寻找一个数值解,给定已知的参数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)
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 枚举环境变量的惯用C++14/C++17方法
- 初始化具有非默认构造函数的std::数组项的更好方法