Chebyshev.java

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

import org.mklab.nfc.matrix.DoubleMatrix;
import org.mklab.nfc.scalar.DoublePolynomial;


/**
 * チェビシェフ補間を行うクラスです。
 * 
 * @author hiroki
 * @version $Revision: 1.8 $.2004/12/22
 */
public class Chebyshev {

  /** */
  private String var;

  /**
   * コンストラクタ
   * 
   */
  public Chebyshev() {
    this.var = "x"; //$NON-NLS-1$
  }

  /**
   * コンストラクタ
   * 
   * @param var 変数
   */
  public Chebyshev(String var) {
    this.var = var;
  }

  /**
   * n次のチェビシェフ多項式を返します。
   * 
   * @param n 次数。
   * @return n次チェビシェフ多項式。
   */
  public DoublePolynomial interpolate(int n) {
    DoublePolynomial p = null;
    if (n == 0) {
      p = new DoublePolynomial(1, this.var);
    } else if (n == 1) {
      p = new DoublePolynomial(new double[] {0, 1}, this.var);
    } else {
      DoubleMatrix t1 = new DoubleMatrix(1, n + 1);
      t1.setElement(1, 1);

      DoubleMatrix t2 = new DoubleMatrix(1, n + 1);
      t2.setElement(2, 1);

      DoubleMatrix t = new DoubleMatrix(1, n + 1);
      DoubleMatrix t3 = null;
      for (int i = 3; i <= n + 1; i++) {
        t.setSubMatrix(1, 1, 2, n + 1, t2.getSubMatrix(1, 1, 1, n).multiply(2.0));
        t3 = t.subtract(t1).createClone();
        t1 = t2.createClone();
        t2 = t3.createClone();
      }

      p = new DoublePolynomial(t3, this.var);
    }

    return p;
  }

  /**
   * メインメソッド
   * 
   * @param args コマンドライン引数
   */
  public static void main(String[] args) {
    Chebyshev c = new Chebyshev();
    DoublePolynomial p = c.interpolate(500);
    p.print();
    System.out.println(p.evaluate(0));
  }
}