// Euler.java: 常微分方程式のEuler法による解法 import java.io.*; public class Euler{ public static void main( String argv[] ) throws IOException { double min = 0.0; double max = 1.0; double x, y, dx, dy, yreal, yerror, maxerr; String s; System.out.println("Input: dx"); BufferedReader buf = new BufferedReader(new InputStreamReader(System.in)); s = buf.readLine(); dx = Double.parseDouble(s); System.out.println("dx=" +dx); x = min; y = 0.0; // yの初期条件 yreal = y; yerror = 0.0; maxerr=0.0; try { PrintWriter pw = new PrintWriter(new FileWriter("euler.dat")); pw.println(x+" "+y+" "+yreal+" "+yerror); while(x <= max) { dy = dx*f(x, y); // yの増分 y += dy; x += dx; yreal=Math.sin(2.0*Math.PI*x); // 解析解 yerror=y-yreal; // 誤差=数値解-解析解 if(Math.abs(yerror) > maxerr){ maxerr=Math.abs(yerror); // 誤差の絶対値の最大値 } // System.out.println("x= " +x + " y= " +y); pw.println(x+" "+y+" "+yreal+" "+yerror); } pw.close(); System.out.println("maxerr= " +maxerr); System.out.println("data stored in euler.dat"); } catch (Exception e) { System.err.println("File output error: " + e); } } public static double f(double x, double y) { return(2.0*Math.PI*Math.cos(2.0*Math.PI*x)); /* dy/dx */ } }