T1 (by Fernando Barao)

1º Trabalho de Física Computacional (2018-19)
Dep. de Física, IST/U. Lisboa
26 de Novembro 2018 (9-12H30)
Fernando Barão (responsável), Rui Coelho, Miguel Orcinha, Carlos Couto

Instruções muito importantes a serem lidas antes do início do trabalho

bin/
src/

Como organizar os ficheiros?

1. A pasta bin deve conter os ficheiros binários (.o, .exe). Não submeta estes ficheiros!

2. A pasta src deve conter todas as classes (header e source) necessárias à resolução dos problemas, incluindo a classe gráfica cFCgraphics e todas as classes a que recorra e que já tenha desenvolvido ao longo do semestre.

3. Os programas main, assim como as figuras pedidas, devem ser colocados na pasta Trab01.

A realização deste trabalho requer a existência de um Makefile que deve existir na pasta Trab01

Não esqueça de fazer a submissão dos ficheiros no SVN!!!


Problema 1 (10 valores)

Pretende-se desenvolver a classe Polygon2D em C++ que trate polígonos a duas dimensões. Naturalmente a classe utilizará uma classe auxiliar Vertex que define as coordenadas dos vértices do polígono.

Os ficheiros Vertex.h e Polygon2D.h contêm respectivamente a declaração de alguns métodos das duas classes referidas acima, bem como os seus data members (que não podem ser alterados).

Parte A

1. Complete a classe Polygon2D de forma a realizar todas as acções propostas no programa main que se segue e cujo nome deverá ser Rpolygon_1.C
Isto implicará adicionar métodos ao ficheiro Polygon2D.C e declarações no ficheiro Polygon2D.h.

O programa abaixo define um polígono de três vértices (triângulo), utilizando a classe Vertex.

Verifique se o seu programa corre.

 // Trab01
 // Rpolygon_1.C

 int main () {

  // definir polígono triângulo (3 vértices) partindo de um vector de vertexes
  // vértice 1: (0. , 0.)
  // vértice 1: (4. , 5.)
  // vértice 3: (7. , 3.)

  (...)
  Polygon2D Triangle(v);

  // imprimir os vértices do polígono
  Triangle.Print(); // vértice 1: ( , )
                    // vértice 2: ( , )
                    // vértice 3: ( , )

  // calcular a distância entre os vértices 2 e 3
  double d = GetDistance(2,3)
  cout << "distância entre vértices 2 e 3: " << d << endl;

  // calcular o perímetro
  double a = Triangle.GetPerimeter();
  cout << "perímetro: " << a << endl;
 }

Ficheiros que deverão existir no final da parte A do exercício:

 Na avaliação utilizaremos o seguinte comando:

 make bin/Rpolygon_1.exe

 que deve compilar e executar correctamente o main anterior.

Parte B

Nesta parte do trabalho vamos desenhar o polígono com o auxílio da classe cFCgraphics e da classe de ROOT TPolyLine.
Detalhes sobre a classe podem ser encontradas aqui.

1. Complete a classe Polygon2D de forma a realizar todas as acções propostas no programa main que se segue e cujo nome deverá ser Rpolygon_2.C

O programa abaixo mostra como a classe Polygon2D deve retornar um objecto TPolyLine de forma a poder ser desenhado.
Documentação da classe TPolyLine.

2. Modifique o programa Rpolygon_2.C de forma a desenhar o triângulo, conjuntamente com uma escala $x: [0,8]$ e $y: [0:8]$, fazendo uso da classe cFCgraphics.
Sugestão: para definir a escala pode recorrer a um histograma vazio ou então utilizar o método DrawFrame de Tpad.

Verifique se o seu programa corre. - Nota: se necessitar de comentar alguma linha de código do programa

main de forma a evitar algum erro de compilação, refira isso num ficheiro a adicionar, README.txt

// Trab01
// Rpolygon_2.C

 int main () {

  // definir polígono triângulo (3 vértices) da seguinte forma:
  Polygon2D Triangle(3);
  Triangle[0] = Vertex(0.,0.);
  Triangle[1] = Vertex(4.,5.);
  Triangle[2] = Vertex(7.,3.);

  // polígono definido usando ROOT
  TPolyLine* line = Triangle.GetPolyLine();

  // desenhar o polígono usando a classe de Interface Gráfica
  cFCgraphics canvas;
  (...)

 }

Ficheiros que deverão existir no final da parte B do exercício:

 Na avaliação utilizaremos o seguinte comando:

 make bin/Rpolygon_2.exe

 que deve compilar e executar correctamente o main anterior.

Parte C

Neste última parte do problema vão-se adicionar mais funcionalidades à classe Polygon2D. Pretende-se que seja possível adicionar vértices a um polígono utilizando uma linguagem mais natural.

1. Complete a classe Polygon2D de forma a realizar todas as acções propostas no programa main que se segue e cujo nome deverá ser Rpolygon_3.C

