Aschneider
(usa Outra)
Enviado em 14/05/2014 - 21:50h
rei astro: O algoritmo será postado no final. O algoritmo é um integrador de equações diferenciais conhecido como runge-kutta de quarta ordem. Tal algoritmo dá como resposta um arquivo .dat com a solução numérica de uma integral para um problema comum em física chamado massa-mola. Foi criado pelo meu orientador e funciona perfeitamente no ubuntu 12.04 ou inferior e também em compiladores no windows.
saitam: Nunca utilizei esse 'gdb'. Pretendo realizar o teste sugerido. Sou matemático, não entendo muita coisa de programação.
cmazzer: O comando é: gcc integrador.c -fm
O arquivo a.out é gerado sem problemas. Porém quando o executo no terminal (via comando ./a.out), aparece aparece a frase ''falha de segmentação (imagem do núcleo gravada).
Utilizando apenas a lógica. Acredito que o problema esteja relacionado com bibliotecas nos arquivos no início do algoritmo, como 'stdio.h', 'math.h' e etc. Pois, se houvesse algum erro no algoritmo, o mesmo não iria rodar em compiladores do windows, ou mesmo no ubuntu 12.04 ou inferior.
Observação: Para que o algoritmo gere o executável é necessário no diretório o arquivo 'nrutil.h'.
Pessoal, muito obrigado por responderem.
Algoritmo
# include <stdio.h>
# include <math.h>
#include <time.h>
#include <stdlib.h>
#include "nrutil.h"
# define N 4 /*Numero de eq diferenciais parciais de 1a ordem*/
# define h 0.01 /*Passo da Integracao*/
# define Pi 3.141592654
/* Declaracao das funcoes */
void calcula_d(double t,double pontos[N],double derivadas[N]);
void rk4 (double t0,double y_antes[N],double y_depois[N]);
double mod(double x, double y);
double heaviside(double x);
/* Declaracao das variaveis globais */
double m=80; //massa da particula acoplada `a mola
double g=9.81; //constante da mola
double gama=5.38;
double A=0.00538/80;
int main (int argc, char *argv[])
{
double y[N]={0.0},y_depois[N],t=0;
int i,j;
FILE *ofp;
ofp=fopen("phase_space.dat","w");
//condicoes iniciais:
t=0.0;
y[0]=0;
y[1]=3048;
y[2]=134;
y[3]=0;
while(t<262.)
{
printf("%f \n",t); //impressao na tela
//integracao numerica
rk4(t,y,y_depois);
for(i=0;i<N;i++) y[i]=y_depois[i];
t=t+h;
fprintf(ofp,"%f %f %f %f %f\n",t, y[0],y[1], y[2], y[3]); //impressao para arquivo "phase_space.dat"
}
}
/* Funcoes */
//Funcao derivada
void calcula_d(double t,double pontos[N],double derivadas[N])
{
double x, y, u, v;
x=pontos[0];
y=pontos[1];
u=pontos[2];
v=pontos[3];
derivadas[0]=pontos[2]; //
derivadas[1]=pontos[3];
derivadas[2]=-A*u*sqrt(u*u+v*v);
derivadas[3]=-g-A*v*sqrt(u*u+v*v);
}
// integrador de Runge-Kutta de quarta ordem
void rk4 (double t0,double y_antes[N],double y_depois[N])
{
int i;
double t;
double y_copia[N], k[4][N],derivadas[N];
t=t0;
for(i=0;i<N;i++) y_copia[i] = y_antes[i];
calcula_d(t,y_copia,derivadas);
for(i=0;i<N;i++) k[1][i]=h*derivadas[i];
t=t0+h/2;
for(i=0;i<N;i++) y_copia[i]= y_antes[i]+k[1][i]/2;
calcula_d(t,y_copia,derivadas);
for(i=0;i<N;i++) k[2][i]=h*derivadas[i];
t=t0+h/2;
for(i=0;i<N;i++) y_copia[i]=y_antes[i]+k[2][i]/2;
calcula_d(t,y_copia,derivadas);
for(i=0;i<N;i++) k[3][i]=h*derivadas[i];
t=t0+h;
for(i=0;i<N;i++) y_copia[i]=y_antes[i]+k[3][i];
calcula_d(t,y_copia,derivadas);
for(i=0;i<N;i++) k[4][i]=h*derivadas[i];
for(i=0;i<N;i++) y_depois[i]=y_antes[i]+k[1][i]/6+k[2][i]/3+k[3][i]/3+k[4][i]/6;
}