// 長方形の対角線の長さの標準偏差を求める 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