This is my programme in c for solving differential equations.When i run my programme in terminal in ubuntu it it is displaying the following error 'segmentation fault'.For compling the programme gcc lorenz.c and ./a.out is the code.I think the problem with arrays in my programme but i am not able to find that mistake.I get a Segmentation fault if N=1000000 but not in case of 10000. Could anyone please help me with this.
/*
solving lorenz system of differential equations by using runge kutta method
*/
#include<stdio. h>
#include<stdlib .h>
#include<math.h >
#define Step 0.01
#define N 1000000
FILE *fp_out;
const double sigma = 10;
double bet;
const double rho = 28;
int i,k;
double fx( double x, double y, double z)
{
double xdot;
xdot = sigma * (y - x) ;
return xdot;
}
double fy( double x, double y, double z)
{
double ydot;
ydot = x*(rho - z) - y;
return ydot;
}
double fz( double x, double y, double z)
{
double zdot;
zdot = y * x - bet * z;
return zdot;
}
/*
putting random initial conditions
*/
void initial(double *x, double *y, double *z)
{
int i;
//srand((unsigned int)time(0)); //Seed number for rand()
x[i] = (rand()/(RAND_MAX + 1.0));
y[i] = (rand()/(RAND_MAX + 1.0));
z[i] = (rand()/(RAND_MAX + 1.0));
}
void rk4(double *x, double *y, double *z)
{
double kx1, kx2, kx3, kx4;
double ky1, ky2, ky3, ky4;
double kz1, kz2, kz3, kz4;
for ( k = 0; k < N; k++ )
{
{
kx1 = Step*fx( x[k], y[k], z[k]);
ky1 = Step*fy( x[k], y[k], z[k]);
kz1 = Step*fz( x[k], y[k], z[k]);
kx2 = Step*fx( x[k] + 0.5*kx1, y[k] + 0.5*ky1, z[k] + 0.5*kz1);
ky2 = Step*fy( x[k] + 0.5*kx1, y[k] + 0.5*ky1, z[k] + 0.5*kz1);
kz2 = Step*fz( x[k] + 0.5*kx1, y[k] + 0.5*ky1, z[k] + 0.5*kz1);
kx3 = Step*fx( x[k] + 0.5*kx2, y[k] + 0.5*ky2, z[k] + 0.5*kz2);
ky3 = Step*fy( x[k] + 0.5*kx2, y[k] + 0.5*ky2, z[k] + 0.5*kz2);
kz3 = Step*fz( x[k] + 0.5*kx2, y[k] + 0.5*ky2, z[k] + 0.5*kz2);
kx4 = Step*fx( x[k] + kx3, y[k] + ky3, z[k] + kz3);
ky4 = Step*fy( x[k] + kx3, y[k] + ky3, z[k] + kz3);
kz4 = Step*fz( x[k] + kx3, y[k] + ky3, z[k] + kz3);
x[k+1] = x[k] + ( kx1 + 2.0*( kx2 + kx3 ) + kx4 )/6.0;
y[k+1] = y[k] + ( ky1 + 2.0*( ky2 + ky3 ) + ky4 )/6.0;
z[k+1] = z[k] + ( kz1 + 2.0*( kz2 + kz3 ) + kz4 )/6.0;
}
}
}
void out_sys( double *x, double *y, double *z)
{
for( k = 9000; k < N; k++ )
{
fprintf(fp_out, "%lf\t", k*Step);
fprintf(fp_out, "%lf\t%lf\t%lf\ n", x[k], y[k], z[k]);
}
}
int main()
{
double x[N];
double y[N];
double z[N];
char fn_out[50];
int i;
/*
give value of bet
*/
{
//initialize
bet=8/3;
initial(x,y,z);
rk4(x,y,z);
//writing the output file
sprintf(fn_out, "bh_%.1lf.out", bet);
fp_out = fopen(fn_out,"w ");
out_sys(x,y,z);
fclose(fp_out);
}
return 0;
}
/*
solving lorenz system of differential equations by using runge kutta method
*/
#include<stdio. h>
#include<stdlib .h>
#include<math.h >
#define Step 0.01
#define N 1000000
FILE *fp_out;
const double sigma = 10;
double bet;
const double rho = 28;
int i,k;
double fx( double x, double y, double z)
{
double xdot;
xdot = sigma * (y - x) ;
return xdot;
}
double fy( double x, double y, double z)
{
double ydot;
ydot = x*(rho - z) - y;
return ydot;
}
double fz( double x, double y, double z)
{
double zdot;
zdot = y * x - bet * z;
return zdot;
}
/*
putting random initial conditions
*/
void initial(double *x, double *y, double *z)
{
int i;
//srand((unsigned int)time(0)); //Seed number for rand()
x[i] = (rand()/(RAND_MAX + 1.0));
y[i] = (rand()/(RAND_MAX + 1.0));
z[i] = (rand()/(RAND_MAX + 1.0));
}
void rk4(double *x, double *y, double *z)
{
double kx1, kx2, kx3, kx4;
double ky1, ky2, ky3, ky4;
double kz1, kz2, kz3, kz4;
for ( k = 0; k < N; k++ )
{
{
kx1 = Step*fx( x[k], y[k], z[k]);
ky1 = Step*fy( x[k], y[k], z[k]);
kz1 = Step*fz( x[k], y[k], z[k]);
kx2 = Step*fx( x[k] + 0.5*kx1, y[k] + 0.5*ky1, z[k] + 0.5*kz1);
ky2 = Step*fy( x[k] + 0.5*kx1, y[k] + 0.5*ky1, z[k] + 0.5*kz1);
kz2 = Step*fz( x[k] + 0.5*kx1, y[k] + 0.5*ky1, z[k] + 0.5*kz1);
kx3 = Step*fx( x[k] + 0.5*kx2, y[k] + 0.5*ky2, z[k] + 0.5*kz2);
ky3 = Step*fy( x[k] + 0.5*kx2, y[k] + 0.5*ky2, z[k] + 0.5*kz2);
kz3 = Step*fz( x[k] + 0.5*kx2, y[k] + 0.5*ky2, z[k] + 0.5*kz2);
kx4 = Step*fx( x[k] + kx3, y[k] + ky3, z[k] + kz3);
ky4 = Step*fy( x[k] + kx3, y[k] + ky3, z[k] + kz3);
kz4 = Step*fz( x[k] + kx3, y[k] + ky3, z[k] + kz3);
x[k+1] = x[k] + ( kx1 + 2.0*( kx2 + kx3 ) + kx4 )/6.0;
y[k+1] = y[k] + ( ky1 + 2.0*( ky2 + ky3 ) + ky4 )/6.0;
z[k+1] = z[k] + ( kz1 + 2.0*( kz2 + kz3 ) + kz4 )/6.0;
}
}
}
void out_sys( double *x, double *y, double *z)
{
for( k = 9000; k < N; k++ )
{
fprintf(fp_out, "%lf\t", k*Step);
fprintf(fp_out, "%lf\t%lf\t%lf\ n", x[k], y[k], z[k]);
}
}
int main()
{
double x[N];
double y[N];
double z[N];
char fn_out[50];
int i;
/*
give value of bet
*/
{
//initialize
bet=8/3;
initial(x,y,z);
rk4(x,y,z);
//writing the output file
sprintf(fn_out, "bh_%.1lf.out", bet);
fp_out = fopen(fn_out,"w ");
out_sys(x,y,z);
fclose(fp_out);
}
return 0;
}
Comment