ごとけんです

In message "[ruby-math:00094] Re: math functions"
    on 00/01/21, rubikitch <takashi / oishi.info.waseda.ac.jp> writes:

>やっぱり Math::sin(x) って形で呼びたい。
>x の型によって実行される動作が動的に変わるようにしたい。
>この方が Ruby らしいような。

あ、やっと分かった、提案のポイントは Math::sin(x) が引数のク
ラスに応じて挙動を変えたいということですね。

そしたら、Math が実装をハッシュとして持っとくのはどうですか??

  module Math
    MathFunctionBind = {}

    %w(atan2 cos sin exp frexp ldexp log log10 sqrt).each{|f|
      module_eval <<-EOS
	alias _#{f} #{f}
	def #{f}(*arg)
	  mid = MathFunctionBind[[arg[0].type, :#{f}]]
	  if mid
	    recv = arg.shift
	    recv.__send__(mid, *arg)
	  else
	    _#{f}(*arg)
	  end
	end
	module_function :#{f}, :_#{f}
      EOS
    }
  end

んで、自分が定義するクラスではこんな感じ:

  class Interval
    def log
      ....
    end

    Math::MathFunctionBind[[self, :log]] = :log
  end

  i = Interval.new(1,2)
  Math::log(i)  #=> i.log


>sin の自動微分はこんな感じ。

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

すみません、まだわからないですが、 v と d はどんなクラスです
か。v は関数をあらわす Procで d はヤコビ行列かしらん??

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

これはわかりました。どうも。

-- gotoken