SinVerifier.java

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

import org.mklab.cga.interval.matrix.IntervalNumericalMatrix;
import org.mklab.cga.interval.scalar.IntervalNumericalScalar;
import org.mklab.nfc.matrix.NumericalMatrix;
import org.mklab.nfc.scalar.NumericalScalar;
import org.mklab.nfc.util.RoundMode;
import org.mklab.nfc.util.RoundModeManager;


/**
 * 未完成。
 * 
 * @author hiroki
 * @version $Revision: 1.9 $.2004/12/21
 * @param <IS> 区間スカラーの型
 * @param <IM> 区間行列の型
 * @param <S> 成分の型
 * @param <M> 行列の型
 */
public class SinVerifier<IS extends IntervalNumericalScalar<IS,IM,S,M>, IM extends IntervalNumericalMatrix<IS,IM,S,M>, S extends NumericalScalar<S,M>, M extends NumericalMatrix<S,M>> {

  /**
   * コンストラクタ
   * 
   */
  public SinVerifier() {
    //
  }

  /**
   * @param t 時間
   * @return ?
   */
  public IS solve(IS t) {
    RoundModeManager manager = RoundModeManager.getManager();
    RoundMode oldRoundMode = manager.getRoundMode();

    //S unit = t.getSupremum().createUnit();

    IS[][] i_ck = t.createArray(5,7);
    int m = 0;
    // Interval i_t;
    IS i_s = t;
    IS i_a = t.create(1).multiply(Math.PI).divide(4);//2で割る

    if ((i_s.getSupremum()).isGreaterThanOrEquals(Math.PI / 4)) {
      System.out.println("2.0以上"); //$NON-NLS-1$
      while ((i_s.getSupremum()).isGreaterThan(Math.PI / 4)) {
        System.out.println("mokerin"); //$NON-NLS-1$
        m++;
        i_s = i_s.divide(i_a);
      }
    } else if ((i_s.getSupremum()).isLessThanOrEquals(1)) {
      System.out.println("1.0以下"); //$NON-NLS-1$
      while ((i_s.getSupremum()).isLessThanOrEquals(1)) {
        m++;
        i_s = i_s.multiply(i_a);
      }
    }

    i_s.printInterval("i_s"); //$NON-NLS-1$
    System.out.println("m = " + m); //$NON-NLS-1$

    System.out.println(Math.PI / 4);
    for (int j = 0; j < 5; j++) {
      for (int k = 0; k < 7; k++) {
        i_ck[j][k] = t.create(2).power(-j).multiply(t.create(1).add(t.create(k).divide(t.create(8))));
      }
    }

    int j_index = 0;
    int k_index = 0;

    for (int j = 0; j < 5; j++) {
      for (int k = 0; k < 7; k++) {
        if ((i_s.getMiddle().subtract(i_ck[j][k].getMiddle())).abs().isLessThanOrEquals(1 / 32.0)) {
          System.out.println("OK"); //$NON-NLS-1$
          j_index = j;
          k_index = k;
        }
      }
    }

    System.out.println("j =" + j_index); //$NON-NLS-1$
    System.out.println("k =" + k_index); //$NON-NLS-1$

    IS i_r = t.subtract(i_ck[j_index][k_index]);

    IS i_p = i_r.subtract(i_r.multiply(i_r).multiply(i_r).multiply(0.166666666656924)
        .add(i_r.multiply(i_r).multiply(i_r).multiply(i_r).multiply(i_r).multiply(0.04166477827)));
    IS i_q = t.create(1).subtract(i_r.multiply(i_r).multiply(0.49999999942942)).add(i_r.multiply(i_r).multiply(i_r).multiply(i_r).add(0.04166477827));

    manager.setRoundMode(RoundMode.ROUND_DOWN);

    S cos_ck_l = ((i_ck[j_index][k_index].getMiddle())).cos();
    S sin_ck_l = ((i_ck[j_index][k_index].getMiddle())).sin();

    manager.setRoundMode(RoundMode.ROUND_UP);

    S cos_ck_u = ((i_ck[j_index][k_index].getMiddle())).cos();
    S sin_ck_u = ((i_ck[j_index][k_index].getMiddle())).sin();

    System.out.println("cos(ckj) = " + (cos_ck_l.subtract(cos_ck_u))); //$NON-NLS-1$
    System.out.println("sin(ckj) = " + (sin_ck_l.subtract(sin_ck_u))); //$NON-NLS-1$
    i_p.printInterval("i_p"); //$NON-NLS-1$
    i_q.printInterval("i_q"); //$NON-NLS-1$

    manager.setRoundMode(oldRoundMode);
    return null;
  }

  /**
   * メインメソッド
   * 
   * @param args コマンドライン引数
   */
  public static void main(String[] args) {
    // SinVerifier sv = new SinVerifier();
    // Interval ans = sv.solve(new RealInterval(0.8));
    System.out.println("sin(t) = " + Math.sin(-1)); //$NON-NLS-1$
  }
}