#include <stdio.h> #include <math.h> #define IMAX 100001 double func(double x, double y); int mk_plot_data(char *a, double x[], double y[], int n); int mk_graph(char *f); /*================================================================*/ /* main function */ /*================================================================*/ int main(){ double x[IMAX], y[IMAX]; double final_x, h; double k1, k2, k3, k4; char temp; int ncal, i; /*-- set initial condition and cal range --*/ printf("\ninitial value x0 = "); scanf("%lf%c", &x[0], &temp); printf("\ninitial value y0 = "); scanf("%lf%c", &y[0], &temp); printf("\nfinal x = "); scanf("%lf%c", &final_x, &temp); do{ printf("\nNumber of calculation steps( <= %d ) = ",IMAX-1); scanf("%d%c", &ncal, &temp); }while(ncal > IMAX-1); /* -- size of calculation step -- */ h=(final_x-x[0])/ncal; /* -- 4th Runge Kutta Calculation -- */ for(i=0; i < ncal; i++){ k1=h*func(x[i],y[i]); k2=h*func(x[i]+h/2.0, y[i]+k1/2.0); k3=h*func(x[i]+h/2.0, y[i]+k2/2.0); k4=h*func(x[i]+h, y[i]+k3); x[i+1]=x[i]+h; y[i+1]=y[i]+1.0/6.0*(k1+2.0*k2+2.0*k3+k4); } /* -- make a graph -- */ mk_plot_data("out.txt", x, y, ncal); mk_graph("out.txt"); return 0; } /*================================================================*/ /* define function */ /*================================================================*/ double func(double x, double y){ double dydx; dydx=sin(x)*cos(x)-y*cos(x); return(dydx); } /*==========================================================*/ /* make a data file */ /*==========================================================*/ int mk_plot_data(char *a, double x[], double y[], int n){ int i; FILE *out; out = fopen(a,"w"); for(i=0; i<=n; i++){ fprintf(out,"%e\t%e\n", x[i], y[i]); } fclose(out); return 0; } /*==========================================================*/ /* make a graph */ /*==========================================================*/ int mk_graph(char *f){ FILE *gp; gp = popen("gnuplot -persist","w"); fprintf(gp,"reset\n"); fprintf(gp,"set terminal postscript eps color\n"); fprintf(gp,"set output \"graph.eps\"\n"); fprintf(gp,"set grid\n"); /* ---- plat graph -----*/ fprintf(gp,"plot \"%s\" using 1:2 with line\n",f); fprintf(gp,"set terminal x11\n"); fprintf(gp,"replot\n"); pclose(gp); return 0; }
各行の役割は、以下の通りである。