380 likes | 501 Views
MAC-5715: Tópicos de Programação Orientada a Objetos Paulo Machado Wellington Pinheiro. POO para Computação Científica. 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
E N D
MAC-5715: Tópicos de Programação Orientada a Objetos Paulo Machado Wellington Pinheiro POO para Computação Científica
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
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. O que é Computação Científica? 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
Simulação computacional Reconhecimento de Padrões Otimização Predições Aplicações Situações que necessitam de Análise Numérica como:
Modelagem Financeira Sistemas de Informações Geográficos Química Computacional Bio-Computação Física Matemática Mecânica Computacional várias outras Áreas que Utilizam Computação Científica 6
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 OO e a Computação Científica 7
CAS – Computer Algebra System (Mapple, Mathematica, Derive, etc) Biblioteca de Funções e Classes (CLN, GiNaC, JCalculus, JScience, Jakarta Commons Math) Desenvolvimento proprietário Ferramentas & Bibliotecas • O que há disponível para Computação • Científica? 8
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 Características de Bibliotecas 9
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. Bibliotecas 10
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 CLN – Class Library for Numbers 11
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); CLN – Class Library for Numbers 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
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.
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; }
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 }
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 Jakarta Commons Math (JCM) 19
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"); JCM – Exemplo Matrizes 22
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); } JCM – Exemplo Raízes 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());
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
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.
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
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.
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
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());
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
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.
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.
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 Referências
E por fim…. Perguntas ?