シグモイド曲線の定義域を有限にしたい（滑らかなステップ関数）

# 目的
シグモイド曲線S[^3]の定義域は$(-\infty, +\infty)$，値域は$(0, 1)$であり，変数に与えられた任意の実数値が0~1に変換される関数と言える．便利なのだが，定義域の$∞$が不都合な場合がある．
僕の場合は，ステップ関数を滑らかにしたかった．突然跳ね上がるのではなく徐々に大きくなってほしい．そこでシグモイドで実現しようとしたが，定義域のせいでシグモイドと$y=0, 1$が共通点を持つことがなく理想とちょっと違う．．．

[^3]:シグモイド関数：$S = 1/(1+e^{-x})$

探し方が悪いのか，ググっても出てこないので作ることにした．
この関数に名前がついてたり，Qiitaでも他でも既に記事があったら教えてもらえると喜びます😚

# 結論
先に得られた結論を載せる．説明は後回し．
グラフはこちら↓

https://www.geogebra.org/graphing/unwjtfus

今更ながらGeoGebraすごい．

## 単位擬似シグモイド
### 定義
$y=F_1(x)$が求めるグラフ．定義域は[0, 1]とする．値域は[0, 1]である．
```math
F_1(x)    := \frac{f}{f+g} \\
```
ただし，
```math
\begin{align}
f(x) &:= e^{-1/x}\\
g(x) &:= e^{-1/(1-x)} (= f(1-x))
\end{align}
```
<img width=50%, alt="a.png", src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3128139/cffb6a23-6db2-8c6c-f3af-6eb5d15c4283.png>


### 性質
- $y=0, y=1$に滑らかに接続する[^1]
- 変曲点が中央$(0.5, 0.5)$である[^2]
- 中央で点対称である
とか．

[^1]:
    端点の傾き0要件：
    $dF_1/dx \longrightarrow 0 \quad(x \longrightarrow +0)$
    $dF_1/dx \longrightarrow 0 \quad(x \longrightarrow 1-0)$
    
[^2]:
    x=1/2のとき変曲点：
    $d^2F_1(1/2)/dx^2 = 0$
    
    x=1/2のときy=1/2：
    $F_1(1/2) = 1/2$

## 拡張擬似シグモイド
### 定義
定義域と値域を自由に拡張できる擬似シグモイド$F$．単位擬似シグモイド$F_1$をいじる．
定義域は$[x_0, x_0+w]$，値域は$[y_0, y_0+h]$にそれぞれ変わる．
```math
F(x) := h F_1 \left(\frac{x-x_0}{w}\right)+y_0
```
ただし，
　$x_0$：定義域の$x$座標の最小値，基点の$x$座標
　$y_0$：定義域の$y$座標の最小値，基点の$y$座標
　$h$：グラフの高さ，値域の大きさ
　$w$：グラフの幅，定義域の大きさ

![b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3128139/b3b22dcb-a17d-6f98-7c48-d061fe4c2d95.png)

基点と擬似シグモイドの高さおよび幅で定義したが，両端点の$x, y$座標や，中央の点と擬似シグモイドの高さおよび幅等による定義ももちろんできる．

### 性質
単位擬似シグモイドが満たす性質をすべて有する．

## 逆擬似シグモイド
どっちが逆とか知らないけど今まで作ってきたものと逆向きの擬似シグモイド$G$．
```math
\begin{align}
G_1 &:= \frac{g}{f+g}\\
G &:= h G_1 \left(\frac{x-x_0}{w}\right)+y_0
\end{align}
```

![c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3128139/1535da93-4566-4c02-e1fa-d2fb01ef57aa.png)

### 性質
- 単意義擬似シグモイド，拡張擬似シグモイドの性質をすべて持つ
- 定義より明らかに関数同士の和が恒等的で$x$に依存しない
　$F_1+G_1 \equiv 1$
　$F+G \equiv 2y_0+h$
- よって別の定義ができる．$G := -F+2y_0+h$
とか．

## 弱点
いいことばかりではない．．．
- 微分が本家シグモイドよりかなり面倒
    - 後述の「方法」を参照
    - $n$階微分はやばそう（）
    - 本家シグモイド$S$の微分は自分自身で表せる
        - $dS/dx = S(1-S)$
- 定義域の端点で微分不可能
    - ただし，$y=y_0, y=y_0+h$と接続すればすべての定義域で微分可能
- 有名じゃない？レポートとか論文に使うならある程度詳細が必要か？
とか．

## 使用例
- 滑らかなステップ関数
```math
y = 
\begin{cases}
    0 &(x \le 0)\\
    F(x) &(0 < x < 1)\\
    1 &(1 \le x)
\end{cases}
```
![f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3128139/0fd81631-75ca-888c-1b6d-2b8a7238b8f7.png)

