在我正在编码的 C++ 应用程序中,我需要解决一个系统 -线性方程(N 个方程,N 个未知数)。

我正在求解的系统将相当小(最多 10 个方程/未知数),因此性能不会成为真正的问题。我在网上搜索了一些非线性解算器库,但找不到看起来易于使用的东西(必须 氮氧化物C/C++ 最小包, ,但两者似乎都超出了我的需要)。

为此目的有什么易于使用的库的想法和想法吗?

有帮助吗?

解决方案

有给你两个选择,你可以使用的日晷包,其中包括一个非线性求解器,用C写的,我认为。我与它发现的唯一的问题是,你需要给它良好的初步估计。第二个选择是使用NLEQ或NLEQ2我认为是卓越(writtein在FORTRAN但容易链接到C像语言研究,但我有一些问题,刚才定位它。这是一个很好的网站有可能的选项列表于: http://plato.asu.edu/sub/zero.html

其他提示

有一点应该是清楚的:非线性方程的解决方案是不容易的。这是不一样的求解线性方程组。你是不是总是保证得到一个解决方案。和你的初始条件和增量的战略选择会对你得到解决产生深远的影响。

使用这么说,我不能推荐一个特定的库,但你应该在寻找一个线性代数包,其中包括在其的选择菜单的Newton-Raphson迭代。

数值食谱有一个程序,会为你做的工作。

这取决于如何非线性方程是。如果他们拥有一些“好”属性...最明显的正半正定矩阵或凸起,可专门的算法可用。我使用IBM / ILOG CPLEX为我的大部分线性规划的需要。提供库,可拉成C ++应用程序。虽然我没有用他们的二次规划模块,它是真正的国家的最先进的高马力线性和(乖巧)非线性规划。

你有没有看着 COIN-OR ?如果您提交的问题给或交换这可能会有帮助。

这不是免费的,任何方式,但求解就在这里工作。

微软Z3 的https:// github上的.com / Z3Prover / Z3 /斑点/主/示例/ C%2B%2B / example.cpp

也考虑omnn ::数学: https://github.com/ohhmm/openmind/斑点/主/ omnn /数学/测试/ 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;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top