YouTube
Simulation [gnuplot]
Case 1 : $\sqrt{2}$
Make DAT file [C]
Get "r2_1M.dat" (line:21) → The Square Root of Two to 1 Million Digits (APOD)▼ RW-r2.c
#include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #define LIMIT 1000000 // Digits #define LENGTH 80 // The number of characters per line #define NUM0 4 // Number of leading zeros // Link(APOD) : 1.414213562373095048... // -> r2_1M.dat:0000414213562373095048... #define PI 3.1415 int main(void){ FILE *fp, *fq; char str[256]; double x = 0; // Position.x double y = 0; // Position.y int i, j, k; // For Loop counter int digit; // Current digit int num; // Number fp = fopen("r2_1M.dat", "r"); // Make this file by yourself fq = fopen("randomwalk-r2.dat", "w"); if(fp==NULL){ printf("File not found. Program terminated.\n"); exit(1); } fprintf(fq, "%.3lf\t%.3lf\n",x, y); // Initiate value // i: row, j: column, k: 0 - 9 for(i=1; fgets(str, sizeof(str), fp)!=NULL; i++){ for (j=0; j<LENGTH; j++){ // Calculate current digit digit = (LENGTH*(i-1)+j+1) - NUM0; // Ignore leading zero NUM0 times if(digit<=0) continue; // From (NUM0+1)th digit on for(k=0; k<10; k++){ // Check matching between k and num num = str[j] - '0'; if(num ==k){ // Calculate x and y x += cos(2*PI*k/10); y += sin(2*PI*k/10); fprintf(fq, "%.3lf\t%.3lf\t%d\t%7d\n",x, y, k, digit-NUM0); break; } } if(digit==LIMIT) break; } if(digit==LIMIT) break; } fclose(fq); fclose(fp); return 0; }→make "randomwalk-r2.dat"
Draw $\sqrt{2}$ random walk [gnuplot]
▼ RW-r2.plt# Setting -------------------- reset set terminal gif animate delay 6 size 1280, 720 set output "randomwalk-pi.gif" set size ratio 1 set nokey set xr[-2000:200] set yr[-600:1600] set tics font 'Times, 20' unset xl unset yl N = 1000000 # Digits dec = 200 # Decimation #system "mkdir png" # Make folder for storing PNG files DIGIT(i) = sprintf("Digits: %d\n", i) # Label displaying digits # Plot -------------------- do for[i=0:N]{ # Digits set label 1 left DIGIT(i) font 'Times, 22' at graph 1.04, 0.03 # Decimate and draw (the number of files: N/200+1) if(i%dec==0){ # Draw initiate value if(i==0){ plot 1/0 continue } # Update plot 'randomwalk-r2.dat' every ::0::i-1 using 1:2 with lines lc rgb "red" } } set out
▼ randomwalk-r2.gif (dec=5000)
Case 2 : $\pi$
Make DAT file [C]
Get "pi_1M.dat" (line:23) → 1 Million Digits of Pi (Pi Land by Eve)▼ RW-pi.c
#define LENGTH 50 // The number of characters per line #define NUM0 0 // Number of leading zeros // Link(Pi Land) :141592653589793238462643... // -> pi_1M.dat :141592653589793238462643...
fp = fopen("pi_1M.dat", "r"); fq = fopen("randomwalk-pi.dat", "w");→make "randomwalk-pi.dat"
Draw $\pi$ random walk [gnuplot]
▼ RW-pi.pltplot 'randomwalk-pi.dat' every ::0::i-1 using 1:2 with lines lc rgb "blue"
▼ randomwalk-pi.gif (dec=5000)
Case 3 : $e$
Make DAT file [C]
Get "e_1M.dat" (line:23) → The Number e to 1 Million Digits (APOD)▼ RW-pi.c
#define LENGTH 80 // The number of characters per line #define NUM0 4 // Number of leading zeros // Link(APOD) : 2.718281828459045235360... // -> e_1M.dat :0000718281828459045235360...
fp = fopen("e_1M.dat", "r"); fq = fopen("randomwalk-e.dat", "w");→make "randomwalk-e.dat"
Draw $e$ random walk [gnuplot]
▼ RW-e.pltplot 'randomwalk-e.dat' every ::0::i-1 using 1:2 with lines lc rgb "green"
▼ randomwalk-e.gif (dec=5000)
Extra
Draw random walks of $\sqrt{2}$, $\pi$, and $e$ simultaneouslyRead DAT files created already and plot them
▼ 3RWs.plt# Setting -------------------- reset set terminal png enhanced font "Times" 20 size 720, 720 set xr[-2000:200] set yr[-800:1400] set size ratio 1 set tics font 'Times, 20' set xtics 400 set ytics 400 unset key # Axes set arrow 1 nohead from 0, -800 to 0, 1400 lc rgb "black" lw 2 set arrow 2 nohead from -2000, 0 to 200, 0 lc rgb "black" lw 2 # Digits N = 1000000 # Arrays array num[3] = ["r2", "pi", "e"] # Number array color[3] = ["red", "blue", "green"] # Color # Functions -------------------- PNG(i) = sprintf("img_%04d.png", i) # Output img_000i.png DAT(i) = sprintf("randomwalk-%s.dat", num[i]) # num[i] -> name of DAT files # Plot DAT files -------------------- do for[i=1:3]{ set output PNG(i) str = "plot " # Command (need space) # Make the command using string concatenation ("A"."B" -> "AB") do for [j=1:i] { if(j!=1){ str = str.", " # Need ", " for plotting DAT files together } str = str.sprintf("'%s' every ::0::N with lines lc rgb '%s' lw 0.5", DAT(j), color[j]) } eval str # Execute this command # i=1: plot 'randomwalk-r2.dat' every ::0::N with lines lc rgb 'red' lw 0.5 # i=2: plot 'randomwalk-r2.dat' every ::0::N with lines lc rgb 'red' lw 0.5, # 'randomwalk-pi.dat' every ::0::N with lines lc rgb 'blue' lw 0.5 # i=3: plot 'randomwalk-r2.dat' every ::0::N with lines lc rgb 'red' lw 0.5, # 'randomwalk-pi.dat' every ::0::N with lines lc rgb 'blue' lw 0.5, # 'randomwalk-e.dat' every ::0::N with lines lc rgb 'green' lw 0.5 } set out
Output PNG files
img_0001.png ($\sqrt{2}$) | img_0002.png ($\sqrt{2}, \pi$) | img_0003.png ($\sqrt{2}, \pi, e$) |
No comments:
Post a Comment