| SymbolicC++ | |
|---|---|
| Desenvolvedores | Yorick Hardy, Willi-Hans Steeb and Tan Kiat Shi |
| Lançamento inicial | 2010 |
| Lançamento estável | 3.35
|
| Escrito em | C++ |
| Sistema operacional | Multiplataforma |
| Tipo | Sistema algébrico computacional |
| Licença | GPL |
| Website | http://issc.uj.ac.za/symbolic/symbolic.html |
SymbolicC++ é um Sistema algébrico computacional de propósito geral incorporado na linguagem de programação C++. É um software livre lançado sob os termos da GNU General Public License. O SymbolicC++ é usado através da inclusão em um arquivo de cabeçalho da linguagem C++ ou através de links para uma biblioteca.
#include <iostream>
#include "symbolicc++.h"
using namespace std;
int main(void)
{
Symbolic x("x");
cout << integrate(x+1, x); // => 1/2*x^(2)+x
Symbolic y("y");
cout << df(y, x); // => 0
cout << df(y[x], x); // => df(y[x],x)
cout << df(exp(cos(y[x])), x); // => -sin(y[x])*df(y[x],x)*e^cos(y[x])
return 0;
}
O seguinte fragmento de programa inverte a matriz symbolically.
Symbolic theta("theta");
Symbolic R = ( ( cos(theta), sin(theta) ),
( -sin(theta), cos(theta) ) );
cout << R(0,1); // sin(theta)
Symbolic RI = R.inverse();
cout << RI[ (cos(theta)^2) == 1 - (sin(theta)^2) ];
A saída é
[ cos(theta) −sin(theta) ] [ sin(theta) cos(theta) ]
O próximo programa ilustra símbolos não-comutativos em SymbolicC++. Aqui b é um operador de aniquilação e bd é um operador de criação. A variável vs denota o estado de vácuo . O operador ~ alterna a comutatividade de uma variável, isto é, se b é comutativa então ~b é não-comutativa e se b é não-comutativa ~b é comutativa.
#include <iostream>
#include "symbolicc++.h"
using namespace std;
int main(void)
{
// O operador b é o operador de aniquilação e bd é o operador de criação
Symbolic b("b"), bd("bd"), vs("vs");
b = ~b; bd = ~bd; vs = ~vs;
Equations rules = (b*bd == bd*b + 1, b*vs == 0);
// Exemplo 1
Symbolic result1 = b*bd*b*bd;
cout << "result1 = " << result1.subst_all(rules) << endl;
cout << "result1*vs = " << (result1*vs).subst_all(rules) << endl;
// Exemplo 2
Symbolic result2 = (b+bd)^4;
cout << "result2 = " << result2.subst_all(rules) << endl;
cout << "result2*vs = " << (result2*vs).subst_all(rules) << endl;
return 0;
}
Outros exemplos podem ser encontrados nos livros listados abaixo.
SymbolicC++ é descrito em uma série de livros sobre álgebra computacional. O primeiro livro descreveu a primeira versão da SymbolicC++. Nesta versão o principal tipo de dados para computação simbólica foi a classe Sum. A lista de classes disponíveis incluiu
Verylong : Um implementação de Inteiro ilimitadoRational : Uma classe de modelo para números racionaisQuaternion : Uma classe de modelo parar quaterniõesDerive : Uma classe de modelo para diferenciação automáticaVector : Uma classe de modelo para vetores (ver espaço vetorial)Matrix : Uma classe de modelo para matrizes (ver matriz (matemática))Sum : Uma classe de modelo para expressões simbólicasExemplo:
#include <iostream>
#include "rational.h"
#include "msymbol.h"
using namespace std;
int main(void)
{
Sum<int> x("x",1);
Sum<Rational<int> > y("y",1);
cout << Int(y, y); // => 1/2 yˆ2
y.depend(x);
cout << df(y, x); // => df(y,x)
return 0;
}
A segunda versão da SymbolicC++ apresentou novas classes, como a classe Polynomial e suporte inicial para integração simples. O suporte para a computação algébrica de álgebras de Clifford foi descrito usando a SymbolicC++ em 2002. Subsequentemente, o suporte para bases de Gröbner foi adicionado.
A terceira versão apresentou uma completa reescrita da SymbolicC++ e foi lançada em 2008. Esta versão encapsula todas as expressões simbólicas na classe Symbolic.
As versões mais recentes estão disponíveis do website da SymbolicC++.