rafaelcorreiapoli / relatorio

0 stars 0 forks source link

Parte 7: Apêndice #8

Open rafaelcorreiapoli opened 8 years ago

rafaelcorreiapoli commented 8 years ago
fabianoshimura commented 8 years ago

Spline Cubico:

Definição: Dada uma função f definida em [a, b] e um conjunto de nós a = x0 < x1 < ... < xn = b, um spline cúbico interpolador S para f é uma função que satisfaz as seguintes condições:

a. S(x) é um polinômio cúbico, indicado por Sj(x), no subintervalo [xj, xj+1] para cada j = 0, 1, ..., n-1; b. S(xj) = f(xj) para cada j = 0, 1, ..., n-2; c. Sj+1(xj+1) = Sj(xj+1) para cada j = 0, 1, ..., n-2; d. S’j+1(xj+1) = S’j(xj+1) para cada j = 0, 1, ..., n-2; e. S’’j+1(xj+1) = S’’j(xj+1) para cada j = 0, 1, ..., n-2; f. Um dos seguintes conjuntos de condições de contorno é satisfeito: (i) S’’(x0) = S’’(xn) = 0 (contorno livre ou natural); (ii) S’(x0) = f ’(x0) e S’(xn) = f ’(xn) (contorno restrito).

Este trabalho utiliza a condição livre, ou seja, o método do Spline Cúbico Natural. O polinômio gerado tem a forma

S(x) = Sj(x) = aj + bj(x - xj) + cj(x - xj)2 + dj(x - xj)3

Para a montagem do gráfico na parte de análise de resultados por Spline, utilizamos a função "splin" do SciLab, cujo algoritmo é fechado ao uso do software. A fim de propor uma melhor explicação da utilização do método, um algoritmo alternativo (adaptado do arquivo fonte de Matlab) encontra-se abaixo com comentários em cada etapa importante.

fabianoshimura commented 8 years ago

include

include "Parametros.h"

include "Spline.h"

using namespace std;

int main(){ Spline spl(nPontos); //declaração e passagem de parâmetro para construtor da Classe Spline. spl.leituraPontos(); //Lê do arquivo pontos.txt, os pontos que serão interpolados. spl.exibePontos(); //Exibe na tela os pontos spl.passo1(); // gera os h's, pela equacao hi = xi+1 - xi /* spl.passo2(); // passo de 2 a 6 é a resolução do sistema linear. spl.passo3e4(); spl.passo5e6();*/ spl.preparandoThomas(); // prepara o sistema e utiliza o algoritmo de thomas pra resolver-lo. spl.saidaSpline(); // saida na tela e em arquivo .txt, dos coeficientes das do spline Cúbico. spl.splineCubicoGNU(); // gera um arquivo .gnu para desenhar o gráfico da solução.

system("PAUSE");
return EXIT_SUCCESS;

}

Spline.h

// Classe Spline

include "Parametros.h"

ifndef SPLINE

define SPLINE

class Spline{ private: //Atributos Privados int n; double* x; double* y; double* h; double* a; double* b; double* c; double* d;
double* alfa;
double* beta;
double* gama;
double* delta;
public: //Métodos Públicos

  Spline(int ns); // Construtor da Classe Spline
  void leituraPontos(void); // Lê os pontos do arquivo "ponto.txt"      
  void exibePontos(void); // Exibe na tela esses pontos

  //* Gera os h's, espaços entre os x's
  void passo1(void);

  //* Metodos usados para resolver o Sistema Linear
  void passo2(void);
  void passo3e4(void);
  void passo5e6(void);
  //***************************

  //* Metodos usados para resolver o Sistema Linear, usando algorimto de Thomas
  void algoritmoThomas(double *A,double *B, double *C, double *D, double *X, long int N);
  void preparandoThomas(void);
  //***************************

  //* Exibe os coeficientes dos polinômios
  void saidaSpline(void);
  //* Gera um arquivo .gnu para ser plotado
  void splineCubicoGNU(void);

};

endif

Spline.cpp

include "Spline.h"

include

include

using std::cout; using std::cin; using std::endl;

using namespace std;

Spline::Spline(int ns){ // Construtor n = ns - 1; // são ns pontos(qntdade de pontos), mas a referencia será de ns-1 para os métodos x = new double[n+1]; // vetor x, armazena os valores do eixo x
y = new double[n+1]; // vetor y, armazena os valores do eixo y, os f(x). h = new double[n+1]; // vetor h, q armazena os espaços entres os x's. a = new double[n+1]; // equivale aos f(x), aj = f(xj), são termos independentes dos polinomios gerados b = new double[n+1]; // são os valores q multiplicam o termo linear, bj(x-xj) c = new double[n+1]; // são os valores q multiplicam o termo quadratico, cj(x-xj)^2 d = new double[n+1]; // são os valores q multiplicam o termo cúbico, dj*(x-xj)^3 //Nota: S(x) = Sj(x) = aj + bj(x - xj) + cj(x - xj)^2 + dj(x - xj)^3

// São váriaveis auxiliares usadas no algoritmo 1, par resolver o sistma linear alfa = new double[n+1];
beta = new double[n+1]; gama = new double[n+1]; delta = new double[n+1]; }

