2018年7月2日月曜日

開発環境

Pythonからはじめる数学入門 (Amit Saha (著)、黒川 利明 (翻訳)、オライリージャパン)の7章(初等解析問題を解く)、7.10(プログラミングチャレンジ)、問題7-2(勾配降下法を実装する)を取り組んでみる。

コード(Emacs)

Python 3

#!/usr/bin/env python3
from sympy import Derivative, symbols, sympify, SympifyError
import matplotlib.pyplot as plt


def grad_descent(x0, f1x, x):
    epsilon = 1e-6
    step_size = 1e-4
    x_old = x0
    x_new = x_old - step_size * f1x.subs({x: x_old}).evalf()
    xs = []
    while abs(x_old - x_new) > epsilon:
        xs.append(x_new)
        x_old = x_new
        x_new = x_old - step_size * f1x.subs({x: x_old}).evalf()
    return x_new, xs


def find_min_theta(R, theta):
    R1theta = Derivative(R, theta).doit()
    theta0 = 1e-3
    theta_min = grad_descent(theta0, R1theta, theta)
    return theta_min


def draw(f, var, xs):
    xs0 = []
    i = -1
    while i < 1:
        xs0.append(i)
        i += 0.01
    ys0 = [f.subs({var: x}) for x in xs0]
    plt.plot(xs0, ys0, 'g.')
    ys = [f.subs({var: x}) for x in xs]
    plt.plot(xs, ys, 'ro')
    plt.savefig('sample2.svg')


if __name__ == '__main__':
    f = input('Enter a function in one variable: ')
    var = input('Enter the variable t differentiate with respect to: ')
    var0 = float(input('Enter the initial value of the variable: '))
    try:
        f = sympify(f)
    except SympifyError as err:
        print(f'Invalid function entered: {err}')
    else:
        var = symbols(var)
        d = Derivative(f, var).doit()
        var_min, xs = grad_descent(var0, d, var)
        print(f'{var.name}: {var_min}')
        print(f'Minimum value: {f.subs({var:var_min})}')
        draw(f, var, xs)

入出力結果(Terminal, Jupyter(IPython))

$ ./sample2.py
Enter a function in one variable: 25 * 25 * sin(2 * theta) / 9.8
Enter the variable t differentiate with respect to: theta
Enter the initial value of the variable: 0.001
theta: -0.785360851298204
Minimum value: -63.7755100265060
$

0 コメント:

コメントを投稿