Использование SymbolicC ++ для символического решения систем уравнений

Я ищу способ программно решать системы (не обязательно линейных) уравнений символически. Я сосредоточился на 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==2 а также a == 5-2*sqrt(6), b == 5+2*sqrt(6), c == 5-2*sqrt(6), d == 5+2*sqrt(6) но вместо этого встречается следующее исключение после выполнения в течение примерно 10 секунд:

Необработанное исключение в 0x73203D5C (vcruntime140.dll) в test.exe: 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 a а также solve 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])

3

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]