Buscar

Computação Científica

Prévia do material em texto

*
*
*
 POO para Computação Científica
MAC-5715: Tópicos de Programação 
Orientada a Objetos
Paulo Machado
Wellington Pinheiro
*
*
*
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.
*
*
*
*
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
*
*
*
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
*
*
*
*
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
*
*
*
*
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?
*
*
*
*
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
*
*
*
*
 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.
*
*
*
*
 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
*
*
*
*
 CLN – Class Library for Numbers
 	
 
*
*
*
*
 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);
*
*
*
*
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.
*
*
*
*
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 – Funções e Símbolos
*
*
*
*
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 (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
*
*
*
*
JCM – Representação de Funções
*
*
*
*
JCM – Solucionadores
*
*
*
*
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");
*
*
*
*
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);
}
*
*
*
*
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 - Estruturas
*
*
*
*
JScience - Funções
*
*
*
*
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.
*
*
*
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
*
*
*
E por fim….
Perguntas ?

Continue navegando