解答例 - j1.lesson04.TrapezoidRuleOpt

package j1.lesson04;

import java.io.*;

/**
 * 課題0403 - 解答例 (高速化版).
 * @author s.arakawa
 * @version $Id: TrapezoidRuleOpt_java.rps,v 1.1 2006/03/06 12:56:15 java2005 Exp $
 */
public class TrapezoidRuleOpt {

    /**
     * コンソールに積分区間(下端、上端の順)を入力させ、
     * sin(x)を指定された積分区間でxについて定積分の近似を求めるプログラム。
     * @param args 無視される
     * @throws IOException 入力中に例外が発生した場合
     */
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        System.out.print("開始位置を入力:");
        double x0 = Double.parseDouble(reader.readLine());
        System.out.print("終了位置を入力:");
        double xn = Double.parseDouble(reader.readLine());
        
        int n = 10000;
        
        // h * Σ{i=1..n-1} f(xi) + h / 2 * (f(x0) + f(xn)) へ変形
        double middle = 0.0;
        for (int i = 1; i <= n - 1; i++) {
            double xi = x0 + (xn - x0) * i / n;
            double fxi = Math.sin(xi);
            middle += fxi;
        }
        double h = (xn - x0) / n;

        // さらに h を括り出す
        double result = h * (middle + (Math.sin(x0) + Math.sin(xn)) / 2);

        System.out.println("結果は" + result);
    }
}