90行ほどありますが これまで作成したコードを再利用していますので 実際は23行と何箇所かの修正で済むと思います。
> java Grad 49 423 16.5 88 52 13
Gradの後の数値は「キー番号1 弦長1 番手1 キー番号2 弦長2 番手2」のデータです。
> Key1: 0.48050103 Key2: 15.470475 Grad: 0.08902203
の様に「キー1のインハーモニシティ値: キー2のインハーモニシティ値: 二つの値から傾き(Gradient)」を計算します。
class Grad { static final double[][] Gauge = { /* 番手と直径の配列です */ {12, 0.725},{12.5, 0.750},{13, 0.775},{13.5, 0.800}, {14, 0.825},{14.5, 0.850},{15, 0.875},{15.5, 0.900}, {16, 0.925},{16.5, 0.950},{17, 0.975},{17.5, 1.000}, {18, 1.025},{18.5, 1.050},{19, 1.075},{19.5, 1.100}, {20, 1.125},{20.5, 1.150},{21, 1.175},{21.5, 1.200}, {22, 1.225},{22.5, 1.250},{23, 1.300},{23.5, 1.350}, {24, 1.400},{24.5, 1.450},{25, 1.500}}; static final double Oct = 12; static final int KB = 88; static int Pitch = 440; /* A49キーのピッチ周波数です */ public static void main(String[] argv) { if (argv.length != 6) /* 入力数をチェックします */ errorExit("Input error."); int key1 = 0, key2 = 0; double length1 = 0, length2 = 0; double gauge1 = 0, gauge2 = 0; try { key1 = Integer.parseInt(argv[0]); length1 = Double.parseDouble(argv[1]); gauge1 = Double.parseDouble(argv[2]); key2 = Integer.parseInt(argv[3]); length2 = Double.parseDouble(argv[4]); gauge2 = Double.parseDouble(argv[5]); } catch(NumberFormatException e) { errorExit("Data error."); } /* 入力文字を数値に変換します */ if (key1 < 1 || key1 > KB || key2 < 1 || key2 > KB) errorExit("key# error."); /* キーの範囲を確認します */ double dia1 = getDiameter(gauge1); double dia2 = getDiameter(gauge2); if (dia1 < 0 || dia2 < 0) errorExit("Gauge error."); double inha1 = getInharmo(key1, length1, dia1); double inha2 = getInharmo(key2, length2, dia2); System.out.println("Key1: "+(float)inha1+ " Key2: "+(float)inha2+ " Grad: "+(float)getLSM(key1, inha1, key2, inha2)); } public static double getLSM(int key1, double inh1, int key2, double inh2) { double s1 = 0, s2 = 0, xb = 0, yb = 0, y; double[] tmp = new double[KB+1]; int x, n = 0; tmp[key1] = inh1; tmp[key2] = inh2; for (int i = 1; i <= KB; i++) { if (tmp[i] <= 0) continue; x = i; y = Math.log(tmp[i]); s1 += x*y; s2 += x*x; xb += x; yb += y; n++; } s1 /= n; s2 /= n; xb /= n; yb /= n; return (s1-yb*xb)/(s2-xb*xb); } /* 最小2乗法(指数関数近似)で傾き(Gradient)を計算します */ public static double getInharmo(int key, double len, double ga) { return 3.3*Math.pow(10,13)*Math.pow(getDiameter(ga)/10,2)/ Math.pow(len/10,4)/Math.pow(getFreq(key),2); } /* インハーモニシティ値を計算します */ public static double getDiameter(double gau) { if (gau < 0.725 && gau > 0.1) { Pitch = 415; return gau; /* フォルテピアノ弦の場合... */ } else Pitch = 440; /* ...ピッチを変えて計算します */ for (int i = 0; i < Gauge.length; i++) { if (Gauge[i][0] == gau || Gauge[i][1] == gau) return Gauge[i][1]; } /* 番手 or 直径が合えば直径を返します */ return -1; /* なければエラー(-1)を返します */ } /* 番手 or 直径を確認します */ public static double getFreq(int key) { return Pitch*Math.pow(2, (key-49)/Oct); } /* キーの周波数をピッチから計算します */ public static void errorExit(String str) { System.out.println(str); System.out.println("Usage: java Grad 49 423 16.5 88 52 13"); System.out.println(" java Grad key# length bante(or diameter)"+ " key# length bante(or diameter)"); System.exit(0); } /* エラーメッセージを表示して終了します */ }