/* * 日付を入力 * 演習6.16 * オイラー法,修正オイラー法による近似解を求めるクラス. * ファイル書き込みのためにjava.ioクラスを使用. */ import java.io.*; // ファイル操作を行うためのインポート public class DifferentialEquationSolver2 { // フィールド int division_number; // 分割数 double initial_x; // xの初期値 double initial_y; // yの初期値 double maximum_x; // xの最大値 // コンストラクタ DifferentialEquationSolver2(int n, double xi, double yi, double xm) { division_number = n; // 分割数を代入 initial_x = xi; // xの初期値を代入 initial_y = yi; // yの初期値を代入 maximum_x = xm; // xの最大値を代入 } // 関数の定義 f(x, y) = cos(x) public double defineFunction(double x, double y) { return Math.cos(x); } // 導関数の定義 f'(x, y) = -sin(x) public double defineDerivedFunction(double x, double y) { return -Math.sin(x); } // オイラー法を行うメソッド double calculateEuler() { try { // ファイル書き込みの失敗等による例外処理を考慮 // ファイル書き込みオブジェクトの作成 FileWriter fout = new FileWriter("euler.txt"); /* 初期値および区間幅の設定 */ double x = initial_x; // xの初期値を代入 double y = initial_y; // yの初期値を代入 double h = (maximum_x - initial_x) / (double)division_number; // 区分幅の計算 // 初期値をファイルへ出力 fout.write(x + " " + y + "\n"); // 確認のため標準出力へ出力 System.out.println(x + " " + y); /* オイラー法による計算 */ for (int i=1; i<=division_number; i++) { // y = y + h * f(x, y).関数f(x, y)は,defineFunctionメソッドで定義 y += h * defineFunction(x, y); // 次のxの値を代入. x = initial_x + i * h; // 計算結果をファイルへ出力 fout.write(x + " " + y + "\n"); // 確認のため標準出力へ出力 System.out.println(x + " " + y); } // ファイルを閉じる fout.close(); return y; } catch (Exception e) { // 例外処理 System.out.println(e); return -1; } } // double calculateEuler() // 修正オイラー法を行うメソッド double calculateModifiedEuler() { try { // ファイル書き込みの失敗等による例外処理を考慮 // ファイル書き込みオブジェクトの作成 FileWriter fout = new FileWriter("modified_euler.txt"); /* 初期値および区間幅の設定 */ double x = initial_x; // xの初期値を代入 double y = initial_y; // yの初期値を代入 double h = (maximum_x - initial_x) / (double)division_number; // 区分幅の計算 // 初期値をファイルへ出力 fout.write(x + " " + y + "\n"); // 確認のため標準出力へ出力 System.out.println(x + " " + y); /* オイラー法による計算 */ for (int i=1; i<=division_number; i++) { // y = y + h * f(x, y) + h^2 * f'(x, y) / 2. // 関数f(x, y),f'(x, y)は,defineFunction,defineDerivedFunctionメソッドで定義. y += h * defineFunction(x, y) + h * h * defineDerivedFunction(x, y) / 2; // 次のxの値を代入. x = initial_x + i * h; // 計算結果をファイルへ出力 fout.write(x + " " + y + "\n"); // 確認のため標準出力へ出力 System.out.println(x + " " + y); } // ファイルを閉じる fout.close(); return y; } catch (Exception e) { // 例外処理 System.out.println(e); return -1; } } // double calculateEuler() } // class DifferentialEquationSolver