A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Curso C++ (J. Seixas) Uma classe para vectores #ifndef __SIMPLEARRAY__ #define __SIMPLEARRAY__ #include using namespace std; template class SimpleArray.

Apresentações semelhantes


Apresentação em tema: "Curso C++ (J. Seixas) Uma classe para vectores #ifndef __SIMPLEARRAY__ #define __SIMPLEARRAY__ #include using namespace std; template class SimpleArray."— Transcrição da apresentação:

1 Curso C++ (J. Seixas) Uma classe para vectores #ifndef __SIMPLEARRAY__ #define __SIMPLEARRAY__ #include using namespace std; template class SimpleArray { template friend ostream &operator &); public: SimpleArray(int n); // Create array of n elements SimpleArray(); // Create array of 0 elements SimpleArray(const SimpleArray &); // Copy array ~SimpleArray(); // Destroy array T& operator[](int i); // Subscripting int numElts(); // Number of elements SimpleArray & operator=(const SimpleArray &); // Array assignment SimpleArray & operator=(T); // Scalar assignment void setSize(int n); // Change size private: int num_elts; // Number of elements T* ptr_to_data; // Pointer to built-in array of elements void copy(const SimpleArray & a); // Copy in elements of a }; #endif

2 Curso C++ (J. Seixas) Overloading de operadores Primeiro: nem todos os operadores são passíveis de overloading. Segundo: não é possível alterar nem a precedência, nem a associatividade dos operadores. Terceiro: Os operadores iniciais ficam inacessíveis! Não há garantia quanto à ordem segundo a qual os operandos são avaliados. Quarto: O significado dos operadores para os tipos pré-definidos não pode ser alterado. Não alterar operadores como, &, && ou || Operadores que podem ser overloaded + - * / = += -= *= /= > >= == != = % & ^ ! | ~ &= ^= |= && || %= [] (), ->* -> new delete new[] delete[] Operadores que não podem ser overloaded ::.*. ?:

3 Curso C++ (J. Seixas) Uma classe para vectores Overloading do operador []: template SimpleArray ::~SimpleArray() { delete [] ptr_to_data; } template T& SimpleArray ::operator[](int i) { return ptr_to_data[i]; } template int SimpleArray ::numElts() { return num_elts; }

4 Curso C++ (J. Seixas) Uma classe para vectores Overloading do operador =: (assignment) template SimpleArray & SimpleArray ::operator=(const SimpleArray & rhs) { if ( ptr_to_data != rhs.ptr_to_data ) { setSize( rhs.num_elts ); copy(rhs); } return *this; } Os operadores = retornam uma referência: não é necessário criar e destruir uma cópia temporária do resultado. Como retornam uma referência ao objecto da esquerda permitem pôr a=b=c;

5 Curso C++ (J. Seixas) Uma classe para vectores Overloading do operador <<: (assignment) template ostream &operator & v){ for(int i=0; i < v.num_elts ;++i) stream << v.ptr_to_data[i] << " "; return stream; } Os operadores << retornam uma referência a ostream e assim podemos por cout << v << u << endl;

6 Curso C++ (J. Seixas) Uma classe para vectores Uma função com o qualificativo friend, seja ela membro de outra classe ou global, pode aceder a membros não públicos da classe que a classificou como friend. A classificação de friend a uma dada função só se aplica a essa função, não a todas com o mesmo nome! Se se declarar uma classe como friend todas as suas funções serão friend. A posição onde a declaração de friend está na definição da classe é irrelevante. Os especificadores de acesso private e public não têm qualquer efeito em friend.

