暇人の技術備忘録

ハサミの技術備忘録

趣味でやっている電子工作の備忘録です。

3次関数を用いた目標値の生成

はじめに

ここでは図1のような3次関数を用いた目標値の生成方法を紹介します。

f:id:sbasami:20191101173901j:plain
図1.3次関数を用いて生成した目標値

3次関数の導出

 以下の3つのパラメータを決定した時にS字を描いて目標値へ変化する3次関数を求めてみます。

  • 初期値:r_0
  • 目標値:r
  • 目標値に到達するまでの時間:T

まず3次関数を一般式で書くと以下のようになります。


f(t)=at^3+bt^2+ct+d

係数が4つあるので条件式も4つあれば3次関数を一意に決定することが出来ます。まず、初期値からf(0)=r_0ということが分かります。同様に目標値からもf(T)=rが成り立ちます。

また、図1を見るとt=0t=Tで平らになっているので、これはつまり微分した値が0ということを表しています。言い換えると極小値と極大値というわけです。極大・極小をとるところでは導関数は0になるのでf'(0)=0f'(T)=0の2つの式も成り立ちます。

これで条件式が4つになったので係数を求めることができます。導関数、つまりはf(x)微分したf'(x)は以下のようになります。


f'(t)=3at^2+2bt+c

まず、f(0)=r_0という条件から係数dが得られます。


\begin{align}
0+0+0+d&=r_0\\
d&=r_0
\end{align}

同様にf'(0)=0という条件から係数cが得られます。


\begin{align}
0+0+c&=0\\
c&=0
\end{align}

また、f'(T)=0という条件と係数cから係数bを係数aを使って表現できます。


\begin{align}
3aT^2+2bT+0&=0\\
b&=-\frac{3}{2}aT
\end{align}

求めた係数bcdf(T)=rという条件から係数aが得られます。


\begin{align}
aT^3-\frac{3aT^3}{2}+0+r_0&=r\\
a&=-\frac{2}{T^3}(r-r_0)
\end{align}

最後に求めた係数aを係数bの式に代入することですべての係数をr_0rTで表現することができます。


\begin{align}
b&=-\frac{3}{2}aT\\
&=-\frac{3}{2}(-\frac{2}{T^3}(r-r_0))T\\
&=\frac{3}{T^2}(r-r_0)
\end{align}

なお、3次関数の導出方法に関しては以下のサイトを参考にさせていただきました。

math.nakaken88.com

marupeke296.com

使用例

実際にパラメータから3次関数を求めて描画したグラフを図2~4に示します。

  • r_0=0,r=1,T=1の場合
f(t)=-3t^3+2t^2

f:id:sbasami:20191101173901j:plain
図2.3次関数のグラフその1

  • r_0=10,r=20,T=10の場合
f(t)=-0.02t^3+0.3t^2+10

f:id:sbasami:20191101174353j:plain
図3.3次関数のグラフその2

  • r_0=5,r=-5,T=5の場合
f(t)=0.16t^3-1.2t^2+5

f:id:sbasami:20191101174433j:plain
図4.3次関数のグラフその3

おわりに

S字を作る方法はこれ以外にもたくさんあります。「補間関数」とか「軌道生成」辺りで検索すると色々出て来ます。

今までは目標値の与え方といえばステップ入力とかランプ入程度しか扱ったことなかったけど、いつかこういうのも必要になる日が来るかもしれないということで自分用のメモとしてまとめました。