/* 日付を入力 * 演習6.5 * 単位円の方程式 f(x) = sqrt(1-x*x) の区間[0.0, 1.0]の積分を * 区分求積法,中点法,台形法それぞれによって求めるプログラムを * 作れ.ただし,区間を100分割するものとする. */ public class Integration2 { // フィールド static final int DIV_NUM = 100; // 区間の分割数 static final double X_MIN = 0.0; // 計算の最小値 static final double X_MAX = 1.0; // 計算の最大値 static final double MIN_DIV = (X_MAX-X_MIN)/(double)DIV_NUM; // 微小区間の定義 // メインメソッド public static void main (String [] args) { try { // 変数の定義 double dx = MIN_DIV; double x = 0.0; double sum_parts = 0.0; // 区分求積法の面積 double sum_midpoint = 0.0; // 中点法の面積 double sum_trapezoid = 0.0; // 台形法の面積 // 途中計算用 double y0 = 0.0; double y1 = 0.0; double y2 = 0.0; Integration2 integration = new Integration2(); // 積分計算 for (int i=0; i<(int)DIV_NUM; i++) { y0 = integration.defineFunction(x); y1 = integration.defineFunction(x+dx/2.0); y2 = integration.defineFunction(x+dx); // 区分求積法による計算 sum_parts += y0 * dx; // 中点法による計算 sum_midpoint += y1 * dx; // 台形法による計算 sum_trapezoid += (y0 + y2) * dx/2.0; x += dx; } // 計算結果の表示 System.out.println("真の値: " + Math.PI); System.out.println("区分求積法: " + sum_parts * 4.0); System.out.println("中点法: " + sum_midpoint * 4.0); System.out.println("台形法: " + sum_trapezoid * 4.0); } catch (Exception e) { System.out.println(e); } } double defineFunction(double x) { if (x <= 1.0) { return Math.sqrt(1-Math.pow(x,2)); } else { return 0.0; } } }