解答例 - 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[] argsthrows 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);
    }
}