在我正在编码的C ++应用程序中,我需要求解一个非 - 线性方程组(N方程,N个未知数)。
我正在解决的系统相当小(最多10个方程式/未知数),因此性能不会成为真正的问题。 我在网上搜索了一个非线性解算器库,我无法找到一些看起来很容易使用的东西(得到 NOX 和C/C++ Minpack,但两者似乎对我的需要来说太过分了。)
为此目的,易于使用的库的任何想法和想法?
答案 0 :(得分:3)
有一点应该清楚:非线性方程解决方案并不容易。它与求解线性方程式不同。您无法始终保证获得解决方案。您选择的初始条件和增量策略会对您获得的解决方案产生深远的影响。
话虽如此,我不能推荐一个特定的库,但你应该在其选择菜单中寻找包含Newton-Raphson迭代的线性代数包。
答案 1 :(得分:2)
有两种选择,您可以使用包含非线性求解器的日with包,用C语言编写。我发现的唯一问题是你需要给它很好的初步估计。第二种选择是使用NLEQ或NLEQ2,我认为它是优越的(在FORTRAN中写作但很容易链接到C语言。但是我刚才找到了一些问题。有一个很好的网站,列出了可能的选项在:http://plato.asu.edu/sub/zero.html
答案 2 :(得分:1)
Numerical Recipes有一个例程可以帮你完成工作。
答案 3 :(得分:1)
这取决于方程的非线性。如果它们具有一些“好”的特性......最明显的是正半确定矩阵或凸性,可能有专门的算法可用。我使用IBM / ILOG CPLEX来满足大多数线性编程需求。提供了可以引入C ++应用程序的库。虽然我没有使用它们的二次编程模块,但它确实是高马力线性和(良好行为)非线性编程的最先进技术。
答案 4 :(得分:1)
总有GSL,但其他答案中的所有评论也适用于此:
答案 5 :(得分:0)
你看过COIN-OR了吗?如果您将问题提交给OR-Exchange,可能会有所帮助。
答案 6 :(得分:0)
任何方式都不是免费的,但Solver可以在这里工作。
答案 7 :(得分:0)
Microsoft 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;
另一种方法是制作单个方程式(请参见why):
(((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;