0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

高校の漸化式と伝達関数

Posted at

はじめに

高校数学の「数列」は単なる整数の並びに見えますが、工学や物理の分野では「時間ごとに区切った信号」を表す強力な道具です。
数列を「離散的な微分方程式」としてまとめると、電気回路・機械振動・構造解析・デジタル信号処理などに応用できます。

さらに、連続系で使う「ラプラス変換」に対応して、離散系では「Z変換」が使われます。
ここではサンプリング周期 T を導入して、数列とZ変換を工学的に結びつけてみます。

微分方程式と漸化式の対応

連続時間(アナログ信号)の場合:

dx(t)/dt = a * x(t)

これは「時間に対して連続的に変化する」微分方程式です。

一方、離散時間(数列)の場合:

a_{n+1} = p * a_n

これは「1ステップごとに更新される」漸化式です。

👉 つまり、連続の「微分方程式」が、離散の「漸化式」に対応します。

サンプリングのイメージ

アナログ信号 x(t) を「時間間隔 T ごと」に測定すると、数列になります:

x[0] = x(0)
x[1] = x(T)
x[2] = x(2T)
x[3] = x(3T)

👉 連続的な波形を「点列」として扱えるようになる。
これはデジタルオシロスコープやCD録音の仕組みそのものです。

ラプラス変換とZ変換

連続信号のラプラス変換:

X(s) = ∫₀^∞ x(t) e^(−st) dt

離散信号のZ変換:

A(z) = Σ₀^∞ a_n z^(−n)

👉 Z変換は「離散的なラプラス変換」とみなせます。
ラプラス変換が微分方程式の解法に使われるように、Z変換は漸化式やディジタル回路の解析に使われます。

サンプリング周期 T を考える

連続系に微分方程式

dx/dt = a * x(t)

があったとします。

解は指数関数:

x(t) = e^(a t)

これをサンプリング周期 T ごとに区切ると:

x[n] = x(nT) = e^(a nT)

👉 これは等比数列で、公比は e^(aT)。
つまり「指数関数の連続解」が「等比数列の離散解」に変換されたのです。

数列で実験

1. 等差数列

漸化式

a_{n+1} = a_n + d

初期条件:

a_0 = 1
d = 0.5   (仮に 0.5 とする)

a_n = a_0 + n d = 1 + 0.5 n

サンプリング周期 T = 0.001 秒なので、時刻 t = nT に対応:

t=0.000 s → a_0 = 1.0
t=0.001 s → a_1 = 1.5
t=0.002 s → a_2 = 2.0
t=0.003 s → a_3 = 2.5
...

→ 等差的に増える。

Z変換

A(z) = a_0 * z / (z - 1) + d * z / (z - 1)^2
     = z/(z - 1) + 0.5 z/(z - 1)^2

伝達関数的解釈

「定数入力 d=0.5」を積分器

H(z) = 1 / (1 - z^-1)

に通した応答。


2. 等比数列

漸化式

a_{n+1} = r * a_n

初期条件:

a_0 = 1
r = 0.9   (減衰例)

a_n = 1 * (0.9)^n

サンプリング周期 T = 0.001 秒なので:

t=0.000 s → a_0 = 1.000
t=0.001 s → a_1 = 0.900
t=0.002 s → a_2 = 0.810
t=0.003 s → a_3 = 0.729
t=0.010 s → a_10 ≈ 0.348

→ 指数関数的に減衰。

Z変換

A(z) = a_0 * z / (z - r)
     = z / (z - 0.9)

伝達関数的解釈

1次フィードバック系:

H(z) = z / (z - r) = z / (z - 0.9)

はい!
漸化式

a_{n+1} = p a_n + q,   a_0 given

3. 漸化式 a_{n+1} = p a_n + q

1. 高校数学の解き方

これは 一次不定差分方程式 です。
解き方の流れは:

(1) 同次解(等比数列の部分)

a_{n+1} = p a_n

の解は

a_n^{(h)} = C p^n

ただし C は定数。

(2) 特殊解(定数解を仮定)

定常解 a = 定数 とすると

a = p a + q
→ a (1 - p) = q
→ a = q / (1 - p)    (p ≠ 1)

(3) 一般解

a_n = C p^n + q/(1 - p)

(4) 初期条件から定数 C を決定

a_0 = C + q/(1 - p)
→ C = a_0 - q/(1 - p)

したがって最終解:

a_n = (a_0 - q/(1 - p)) p^n + q/(1 - p)

2. Z変換による解法

Z変換の基本性質:

