From: gotoken / math.sci.hokudai.ac.jp (GOTO Kentaro)
Subject: [ruby-math:00093] Re: math functions
Date: Fri, 21 Jan 2000 12:38:43 +0900 (JST)

るびきちです。

> 拡張モジュールが組み込みクラスに手をつけるのは結構大胆です。

確かに(^^;)
拡張ライブラリではなくてスクリプトレベルでちょっと手をつけてみた。

> class Numeric
>   %w(atan2 cos sin exp frexp ldexp log log10 sqrt).each{|f|
>     class_eval <<-EOS
>       def #{f}(*arg)
> 	Math::#{f}(self,*arg)
>       end
>     EOS
>   }
> end

確かにこうすると number.sin って呼出しが可能だけど・・・
記法としてはあまりかっこよくないよなぁ。
プログラム内ではあまりその書き方したくないんだよ・・・
やっぱり Math::sin(x) って形で呼びたい。
x の型によって実行される動作が動的に変わるようにしたい。
この方が Ruby らしいような。

> ところで Autodiff#sin や Interval#sin ってどんなモノですか??

sin の自動微分はこんな感じ。
class Autodiff
  def initialize (v,d)
    @v, @d = v, d
  end
  def Autodiff.[] (v,*d)
    new(v,[d].to_m)
  end

  attr :v
  attr :d

  def sin
    Autodiff.new(Math::sin(v), Math::cos(v)*d)
  end
  
  def cos
    Autodiff.new(Math::cos(v), -Math::sin(v)*d)
  end
end

Interval#sin は場合分けがあまりに繁雑で長過ぎのため載せられない(>_<)
区間演算に初等関数をかけたものは、その区間中の最大値と最小値の組を返す。
代わりに log と sqrt を載せておく。

class Interval
  def initialize(d,u)
    @d, @u = d, u
  end
  attr :d
  attr :u
  
  def log
    Interval[Math::log(d), Math::log(u)]
  end
  def sqrt
    Interval[Math::sqrt(d), Math::sqrt(u)]
  end
end

るびきち☆