Computação Científica OO - IME-USP

Propaganda
POO para Computação Científica
MAC-5715: Tópicos de Programação
Orientada a Objetos
Paulo Machado
Wellington Pinheiro
1
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
2
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
Motivação
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
4
Aplicações
Situações que necessitam de Análise
Numérica como:
• Simulação computacional
• Reconhecimento de Padrões
• Otimização
• Predições
5
Á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
O que há disponível para Computação
Científica?
• CAS – Computer Algebra System (Mapple,
Mathematica, Derive, etc)
• Biblioteca de Funções e Classes (CLN,
GiNaC, JCalculus, JScience, Jakarta
Commons Math)
• Desenvolvimento proprietário
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 – GiNaC is Not CAS
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.
14
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.
15
GiNaC – Funções e Símbolos
16
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;
}
17
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*x
cout << P.diff(x, 2) << endl;
// 20*x^3 + 2
cout << P.diff(y) << endl;
// 1 // -> 1
}
18
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
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í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
JCM – Exemplo Estatística
/* 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());
24
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());
25
POO para Computação Científica
JScience
26
JScience - Visão
• 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.
27
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
28
JScience - Módulos
• 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.
29
JScience - Estruturas
30
JScience - Funções
31
JScience - Exemplos
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
32
JScience - Exemplos
// 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());
33
JScience - Módulos Previstos (2006)
• 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
34
Resumo
• 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.
35
Conclusão
• 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.
36
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
37
E por fim….
Perguntas ?
38
Download