2. Complete o programa main de forma a desenhar no ecrã o triângulo e o quadrado no mesmo pad, com uma escala gráfica, tal como foi pedido na parte B.

Verifique se o seu programa corre.

// Trab01
// Rpolygon_3.C

 int main () {

  // definir polígono triângulo (3 vértices)
  Polygon2D Triangle();

  // definir os pontos que irão constituir o polígono
  Vertex A(0.,0.);
  Vertex B(4.,0);
  Vertex C(4.,5.);
  Vertex D(0.,5.);

  // definir os vértices do polígono através da adição de pontos ao triângulo
  Triangle = Triangle + A;
  Triangle = Triangle + B;
  Triangle = Triangle + C;

  // criar um retângulo a partir do triângulo
  Polygon2D Rectangle(Triangle);
  Rectangle = Rectangle + D;

  // desenhar agora as duas figuras sobrepostas recorrendo à
  // classe de Interface Gráfica
  cFCgraphics canvas;
  (...)

 }

Ficheiros que deverão existir no final da parte C do exercício:

 Na avaliação utilizaremos o seguinte comando:

 make bin/Rpolygon_3.exe

 que deve compilar e executar correctamente o main anterior.

Problema 2 (8 valores)

Numa experiência de física de partículas embarcada na estação internacional é realizada a medida do fluxo de protões em função da sua energia $E$ (número de protões por unidade energia). A energia medida pelo detector, $E^{\prime}$, pode não coincidir obviamente com a energia $E$ (ideal) da partícula, uma vez que existe uma incerteza associada à medida. Cada experiência possuirá portanto, a sua função (ou matriz, no caso de ser discretizado) de transferência que relaciona a observável medida com a observável verdadeira.
Consideremos a seguinte expressão para o fluxo de protões em função da energia ideal,

$$ F(E) = \frac{A \; E^{-2.8}}{1 + B \; E^{-1.22} + C \; E^{-2.54}} $$

com:

$A= 21.1$
$B= 5.85$
$C= 1.18$

Elabore um programa main com o nome Rflux.C onde obtenha progressivamente os seguintes resultados:

1. Obtenha o plot para o fluxo de protões em formato .pdf e salve-o num ficheiro cujo nome é FluxoProtoes.pdf
Utilize escala logarítmica no eixo dos $y$.

2. Construa um vector com os valores do fluxo de protões, calculados nos pontos $E_i$ e utilizando a classe Vec. Imprima no ecrã os valores do vector usando o método Print() da classe.

$$ E_i = 0.1 + 0.05 \, i \quad \mathrm{com} \; i=0,\cdots,399 $$

3. Obtenha agora o fluxo medido pela experiência, $F(E^{\prime})$. Este pode ser obtido através da discretização da energia, e conhecendo a função de transferência da experiência $M(E,E^{\prime})$ que traduz a probabilidade de um valor de energia $E$ ser medido como $E^{\prime}$,

$$ F(E^{\prime}) = \int_{E} F(E) \, M(E, E^{\prime}) \, dE \quad \rightarrow \quad \sum_{E} \, M(E, E^{\prime}) \, F(E) \, \Delta E $$ onde $\Delta E = 0.05$

A matriz de transferência $M(E, E^{\prime})$ com dimensão $400 \times 400$ para os pontos de energia dados por $E_i$, pode ser obtida ficheiro aqui. A matriz deve ser recuperada no link anterior e colocada num ficheiro com o nome MatrizTransferencia.dat

imagem da matriz de matriz de transferência que se encontra também sob a forma de um ficheiro de valores no link acima. No eixo dos x, está representada a energia verdadeira e nos eixo dos y esta representada a energia medida.

Obtenha os seguintes plots:

4. Finalmente, e este é o caso que se tem habitualmente que resolver, admita que possuía o fluxo medido, $F(E^{\prime})$ e a matriz de transferência, $M(E, E^{\prime})$ e que pretendia obter o fluxo de protões ideal, $F(E)$. Teria então que resolver a seguinte equação matricial: $$ M(E, E^{\prime}) \, F(E) = F(E^{\prime}) $$

Obtenha os seguintes plots:

Os ficheiros que devem existir no final deste exercício são:

 Na avaliação utilizaremos o seguinte comando:

 make bin/Rflux.exe

 que deve compilar e executar correctamente o main anterior.

Problema 3 (2 valores)

Resolva o seguinte sistema linear M x = b composto da matriz de coeficientes M,

M =  0      1      2     1
     1      2      1     0
     0.02   0.01   0     0
     0      0      100   200

e do vector de constantes b,

b = [0.02, 1, 4, 800]

Para tal, construa um programa main cujo nome deve ser Rlinear.C, onde proceda à resolução do sistema e à impressão do vector solução.

Os ficheiros que devem existir no final deste exercício são:

 Na avaliação utilizaremos o seguinte comando:

 make bin/Rlinear.exe

 que deve compilar e executar correctamente o main anterior.