Z{a_{n+1}} = z(A(z) - a_0)
Z{a_n} = A(z)
Z{定数 q} = q z / (z - 1)

漸化式

a_{n+1} = p a_n + q

に Z変換を適用すると:

z(A(z) - a_0) = p A(z) + q z / (z - 1)

整理:

(z - p) A(z) - z a_0 = q z / (z - 1)

解:

A(z) = (z a_0)/(z - p) + (q z)/((z - 1)(z - p))

3. 伝達関数的解釈

この漸化式は

a_{n+1} - p a_n = q

と書ける。

差分方程式をシステムと見ると:

  • 入力 = 定数列 q
  • 出力 = a_n
  • システムの伝達関数は
H(z) = z / (z - p)

入力 q に対しての応答は:

A(z) = H(z) * (q z / (z - 1))

となり、上で得た式と一致。


4.フィボナッチ数列

漸化式:

a_{n+2} = a_{n+1} + a_n
a_0 = 0, a_1 = 1

1. 高校数学の解き方

これは 2階線形漸化式

(1) 特性方程式:

λ^2 = λ + 1
→ λ^2 - λ - 1 = 0

(2) 解:

λ = (1 ± √5) / 2
= φ, 1 - φ   (φは黄金比 ≈ 1.618)

(3) 一般解:

a_n = C1 φ^n + C2 (1 - φ)^n

(4) 初期条件:

a_0 = 0 → C1 + C2 = 0 → C2 = -C1
a_1 = 1 → C1 φ + C2 (1 - φ) = 1

解くと:

a_n = (φ^n - (1 - φ)^n) / √5

これが高校でよく出る「閉じた式(ビネの公式)」。


2. Z変換による解法

漸化式:

a_{n+2} - a_{n+1} - a_n = 0

Z変換の性質:

Z{a_{n+1}} = z(A(z) - a_0)
Z{a_{n+2}} = z^2(A(z) - a_0 - a_1/z)

代入すると:

(z^2)(A(z) - a_0 - a_1/z) - z(A(z) - a_0) - A(z) = 0

整理:

(z^2 - z - 1) A(z) = z a_0 + z^2 a_1

初期条件 a_0=0, a_1=1 を代入:

A(z) = z^2 / (z^2 - z - 1)

3. 伝達関数的解釈

差分方程式:

a_{n+2} = a_{n+1} + a_n

は「出力が過去2つの出力の和」という構造。

Z変換での伝達関数は:

H(z) = z^2 / (z^2 - z - 1)

これは「入力を初期値で与えた2次フィードバック系」と解釈できる。



import numpy as np
import matplotlib.pyplot as plt
from scipy import signal

# ==============================
# Parameters
# ==============================
T = 0.001  # Sampling period [s]
N = 20     # Number of samples for time-domain simulation

# ==============================
# 1. Define recurrence sequences
# ==============================

# Arithmetic: a_{n+1} = a_n + d
a0_arith, d = 1, 0.5
a_arith = [a0_arith]
for n in range(1, N):
    a_arith.append(a_arith[-1] + d)

# Geometric: a_{n+1} = r a_n
a0_geom, r = 1, 0.9
a_geom = [a0_geom]
for n in range(1, N):
    a_geom.append(r * a_geom[-1])

# Affine: a_{n+1} = p a_n + q
a0_aff, p, q = 1, 0.8, 0.5
a_aff = [a0_aff]
for n in range(1, N):
    a_aff.append(p * a_aff[-1] + q)

# Fibonacci: a_{n+2} = a_{n+1} + a_n
a_fib = [0, 1]
for n in range(2, N):
    a_fib.append(a_fib[-1] + a_fib[-2])

# Time axis
t = np.arange(N) * T

# ==============================
# 2. Transfer functions (Z-domain)
# ==============================
H_arith = signal.dlti([1, 0], [1, -1], dt=T)            # Arithmetic
H_geom = signal.dlti([1, 0], [1, -r], dt=T)             # Geometric
H_aff  = signal.dlti([1, 0], [1, -p], dt=T)             # Affine (homogeneous part)
H_fib  = signal.dlti([1, 0, 0], [1, -1, -1], dt=T)      # Fibonacci

systems = {
    "Arithmetic (d=0.5)": (H_arith, np.array(a_arith)),
    "Geometric (r=0.9)": (H_geom, np.array(a_geom)),
    "Affine (p=0.8, q=0.5)": (H_aff, np.array(a_aff)),
    "Fibonacci": (H_fib, np.array(a_fib))
}

