Open rafaelcorreiapoli opened 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.
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
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);
};
Spline.cpp
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 ***/
Deducao das 3 eqs diferenciais:
http://www.geocities.ws/projeto_caos_ufg/modelodelorenz/modelodelorenz.html
*Seria legal colocar as partes principais
@fabianoshimura pode separar pra mim exatamente o que é pra colocar nessa parte da dedução das 3 eq?
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
Só isso? "As 3 equações diferenciais vêm da Equação de Navier Stokes"
Na verdade tem coisa pra caramba.... estou lendo e filtrando o que colocar. vamos caprichar nisso pq eh 1 ponto a mais
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.
@fabianoshimura Subi ai a ultima versao com o 7.3 e os fixes que a gente falou agora no telefone, dá uma olhada
Pode fechar?