在我正在编码的 C++ 应用程序中,我需要求解一个非线性方程组(N 个方程,N 个未知数)。
我要解决的系统将相当小(最多 10 个方程/未知数),因此性能不会成为真正的问题。我在网上搜索了一下非线性求解器库,但我找不到看起来很容易使用的东西(使用NOX和C/C++ Minpack,但对于我的需要来说,这两者似乎都过大了) .
为此目的,有任何易于使用的库的想法和想法吗?
在我正在编码的 C++ 应用程序中,我需要求解一个非线性方程组(N 个方程,N 个未知数)。
我要解决的系统将相当小(最多 10 个方程/未知数),因此性能不会成为真正的问题。我在网上搜索了一下非线性求解器库,但我找不到看起来很容易使用的东西(使用NOX和C/C++ Minpack,但对于我的需要来说,这两者似乎都过大了) .
为此目的,有任何易于使用的库的想法和想法吗?
有一件事应该清楚:非线性方程解并不容易。这与求解线性方程不同。并不总能保证您得到解决方案。你对初始条件和增量策略的选择会对你得到的解决方案产生深远的影响。
话虽如此,我不能推荐一个特定的库,但你应该留意一个线性代数包,它的选择菜单中包含 Newton-Raphson 迭代。
有两个选项供您选择,您可以使用包含非线性求解器的日晷包,用 CI think 编写。我发现的唯一问题是您需要对其进行良好的初始估计。第二种选择是使用我认为更好的 NLEQ 或 NLEQ2(用 FORTRAN 编写,但很容易链接到 C 语言。但是我刚才在定位它时遇到了一些问题。有一个很好的网站,其中列出了可能的选项在: http: //plato.asu.edu/sub/zero.html
数字食谱有一个可以为您完成工作的例程。
这取决于方程的非线性程度。如果它们具有一些“不错”的属性……最明显的是半正定矩阵或凸性,则可能有专门的算法可用。我使用 IBM/ILOG CPLEX 来满足我的大部分线性编程需求。提供了可以拉入 C++ 应用程序的库。虽然我没有使用过他们的二次规划模块,但它确实是高功率线性和(表现良好的)非线性规划中的最新技术。
总是有 GSL,但其他答案中的所有评论也适用于此:
你看过COIN-OR吗?如果您将问题提交给 OR-Exchange,可能会有所帮助。
它无论如何都不是免费的,但Solver可以在这里工作。
微软 Z3 https://github.com/Z3Prover/z3/blob/master/examples/c%2B%2B/example.cpp
还可以考虑 omnn::math: https ://github.com/ohhmm/openmind/blob/master/omnn/math/test/08_System.cpp
可以说方程组是这样的:
(x-a1)^2 + (y-b1)^2 = c1
(x-a2)^2 + (y-b2)^2 = c2
然后你有几个选择:
Valuable a1, a2, b1, b2; // init with values
System sys;
Variable x,y;
sys << (x-a1)^2 + (y-b1)^2 - c1; // addin an equation as an equality to 0
sys << (x-a2)^2 + (y-b2)^2 - c2;
for(auto& solution : sys.Solve(x))
std::cout << solution;
另一种方法是制作单个方程(请参阅为什么):
((x-a1)^2 + (y-b1)^2 - c1)^2 + ((x-a2)^2 + (y-b2)^2 - c2)^2 = 0
Variable x,y;
Valuable a1, a2, b1, b2; // init with values
auto eq = ((x-a1)^2 + (y-b1)^2 - c1)^2 + ((x-a2)^2 + (y-b2)^2 - c2)^2;
eq.SetView(Valuable::View::Equation); // optional: equation optimizations
// get y function:
auto fn = eq(y);
// show
std::cout << fn << std::endl;
// evaluate
auto evaluate = fn;
evaluate.eval(x, 10);
evaluate.optimize(); // calculate
// show calculated value at x=10:
std::cout << evaluate << std::endl;