O documento discute o uso de programação orientada a objetos (POO) para computação científica. Ele apresenta várias bibliotecas populares para computação científica como JScience, GiNaC e Jakarta Commons Math, destacando suas características e funcionalidades. O documento também fornece exemplos de código para ilustrar o uso dessas bibliotecas para representar conceitos matemáticos e resolver problemas numéricos.
1. 1
POO para Computação Científica
MAC-5715: Tópicos de Programação
Orientada a Objetos
Paulo Machado
Wellington Pinheiro
2. 2
Assuntos Abordados
• Aplicações da Computação Científica
• Bibliotecas para Computação Científica
• Por que OO para Computação Científica
• Algumas Bibliotecas
• JScience
• Exemplos
• Resumo
• Conclusão
3. 3
O que é Computação Científica?
Definição da Wikipedia
Computação científica (ou ciência computacional)
é o campo de estudo interessado na construção
de modelos matemáticos e técnicas de soluções
numéricas utilizando computadores para analisar
e resolver problemas científicos e de engenharia.
3
4. 4
Por que OO e Computação Científica ?
• Relação entre OO e Computação Científica
ainda pouco explorada
• Grande ênfase no desenvolvimento utilizando
Fortran (John Backus – 1954-1957)
• Algum desenvolvimento feito em Linguagem C
• Muito pouco utilizando C++
• Quase nada feito em Java
Motivação
6. 6
Áreas que Utilizam Computação Científica
• Modelagem Financeira
• Sistemas de Informações Geográficos
• Química Computacional
• Bio-Computação
• Física Matemática
• Mecânica Computacional
• várias outras
6
7. 7
OO e a Computação Científica
Por que utilizar OO na Computação Científica?
• Mais intuitivo para quem usa
• Melhor adaptação de estruturas matemáticas
• Encapsulamento garante que os dados não
estejam espalhados
• Facilidade de personalizações através de
extensões ou composições
7
8. 8
Ferramentas & Bibliotecas
• CAS – Computer Algebra System (Mapple,
Mathematica, Derive, etc)
• Biblioteca de Funções e Classes (CLN,
GiNaC, JCalculus, JScience, Jakarta
Commons Math)
• Desenvolvimento proprietário
O que há disponível para Computação
Científica?
8
9. 9
Características de Bibliotecas
• Representam “conceitos” matemáticos
• Capazes de resolver alguns tipos de
problemas matemáticos
• Podem ser integrados em aplicações
• São otimizados
• Permitem customizações
• Existem soluções de Código Aberto
9
10. 10
Bibliotecas
Bibliotecas Open Source disponíveis:
• CNL – Class Library For Numbers
• GiNaC – GiNaC is Not a CAS
• JScience
• Jakarta Math Commons
• O foco principal dessa apresentação será o
JScience. 10
11. 11
CLN – Class Library for Numbers
CLN tem as seguintes características:
• Escrita em C++
• Define vários tipos de dados
• Disponibiliza um bom conjuntos de funções:
elementares, lógicas e trancedentais
• Provê mecanismo de Coleta de Lixo
11
13. 13
CLN – Class Library for Numbers
cl_I a = 5;
cl_I b = 2;
cl_I c = -3;
cl_F r = (a+b)+c;
r = (a+c*b)/a; r = abs(c);
r = sqrt(c); r = sin(r);
r = gcd(a, 25);
r = pi((float_format_t)10000);
13
14. 14
GiNaC tem as seguintes características:
• Escrito em C++;
• Estende as capacidades do C++ através de
manipulações simbólicas;
• Construído em cima do CLN;
• Suporte para funções polinomiais e racionais;
• Disponibiliza várias outras funções;
• Possui ambiente para emular um CAS: ginsh.
GiNaC – GiNaC is Not CAS
14
15. 15
GiNaC – GiNaC is Not CAS
Funcionalidades do GiNaC :
• Expressões e Avaliação Automática
• Definição de Símbolos
• Contêineres para Somas, Produtos e Potências
• Definições de Listas
• Integração e Diferenciação;
• Suporte ao uso de Matrizes;
• E várias outras.
17. 17
GiNaC – Exemplo Símbolo
ex f(int n, const ex &x) {
return pow(x, n);
}
int main() {
symbol x("x");
symbol. ex e = f(6, x);
cout << e.degree(x) << endl;
}
19. 19
Jakarta Commons Math (JCM)
Jakarta Commons Math tem as características:
• Escrito em Java
• Possui uma representação OO intuitiva dos
conceitos matemáticos
• Disponibiliza funcionalidades mais poderosas
(como resolução de sistemas lineares e
análise matemática)
• Abrange área de estatística
• Faz parte do projeto Jakarta do Apache Group
19
22. 22
JCM – Exemplo Matrizes
double[][] coef = {{1d,1d}, {1d,-1d}};
double[] s = {2,0};
BigMatrixImpl m =
new BigMatrixImpl(coef);
BigDecimal[] x = m.solve(s);
for (BigDecimal d : x)
System.out.println(d.doubleValue()
+ "t");
22
23. 23
JCM – Exemplo Raízes
try {
UnivariateRealFunction f =
new PolynomialFunction(new double[] {0, 1, 1, 1});
UnivariateRealSolver solver = new BisectionSolver(f);
System.out.println(Math.round(solver.solve(-1, 1)));
} catch (FunctionEvaluationException ex) {
System.out.println(
"nOcorreu um erro avaliando a expressão.");
System.exit(-1);
} catch (ConvergenceException ex) {
System.out.println(
"nExpressão não tem uma raíz no "
+ "intervalo definido.");
System.exit(-1);
} 23
24. 24
/* evaluation approach */
double[] values =
new double[] { 1, 2, 3, 4, 5 };
UnivariateStatistic stat = new Mean();
System.out.println("mean = " +
stat.evaluate(values));
stat.clear();
System.out.println(
"mean after clear is NaN = " +
stat.getResult());
JCM – Exemplo Estatística
25. 25
JCM – Exemplo Estatística
/* incremental approach */
double[] values = new double[] { 1, 2, 3, 4, 5 };
StorelessUnivariateStatistic stat = new Mean();
System.out.println("mean before adding a value is
NaN = " + stat.getResult());
for (int i = 0; i < values.length; i++) {
stat.increment(values[i]);
System.out.println("current mean = " +
stat.getResult());
}
stat.clear();
System.out.println("mean after clear is NaN = " +
stat.getResult());
27. 27
• Prover a mais compreensível biblioteca Java
para a comunidade científica;
• Criar sinergia entre todas as ciências pela
integração do conhecimento em uma mesma
estrutura;
• Prover serviços de qualidade para cálculo
científico.
JScience - Visão
28. 28
JScience - Sobre
• Projeto de código aberto
• Primeira versão lançada em 26/01/2005
• Versão atual adere as especificações JSR 275:
Units Specification do JCP
• Mais de 70 membros registrados que o utilizam
(entre eles o projeto MathEclipse)
• Projeto em constante evolução:
• Tempo médio de lançamento de versões: 2 meses
29. 29
• Mapeamento de estruturas matemáticas
• Sistema de coordenadas para aplicações
geográficas;
• Álgebra linear;
• Funções;
• Números;
• Medidas e unidades de medida;
• Modelos físicos;
• Sistema monetário.
JScience - Módulos
33. 33
// Define duas variaveis locais (x, y).
Variable<Complex> varX = new
Variable.Local<Complex>("x");
// f(x) = ix² + 2x + 1
Polynomial<Complex> x =
Polynomial.valueOf(Complex.ONE, varX);
Polynomial<Complex> fx =
x.pow(2).times(Complex.I).plus(
x.times(Complex.valueOf(2,
0)).plus(Complex.ONE));
System.out.println(fx); System.out.println(fx.pow(2));
System.out.println(fx.differentiate(varX));
System.out.println(fx.integrate(varY));
System.out.println(fx.compose(fx));
// Calcula a expressao
varX.set(Complex.valueOf(2, 3));
System.out.println(fx.evaluate());
JScience - Exemplos
34. 34
• Transformada de Fourier
• Física Nuclear
• Integração
• Algoritmos genéticos
• Redes Neurais
• Geradores de massa de dados aleatórios
• Calendários
• Elementos Químicos
• Biologia Molecular
JScience - Módulos Previstos (2006)
35. 35
• CLN é vastamente utilizada, dispõe de mecanismos
interessantes porém sua biblioteca de funções é limitada;
• GiNaC disponibiliza um mecanismo interessante (manipulação
simbólica) aliado a uma biblioteca potente porém é complexa
na sua instalação e utilização;
• Jakarta Commons Math é muito potente, bem planejada
porém não disponibiliza uma gama muito grande de
funcionalidades;
• JScience possui uma arquitetura estável e baseada em
definições matemáticas. Entretanto, possui poucas classes
implementadas.
Resumo
36. 36
• Ramo pouco evoluído;
• Esforços estão na direção de construir
bibliotecas de cálculo científico;
• Nenhum padrão de projeto criado;
• Tópico interessante e vasto para
desenvolvimento de teses.
Conclusão