2018年6月2日土曜日

開発環境

Pythonからはじめる数学入門 (Amit Saha (著)、黒川 利明 (翻訳)、オライリージャパン)の4章(SymPyで代数と式を計算する)、4.6(プログラミングチャレンジ)、問題4-4(1変数の不等式を解く)を取り組んでみる。

コード(Emacs)

Python 3

#!/usr/bin/env python3

from sympy import pprint, symbols, sympify, SympifyError, Poly, solve_poly_inequality, solve_rational_inequalities, solve_univariate_inequality


def isolve(ineq_obj, v):
    lhs = ineq_obj.lhs
    if lhs.is_polynomial():
        p = Poly(lhs, v)
        rel = ineq_obj.rel_op
        return solve_poly_inequality(p, rel)
    if lhs.is_rational_function():
        numer, denom = lhs.as_numer_denom()
        p1 = Poly(numer)
        p2 = Poly(denom)
        rel = ineq_obj.rel_op
        return solve_rational_inequalities([[((p1, p2), rel)]])
    return solve_univariate_inequality(ineq_obj, v, relational=False)


if __name__ == '__main__':
    v = input('変数: ')
    v = symbols(v)
    while True:
        ineq_obj = input('不等式: ')
        if ineq_obj == 'q':
            break
        try:
            ineq_obj = sympify(ineq_obj)
        except SympifyError as err:
            print(type(err), err)
        else:
            pprint(isolve(ineq_obj, v))

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

$ ./sample4.py
変数: x
不等式: -x ** 2 + 4 < 0
[(-∞, -2), (2, ∞)]
不等式: -x ** 2 + 4 > 0
[(-2, 2)]
不等式: (x - 1) / (x + 2) > 0
(-∞, -2) ∪ (1, ∞)
不等式: (x - 1) / (x + 2) > 0
(-∞, -2) ∪ (1, ∞)
不等式: sin(x) - 0.6 > 0
(0.643501108793284, -0.643501108793284 + π)
不等式: sin(x) - 0.6 < 0
[0, 0.643501108793284) ∪ (-0.643501108793284 + π, 2⋅π]
不等式: q
$

0 コメント:

コメントを投稿