# ==============================
# 3. Plot time-domain sequences (store in variables)
# ==============================
fig, axs = plt.subplots(2, 2, figsize=(10, 6), sharex=True)
axs = axs.flatten()  # 2x2 をフラットにしてアクセスしやすく

for i, (name, (_, seq)) in enumerate(systems.items()):
    axs[i].stem(t, seq, basefmt=" ")
    axs[i].set_title(f"{name} (time-domain)")
    axs[i].set_xlabel("Time [s]")
    axs[i].set_ylabel("a[n]")
    axs[i].grid(True)

fig.tight_layout()

# ==============================
# 保存先や再利用用の変数
# ==============================
time_domain_fig = fig   # 図全体を格納
time_domain_axes = axs  # 各 subplot の軸を格納

# 例: 表示
# time_domain_fig.show()

# 例: 保存
# time_domain_fig.savefig("time_domain_sequences.png")

1. デジタルをアナログにする

離散信号

a[n],   サンプリング周期 T

これは「時刻 t = nT での値」を持つ点列。

アナログ信号に戻す方法

  1. ディラック列
    アナログ的には次のような信号を表せます:

    x(t) = Σ a[n] δ(t - nT)
    

    → 理想的には「サンプル点の値を持つスパイク列」。

  2. Zero-Order Hold (ZOH, 0次ホールド)
    実際のDAC(デジタル→アナログ変換器)では、各サンプルを 次のサンプルが来るまで保持します。

    x(t) = a[n],   nT ≤ t < (n+1)T
    

    → 「階段状の信号」になります。

  3. 1次補間(Linear Interpolation)
    各サンプルを直線でつないで滑らかにする方法。

    x(t) = a[n] + ( (a[n+1] - a[n]) / T ) * (t - nT)
    

    (nT ≤ t ≤ (n+1)T)


2. Z変換との関係

  • Z変換 A(z)双一次変換(bilinear transform) でアナログラプラス領域にマッピングする方法があります:
s = (2/T) * (1 - z^-1) / (1 + z^-1)

これを使えば、ディジタルの伝達関数 H(z) を アナログ伝達関数 H(s) に変換できます。
(制御工学やDSPの世界でよく使う手法)


アナログ伝達関数


1. 等差数列

漸化式

a_{n+1} = a_n + d

Z変換伝達関数

H(z) = z / (z - 1)

アナログ伝達関数(双一次変換 z = (1 + sT/2)/(1 - sT/2))

H(s) ≈ 1/s

T の意味
サンプリング周期 T が小さいほど、デジタル積分器 H(z) は連続積分器 H(s)=1/s に近似される。


2. 等比数列

漸化式

a_{n+1} = r a_n

Z変換伝達関数

H(z) = z / (z - r)

アナログ伝達関数

r を連続系の減衰係数 α に対応させて

r = e^(−αT)

と置くと:

H(s) ≈ 1 / (s + α)

T の意味
サンプリング周期 T によって r の値が決まり、連続系の減衰速度 α と対応づけられる。


3. 一次不定差分方程式

漸化式

a_{n+1} = p a_n + q

Z変換伝達関数

H(z) = z / (z - p)

アナログ伝達関数

p = e^(−αT)

とおくと:

H(s) ≈ 1 / (s + α)

T の意味
サンプリング周期 T が小さいほど、離散系の一次遅れ応答は連続時間の一次遅れシステムに近似される。


4. フィボナッチ数列

漸化式

a_{n+2} = a_{n+1} + a_n

Z変換伝達関数

H(z) = z^2 / (z^2 - z - 1)

アナログ伝達関数

双一次変換を適用して s に変換:

H(s) = ( (1 + sT/2)^2 )
       / ( (1 + sT/2)^2 - (1 + sT/2)(1 - sT/2) - (1 - sT/2)^2 )

T の意味
T が小さいと、このシステムは連続時間の「二次振動系」を近似する。
フィボナッチ数列は、離散時間での二次フィードバックシステムの代表例。


まとめ表(サンプリング周期 T を含む)

数列 漸化式 H(z) アナログ対応 H(s) サンプリング周期 T の役割
等差 a_{n+1} = a_n + d z/(z-1) 1/s T が小さいほど積分器に近似
等比 a_{n+1} = r a_n z/(z-r) 1/(s+α), r=e^(−αT) T によって r と α が対応
一次不定 a_{n+1} = p a_n + q z/(z-p) 1/(s+α), p=e^(−αT) T に応じて一次遅れ系を近似
フィボナッチ a_{n+2} = a_{n+1} + a_n z²/(z² - z - 1) H(s)=((1+sT/2)²)/(...式...) T に依存して二次振動系を近似

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?