再・区分的関数のプロット

区分的関数のプロット」に問題があることが分かったので修正

SgnとAbs

実際にsgnやabsを使って、f(x)=0 (x<0) , x^2 (0\leq x<1) , 1 (1\leq x)という関数をプロットするとこんな風になってしまう

sgn

abs

フェルミ分布を使う

そこで、思いついた。固体物理でよく使うフェルミ分布の絶対零度極限をぱくってみようと。

うまくいった!

…ん?端が切れてる…!?


これはどうやらexpが巨大になりすぎてオーバーフローを起こしたようです。

対策としては、expの引数に上限値を設定すればなんとかなる。
つまりexp(min(-b*x,500))のような感じ。


ちなみにGnuplotにはminもない。これは

  • min(x,y)=(x+y-abs(y-x))/2

として定義すればよい。

これをやると確かにうまくいく。ただ、苦し紛れな感じがするw

誤差関数を使う

ステップ関数とはデルタ関数積分だった。デルタ関数はガウシアンの幅0極限としても定義できた。ならばステップ関数はガウシアンの積分関数である誤差関数の極限として定義できるのではないだろうか?

というわけで

  • theta(x)=(1+erf(b*x))/2

としてみると・・・?

ちゃんと端は切れてませんね!万歳!

ちなみにbはなるべく大きい数を入れてください。ただし大きすぎるとオーバーフローする恐れがあるので注意!