void Spline::leituraPontos(void){ // classe ifstream, de leitura ifstream arq("pontos.txt"); //Leitura dos pontos do problema, no arquivo pontos.txt for (int i=0; i <= n; i++){ if (! arq.eof()){ arq >> x[i]; arq >> y[i]; a[i] = y[i]; // ai = f(xi) } } }

void Spline::exibePontos(void){ // Exibe na tela os pontos q foram lidos. cout << "j xj f(xj) \n"; cout << "----------------------\n"; for (int i=0; i <= n; i++){ printf("%d\t%0.2f\t%0.2f\n",i,x[i],y[i]); } cout << "\nPrecione Enter pra executar o método Spline Cubica."; getchar(); cout << "\n\n"; }

//Nota: S(x) = Sj(x) = aj + bj(x - xj) + cj(x - xj)^2 + dj(x - xj)^3 void Spline::passo1(void){ // Calcura os h's, distancia entres os x's for (int i=0; i < n; i++){ h[i] = x[i+1] - x[i]; } }

/* ALGORITMO 1 - Resolução do Sistema Linear / // Consiste nos Passos de 2 a 6 void Spline::passo2(void){ for (int i=1; i < n; i++){ alfa[i] = (3.0/h[i])(a[i+1] - a[i]) - (3.0/h[i-1])*(a[i] - a[i-1]); } }

void Spline::passo3e4(void){ beta[0] = 1.0; gama[0] = 0.0; delta[0] = 0.0; for (int i=1; i < n; i++){ beta[i] = 2.0_(x[i+1] - x[i-1]) - h[i-1]_gama[i-1]; gama[i] = h[i]/beta[i]; delta[i] = (alfa[i] - h[i-1]*delta[i-1])/beta[i]; } }

void Spline::passo5e6(void){ beta[n] = 1.0; gama[n] = 0.0; delta[n] = 0.0; for (int j=n-1; j >=0 ; j--){ c[j] = delta[j] - gama[j]c[j+1]; b[j] = (a[j+1] - a[j])/h[j] - h[j](c[j+1] + 2.0_c[j])/3.0; d[j] = (c[j+1] - c[j])/(3_h[j]); } } /* Fim do Algoritmo 1 ***/

fabianoshimura commented 8 years ago

Deducao das 3 eqs diferenciais:

http://www.geocities.ws/projeto_caos_ufg/modelodelorenz/modelodelorenz.html

*Seria legal colocar as partes principais

rafaelcorreiapoli commented 8 years ago

@fabianoshimura pode separar pra mim exatamente o que é pra colocar nessa parte da dedução das 3 eq?

fabianoshimura commented 8 years ago

Coloca que as 3 equacoes diferenciais vem da Equacao de Navier Stokes

Fabiano M. Shimura (+55-11)97225-9100Date: Mon, 4 Apr 2016 19:25:25 -0700 From: notifications@github.com To: relatorio@noreply.github.com CC: fabianoshimura@hotmail.com Subject: Re: [rafaelcorreiapoli/relatorio] Parte 7: Apêndice (#8)

@fabianoshimura pode separar pra mim exatamente o que é pra colocar nessa parte da dedução das 3 eq?

— You are receiving this because you were mentioned. Reply to this email directly or view it on GitHub

rafaelcorreiapoli commented 8 years ago

Só isso? "As 3 equações diferenciais vêm da Equação de Navier Stokes"

fabianoshimura commented 8 years ago

Na verdade tem coisa pra caramba.... estou lendo e filtrando o que colocar. vamos caprichar nisso pq eh 1 ponto a mais

fabianoshimura commented 8 years ago

Apendice B - As equacoes de Lorentz

O Atractor de Lorenz foi introduzido por Edward Lorenz em 1963, que o derivou a partir das equações simplificadas de rolos de convecção que ocorrem nas equações da atmosfera. É um mapa caótico que mostra como o estado de um sistema dinâmico evolui no tempo num padrão complexo, não-repetitivo e cuja forma é conhecida por se assemelhar a uma borboleta. Trata-se de um sistema não-linear, tridimensional e determinístico que exibe comportamento caótico e demonstra aquilo a que hoje se chama um atractor estranho. As equações do modelo de Lorenz introduzidas são desenvolvidas a partir da equação de escoamento Navier-Stokes e a equação que descreve a difusão da energia térmica. A dedução do modelo não está no escopo do trabalho, uma vez que ela é derivada de várias simplificações e conjecturas modeladas.

rafaelcorreiapoli commented 8 years ago

@fabianoshimura Subi ai a ultima versao com o 7.3 e os fixes que a gente falou agora no telefone, dá uma olhada

rafaelcorreiapoli commented 8 years ago

Pode fechar?