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