計算機プログラミングI

対角線の標準偏差を計算するプログラム(メソッドを使う場合)


// 長方形の対角線の長さの標準偏差を求める
class DiagonalWithMethods {

  static double squareRoot(double x) { // xの平方根を求める
    double epsilon = 1e-5d;	// 計算精度
    double guess = x/2;		// 推定値
    double delta = x - guess*guess; // 誤差

    while (epsilon < Math.abs(delta)) { // 誤差が大きい間改良を続ける
      guess = guess/2 + x/2/guess; // ニュートン法
      delta = x - guess*guess; // 誤差を更新
    }
    return guess;		// 推定値を答えとして返す
  }

  // x の 2 乗を求める
  static double square(double x) {return x*x;}

  static double average(double[] numbers) { // 平均値を求める
    double sum = 0;		// 合計を求める変数
    for (int i = 0; i < numbers.length; i++)
      sum = sum + numbers[i];	// 各要素を加える
    return sum / numbers.length; // 合計を要素数で割る
  }

  // 数列xの標準偏差を求める:
  static double stdDev(double[] x) {
    double squareX[] = new double[x.length]; // 2乗値の数列を作る
    for (int i = 0; i < x.length; i=i+1)
      squareX[i] = square(x[i]);
    // 標準偏差 = (2乗値の平均)と(平均値の2乗)の差の平方根
    return squareRoot( average(squareX) - square(average(x)));
  }

  // 三平方の定理から対角線長を計算
  static double diagonal(double width, double height) {
    return squareRoot(square(width) + square(height));
  }

  public static void main(String[] args) {

    // 長方形の幅と高さ
    double widths[] = new double[] { 20, 18, 24, 31, 17 };
    double heights[] = new double[] { 4,  5,  7,  2,  3 };

    double diagonals[] = new double[widths.length]; // 対角線長
    // 全ての長方形について対角線長の2乗を計算
    for (int i = 0; i < widths.length; i=i+1)
      diagonals[i] = diagonal(widths[i],heights[i]);

    System.out.println("対角線長の平均は"+average(diagonals)
		       +",標準偏差は"+stdDev(diagonals)+"です。");
  }
}


Hidehiko Masuhara, November 2000