POO para Computação Científica
MAC-5715: Tópicos de Programação
Orientada a Objetos
Paulo Machado
Wellington Pinheiro
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
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
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
5
Aplicações
• Simulação computacional
• Reconhecimento de Padrões
• Otimização
• Predições
Situações que necessitam de Análise Numérica como:
Á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
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
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
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
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
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
CLN – Class Library for Numbers
12
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
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
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.
16
GiNaC – Funções e Símbolos
16
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;
}
18
GiNaC – Exemplo Derivada
int main(){ symbol x("x"), y("y");ex P = pow(x, 5) + pow(x, 2) + y; cout << P.diff(x,1) << endl; // 5*x^4 + 2*xcout << P.diff(x, 2) << endl;// 20*x^3 + 2 cout << P.diff(y) << endl; // 1 // -> 1
}
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 Group19
JCM – Representação de Funções
20
JCM – Solucionadores
21
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
JCM – Exemplo Raízestry {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
/* 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
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());
POO para Computação Científica
JScience
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
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
• 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
30
JScience - Estruturas
30
31
JScience - Funções
31
32
import static org.jscience.physics.units.SI.*;
Measure<ElectricResistance> R1 = Measure.valueOf(100, 1, OHM); // 1% precision.
Measure<ElectricResistance> R2 = Measure.valueOf(300, 3, OHM); // 1% precision.
Measure<ElectricPotential> U0 = Measure.valueOf(28, 0.01, VOLT); // ±0.01 V fluctuation.
Matrix<Measure> A = Matrix.valueOf(new Measure[][]{ { Measure.ONE , Measure.ONE , Measure.valueOf(0, OHM)},{ Measure.ONE.opposite() , Measure.ZERO , R1},{ Measure.ZERO , Measure.ONE.opposite(), R2}});Vector<Measure> B = Vector.valueOf((Measure)U0,
Measure.valueOf(0, VOLT), Measure.valueOf(0, VOLT));Vector<Measure> X = A.solve(B);System.out.println(X);System.out.println(X.get(2).to(MILLI(AMPERE)));
> {(7.0 ± 1.6E-1) V, (21.0 ± 1.5E-1) V, (7.0E-2 ± 7.3E-4) V;}> (70.0 ± 7.3E-1) mA
JScience - Exemplos
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
• 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
• 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
• 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
Referências• Wikipedia: http://en.wikipedia.org/wiki/Scientific_computing
• JScience:
http://jscience.org/
https://jscience.dev.java.net/
• GiNaC: http://www.ginac.de/
• CLN: http://www.ginac.de/CLN/
• Jakarta Commons Math: http://jakarta.apache.org/commons/math/
• Java Community Process – JSR 275:
http://www.jcp.org/en/jsr/detail?id=275
• MathEclipse
http://www.plog4u.org/index.php/Using_MathEclipse
38
Perguntas ?
E por fim….
Top Related