로지스틱 방정식의 수치 계산 with Python

오늘은



가장 간단한 로지스틱 방정식을 수치 계산해 가지 않는다.

개요


\frac{\mathrm{d}y}{\mathrm{d}x} = y(1-y)

이 미분 방정식은
y=\sigma(x)=\frac{1}{1+\exp(-x)}

라는 형태의 엄밀해를 가집니다. 심층 학습으로 나오는 시그모이드 함수입니다.
실제로 시그모이드 함수의 미분을 계산하면 로지스틱 방정식의 해가되는 것을 알 수 있습니다.
수치 계산이면 Euler법으로도 풀 수 있으므로 실제로 확인해 봅시다.

구현 예


import numpy as np
from matplotlib import pyplot as plt


def get_integral_curve(f, init_xy, x_end, delta):
    """
    solve ode 'dy/dx=f(x,y)' with Euler method
    """
    (x, y) = init_xy
    xs, ys = [x], [y]
    for i in np.arange(init_xy[0], x_end, delta):
        y += delta*f(x, y)
        x += delta
        xs.append(x)
        ys.append(y)
    return xs, ys


def main():
    """
    solve logistic equation dy/dx=y(1-y)
    """
    # set parameters
    init_xy = (0, 0.5)
    x_end = 5
    delta = 0.1
    # calc integral curve of logistic equation
    f = lambda x, y: y*(1-y)
    xs, ys = get_integral_curve(f, init_xy, x_end, delta)
    # calc explicit solution
    sigmoid_xs = np.arange(-5, 5, delta)
    sigmoid_ys = 1/(1+np.exp(-sigmoid_xs))
    # plot
    fig, ax = plt.subplots()
    ax.plot(xs, ys, "x", color='blue', label="integral curve")
    ax.plot(sigmoid_xs, sigmoid_ys, "-", color='red', label='explicit curve')
    ax.legend()
    ax.set_xlim([-5, 5])
    ax.set_ylim([-0.5, 1.5])
    plt.show()

if __name__ == '__main__':
    main()

동작 예



좋은 웹페이지 즐겨찾기