9ª Aula Prática de TFCOMP-II

Comecem por criar e guardar em disco um Notebook com o nome TFC9_grupo.nb, onde 'grupo' é o nome do vosso grupo de trabalho. Neste Notebook criem uma célula de título identificando os elementos constituintes do grupo (nome, número e contactos).

Problema 1

Construa uma função IFS[NrPts, Pt0] usando Mathlink para comunicar com um programa em C que faça os cálculos de um  sistema de funções iteradas baseado em transformações afins (Subscript[A, 1]), (Subscript[A, 2]), (Subscript[A, 3]), (Subscript[A, 4]) de (ℝ^2), i.e. matrizes 2×3 actuando em {x, y, 1}. Use o Mathematica para alterar os valores das matrizes e do ponto inicial, e para fazer o gráfico da imagem resultante. Inspire o seu programa na seguinte rotina:

(Subscript[A, 1])=(({{0.`, 0.`, 0.`}, {0.`, 0.16`, 0.`}}));
(Subscript[A, 2])=(({{0.85`, -0.04`, 0.`}, {0.04`, 0.85`, 1.6`}}));
(Subscript[A, 3])=(({{0.2`, -0.26`, 0.`}, {0.23`, 0.22`, 1.6`}}));
(Subscript[A, 4])=(({{-0.15`, 0.28`, 0.`}, {0.26`, 0.24`, 0.44`}}));
Π = {0.01, 0.65, 0.07, 0.27}; 
\(Δ = \((∑\+\(i = 1\)\%#1 Π[[i]] &)\) /@ 
                Range[Length[Π] - 1]; \)
\({x, y} = {\(-1\), \(-1\)}; 		

            ifs = {}; \)
Do[ℛ = Random[Real, 1]; 
              Which[ℛ < Δ[[1]], 
                k = 1, ℛ < Δ[[2]], 
                k = 2, ℛ < Δ[[3]], 
                k = 3, ℛ < 1. , k = 4]; {x, y} = 
                (Subscript[A, k]) . {x, y, 1}; 
              If[i > 10, AppendTo[ifs, {x, y}]], {i, 1, 8000}]

ListPlot[ifs, PlotRange -> {0, 10}, 
        Axes -> None, Frame -> False, 
        PlotJoined -> False];

Problema 2

Adapte o programa avevar do Numerical Recipes in C para trabalhar com listas de números fornecidos pelo Mathematica através de MathLink. Use-o para calcular e devolver os valores médios e variâncias  pedidos no Problema-3 da 7ª aula prática.

void avevar(data,n,ave,svar)
float data[],*ave,*svar;
int n;
{
	int j;
	float s;
	*ave=(*svar)=0.0;
	for (j=1;j<=n;j++) *ave += data[j];
	*ave /= n;
	for (j=1;j<=n;j++) {
		s=data[j]-(*ave);
		*svar += s*s;
	}
	*svar /= (n-1);
}

Problema 3

A análise de sistemas dinâmicos  leva frequentemente a estudar atractores estranhos obtidos pela iteração das mesmas equações de transformação de um ou mais pontos iniciais. Tomando a seguinte função como exemplo,  construa um rotina em C para calcular eficientemente o atractor, sendo os parâmetros definidos no Mathematica e transmitidos via MathLink. Construa uma representação do atractor en função do parâmetro α.

\(TraditionalForm\`attract(n_, m_, α_) := 
      Block[{}, X\_min = \(-4. \); X\_max = 4. ; Y\_min = \(-3. \); 
        Y\_max = 3. ; points = {PointSize[ .001]}; 
        OVFLOW = 10\^10; 
a = 
          cos \((2. \ π\ α)\); 
        b = sin \((2. \ π\ α)\); 
For[k = 0, 
          k ≤ m, \(k++\), x\_o = Random[]; y\_o = Random[]; 
          For[j = 0, 
            j ≤ n, \(j++\), 
x\_1 = 
              b\ x\_o\%2 + a\ x\_o + b\ y\_o; 	
            x\&_ = \(x\_1 - X\_min\)\/\(X\_max - X\_min\); 
y\_1 = a\ x\_o\%2 - b\ x\_o + a\ y\_o; 	
            y\&_ = \(y\_1 - Y\_min\)\/\(Y\_max - Y\_min\); 
            If[x\_1\%2 < OVFLOW ∧ y\_1\%2 < OVFLOW, 
              If[x\&_ < 1 ∧ y\&_ < 1 ∧ x\&_ > 0 ∧ 
                  y\&_ > 0 ∧ j > 10, 
                AppendTo[points, 
                  Point[{x\&_, y\&_}]]]; 
x\_o = x\_1; 
              y\_o = y\_1;, 
Break]]]]\)

Show[
      Graphics[attract(250, 30,  .3); points]]