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