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);
}
}
|