Wilkinson.java

/*
 * Created on 2004/11/11
 * Copyright (C) 2004 Koga Laboratory. All rights reserved.
 *
 */
package org.mklab.cga.util;

import org.mklab.nfc.matrix.DoubleMatrix;


/**
 * J.H.Wilkinsonの固有値テスト行列を作るクラスです。
 * 
 * @author hiroki
 * @version $Revision: 1.4 $.2004/11/11
 */
public class Wilkinson {

  /**
   * J.H.Wilkinsonの固有値テスト行列を作ります。 これは、近い値の組み合わせからなる対称な三重対角行列ですが、固有値には正確には一致しません。
   * 
   * @param n 行列の大きさ。
   * @return Wilkinson行列。
   */
  public static DoubleMatrix wilkinson(int n) {
    double d = (n - 1) / 2.0;

    DoubleMatrix wilkinson = new DoubleMatrix(n, n);

    for (int i = 0; i < (n + 1) / 2; i++) {
      wilkinson.setElement(i + 1, i + 1, d);
      d = d - 1;
    }

    d = d + 1;

    if (n % 2 == 0) {
      for (int i = (n + 1) / 2; i < n; i++) {
        wilkinson.setElement(i + 1, i + 1, d);
        d = d + 1;
      }
    } else {
      for (int i = (n + 1) / 2; i < n; i++) {
        d = d + 1;
        wilkinson.setElement(i + 1, i + 1, d);
      }
    }

    for (int i = 0; i < n - 1; i++) {
      wilkinson.setElement(i + 2, i + 1, 1.0);
      wilkinson.setElement(i + 1, i + 2, 1.0);
    }

    return wilkinson;
  }
}