- 滑らかに遷移する割合
2つのパラメータを0%~100%にだんだん切り替える
![h.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3128139/4659cdd3-99f1-1461-7bd1-f373cea10b58.png)


# 方法？(証明とか)
ここから先は読まなくてOKです．
上記関数たちの要件というか性質を示します．

## 事前準備
$f$について調べれば容易に$g$についてわかる．$f,g$についてわかれば$F_1$についてわかる．．．いい関係ですね～
とはいえ複雑なのでどこかミスしてそう．
### 微分
```math
\begin{alignat}{2}
    f' &= \frac{df}{dx} &&= \frac{f}{x^2}\\
    g' &= \frac{dg}{dx} = \frac{df(1-x)}{dx} &&= -\frac{g}{(1-x)^2}\\
\\
    f'' &= \frac{df'}{dx} = \frac{d}{dx}\frac{f}{x^2} &&= \frac{(1-2x)f}{x^4}\\
    g'' &= \frac{dg'}{dx} = \frac{df'(1-x)}{dx} &&= -\frac{(1-2x)g}{(1-x)^4}\\
\\
    F_1' &= \frac{dF_1}{dx} = \frac{d}{dx}\frac{f}{f+g} &&= \frac{f'g-fg'}{(f+g)^2}\\
\end{alignat}
\\
   　F_1'' =\frac{(f''g-fg'')(f+g)-2(f'g-fg')(f'+g')}{(f+g)^3}  
```
### 極限
左側極限$(x \longrightarrow +0)$
```math
\begin{alignat}{2}
    f &= e^{-1/x} &\longrightarrow &0\\
    g &= e^{-1/(1-x)} &\longrightarrow &e^{-1}\\
\\
    f' &= \frac{e^{-1/x}}{x^2} &\longrightarrow &0\\
    g' &= -\frac{g}{(1-x)^2} &\longrightarrow &-g
\end{alignat}
```
### 極限
右側極限$(x \longrightarrow 1-0)$
```math
\begin{alignat}{2}
    f &= e^{-1/x} &\longrightarrow &e^{-1}\\
    g &= f(1-x) &\longrightarrow &0\\
\\
    f' &= \frac{f}{x^2} &\longrightarrow &f\\
    g' &= -\frac{e^{-1/(1-x)}}{(1-x)^2} &\longrightarrow &0
\end{alignat}
```

## 要件
### ・端点の傾きが0であってほしい
左側極限$(x\longrightarrow+0)$
```math
F_1' = \frac{f'g-fg'}{(f+g)^2} \longrightarrow \frac{0 \cdot e^{-1}-0\cdot(-g)}{(0+e^{-1})^2} = 0
```
右側極限$(x\longrightarrow1-0)$
```math
F_1' = \frac{f'g-fg'}{(f+g)^2} \longrightarrow \frac{f\cdot 0-0\cdot e^{-1}}{(0+e^{-1})^2} = 0
```
よってこの要件は満たされる．

### ・(1/2, 1/2)が変曲点であってほしい
　$f(1/2) = g(1/2) = e^{-2} =: a$
　$f'(1/2) = -g'(1/2) = 4f(1/2) = 4a$
　$f''(1/2) = g''(1/2) = 0$
```math
F_1''(1/2) = \frac{0\cdot 2a-2(4a^2+4a^2)(4a-4a)}{(2a)^3} = 0
```

また，
```math
F_1(1/2) = \frac{a}{2a} = \frac{1}{2}
```
よってこの要件は満たされる．

## 拡張
平行移動の公式？みたいなの忘れたので定義域と値域から考えてみる．
まず幅を広げる（狭める）．
単位擬似シグモイド$F_1(x_1)$について，
定義域$(0<x_1<1)$の幅を$w$に広げる．$(0 < wx_1 < w)$
基点を$x_0$に移動する．$(x_0 < wx_1+x_0 < x_0+w)$
よって，拡張シグモイドF(x)の定義域$(x_0 < x < x_0+w)$より，
$x = wx_1+x_0$
元の座標系では，
$x_1=(x-x_0)/w$
したがって，$F(x)=F_1(x_1)=F_1\left( (x-x_0)/w\right)$

同様にして高さを広げる．
値域の$(0<y_1<1)$高さを$h$，基点を$y_0$に移動する．
$(y_0 < hy_1+y_0 < y_0+h)$
よって，$y=hy_1+y_0$
すなわち，$F(x)=hF_1(x_1)+y_0=hF_1\left( (x-x_0)/w\right)+y_0$