7 Curso C++ (J. Seixas) Uma classe para vectores Implementação (I): template SimpleArray ::SimpleArray(int n) { num_elts = n; ptr_to_data = new T[n]; } template SimpleArray ::SimpleArray() { num_elts = 0; ptr_to_data = 0; } template SimpleArray ::SimpleArray(const SimpleArray & a) { num_elts = a.num_elts; ptr_to_data = new T[num_elts]; copy(a); // Copy a's elements } template void SimpleArray ::copy(const SimpleArray & a) { // Copy a's elements into the elements of *this T* p = ptr_to_data + num_elts; T* q = a.ptr_to_data + num_elts; while (p > ptr_to_data) *--p = *--q; }

8 Curso C++ (J. Seixas) Uma classe para vectores Implementação (II): template SimpleArray ::~SimpleArray() { delete [] ptr_to_data; } template T& SimpleArray ::operator[](int i) { return ptr_to_data[i]; } template int SimpleArray ::numElts() { return num_elts; }

9 Curso C++ (J. Seixas) Uma classe para vectores Implementação (III): template SimpleArray & SimpleArray ::operator=(const SimpleArray & rhs) { if ( ptr_to_data != rhs.ptr_to_data ) { setSize( rhs.num_elts ); copy(rhs); } return *this; } template void SimpleArray ::setSize(int n) { if (n != num_elts) { delete [] ptr_to_data; // Delete old elements, num_elts = n; // set new count, ptr_to_data = new T[n]; // and allocate new elements }

10 Curso C++ (J. Seixas) Uma classe para vectores Implementação (IV): template SimpleArray & SimpleArray ::operator=(T rhs) { T* p = ptr_to_data + num_elts; while (p > ptr_to_data) *--p = rhs; return *this; }

11 Curso C++ (J. Seixas) Exemplo: O modelo de Ising O modelo de Ising (estudado inicialmente pelo físico Ernst Ising por sugestão do seu orientador de doutoramento Wilhelm Lenz) é um modelo matemático em Física Estatística, muito importante para estudar fenómenos como o ferromagnetismo. Teve e tem um papel fundamental na moderna teoria das transições de fase e fenómenos críticos.

12 Curso C++ (J. Seixas) Exemplo: O modelo de Ising O modelo mais simples consiste numa cadeia de spins S i cada um só podendo tomar os valores ±1. A energia do sistema para uma dada configuração de spins é dada por Cada configuração de spins é uma fotografia do sistema num dado instante

13 Curso C++ (J. Seixas) Exemplo: O modelo de Ising O objectivo da Física Estatística é determinar o valor das grandezas termodinâmicas macroscópicas a partir da dinâmica microscópica do sistema. A energia do sistema em cada instante é dada pela expressão anterior. A energia média ao longo do tempo é dada por

14 Curso C++ (J. Seixas) Exemplo: O modelo de Ising Calcular para todas as possíveis configurações é possível, mas: Será que todas as configurações têm a mesma importância no processo? Será que no intervalo de tempo (mesmo longo) em que estamos a observar todas elas aparecem? Se não, como determinar tendo em vista a distribuição de configurações mais frequentes? Como determinar a frequência com que as configurações aparecem? … O objectivo da Física Estatística é dar respostas a estas perguntas

15 Curso C++ (J. Seixas) Exemplo: O modelo de Ising 1ª pergunta: Como calcular a frequência (probabilidade) com que aparece uma dada configuração? Resposta (1ª parte): Há muitas configurações que têm a mesma energia associada sobretudo se há simetrias no sistema. Exemplo (modelo de Ising ferromagnético): Existe uma simetria Z 2 : trocar s-s fornece o mesmo resultado para E. Existem configurações com energia menor do que outras. Em física temos sempre de tender para um mínimo de energia.

16 Curso C++ (J. Seixas) Exemplo: O modelo de Ising 1ª pergunta: Como calcular a frequência (probabilidade) com que aparece uma dada configuração? Resposta (2ª parte): Configurações todos os spins para baixo excepto 1: N; Configurações todos os spins para baixo excepto 2: N(N-1); desordenado N(N-1)/2! Configurações todos os spins para baixo excepto k: N!/(N-k)!; desordenado N!/k!(N-k)!

17 Curso C++ (J. Seixas) Exemplo: O modelo de Ising 1ª pergunta: Como calcular a frequência (probabilidade) com que aparece uma dada configuração? Resposta (2ª parte): A probabilidade de ter N spins e colocá-los N 1 na caixa 1, N 2 na caixa 2, … N k na caixa k é Se houver degenerescência, o número de maneiras de preencher uma caixa i é g i então a expressão anterior é

18 Curso C++ (J. Seixas) Exemplo: O modelo de Ising 1ª pergunta: Como calcular a frequência (probabilidade) com que aparece uma dada configuração? Resposta (3ª parte): Qual é o valor máximo da probabilidade, ou seja, qual o conjunto {N i } para os quais W é máxima? Na realidade, essa é a configuração mais provável, ou seja, a que aparecerá mais vezes. Resposta: Usar multiplicadores de Lagrange minimizando

19 Curso C++ (J. Seixas) Exemplo: O modelo de Ising 1ª pergunta: Como calcular a frequência (probabilidade) com que aparece uma dada configuração? Resposta (3ª parte): Usando a aproximação de Stirling e pondo igual a 0 a derivada em ordem a N i temos

20 Curso C++ (J. Seixas) Exemplo: O modelo de Ising 1ª pergunta: Como calcular a frequência (probabilidade) com que aparece uma dada configuração? Resposta (3ª parte): Função de partição: e logo Função de partição

21 Curso C++ (J. Seixas) Exemplo: O modelo de Ising 2ª pergunta: O comportamento do sistema não é portanto possível de seguir em detalhe analiticamente. Se as configurações não são todas equiprováveis, como escolher as melhores de forma a não perder tempo com as que são mais improváveis? Resposta (entre outras): Algoritmo de Metropolis


Carregar ppt "Curso C++ (J. Seixas) Uma classe para vectores #ifndef __SIMPLEARRAY__ #define __SIMPLEARRAY__ #include using namespace std; template class SimpleArray."

Apresentações semelhantes


Anúncios Google