使用SymbolicC ++象征性地解决方程组

时间:2016-05-14 15:43:59

标签: c++ symbolic-math

我正在寻找一种以符号方式编程解决(不一定是线性)方程组的方法。我的主要关注点是SymbolicC ++,但我找不到太多的文档,而且我无法让它工作。

以下代码产生a == 1/2*(-4*b^(2)+4*c^(2))^(1/2),显然未正确简化(我甚至明确地调用simplify。):

#include <symbolicc++.h>
#include <iostream>

int main()
{
    Symbolic a("a");
    Symbolic b("b");
    Symbolic c("c");

    auto eq1 = (a^2) + (b^2) == (c^2);
    auto solutions = solve(eq1, a);

    for (auto i = solutions.begin(); i != solutions.end(); i++)
        std::cout << (*i).simplify() << std::endl;
}

以下代码应该产生许多解决方案a==2, b==2, c==2, d==2a == 5-2*sqrt(6), b == 5+2*sqrt(6), c == 5-2*sqrt(6), d == 5+2*sqrt(6),但在执行大约10秒后会遇到以下异常:

  

test.exe中0x73203D5C(vcruntime140.dll)的未处理异常:0xC0000005:访问冲突读取位置0x00000018。

#include <symbolicc++.h>
#include <iostream>

int main()
{
    Symbolic a("a");
    Symbolic b("b");
    Symbolic c("c");
    Symbolic d("d");

    auto eq1 = a + b*c*d == 10;
    auto eq2 = b + a*c*d == 10;
    auto eq3 = c + a*b*d == 10;
    auto eq4 = d + a*b*c == 10;
    auto eq = (eq1, eq2, eq3, eq4);
    auto solutions = solve(eq, (a, b, c, d));

    for (auto i = solutions.begin(); i != solutions.end(); i++)
        std::cout << *i << std::endl;
}

(我使用Visual Studio编译库。)

我的测试方程似乎是可以解决的,因为WolframAlpha很容易解决它们。 (我刚使用了solve a^2+b^2 = c^2 for asolve a+bcd=10, b+acd=10, c+abd=10, d+abc=10。)

我做错了吗?我需要什么才能使这些示例正常工作?

关于其他图书馆的说明:
如果可能,我想将库编译到ARM系统(Windows Phone)。据我所知,只有C ++和.NET库发挥作用。由于目前我使用MSVC来编译SymbolicC ++,我认为将其交叉编译为WP不会成为问题。

关于同情的说明:
以下代码会使用ZeroDivisionError消息抛出polynomial division。因为它无论如何都不适合我的便携性需求,我只是放弃了它。

import sympy.solvers
from sympy import Equality
from sympy.abc import a, b, c, d
equations = [ Equality(a + b*c*d, 10), Equality(b + a*c*d, 10), Equality(c + a*b*d, 10), Equality(d + a*b*c, 10) ]
print sympy.solvers.solve(equations, [a, b, c, d])

0 个答案:

没有答案