読売Life9月号の問題(天秤パズル)をPythonで解いてみる

たまたま目についたので.

まず,問題について.

IMG_20170830_173907

簡単な連立方程式を解く問題.

数式を解くと云えば,まず思い付くのがSympy.

from sympy import init_printing, Symbol, Eq
from sympy.solvers import solve
sympy.init_printing()


a, b, c, d, e = symbols('a b c d e')

f1 = Eq(a + b - c - d - e, 0)
f2 = Eq(a + d - 2*e, 0)
f3 = Eq(a + c - b - d, 0)
f4 = Eq(2*c + d - b - 2*e, 0)

solve([f1, f2, f3, f4], [a, b, c, d, e])
\left \{ a : \frac{5 e}{4}, \quad b : \frac{9 e}{4}, \quad c : \frac{7 e}{4}, \quad d : \frac{3 e}{4}\right \}

e=4とすればそれぞれ自然数となり,{a: 5, b: 9, c: 7, d: 3, e: 4}と求まる.
記号のまま解けるし,適当な仮定や条件を置く必要もないし,さすがSympy.

或いは,線形代数の問題として愚直に解くなら,
右辺にE,左辺に[A, D]の連立方程式を立てれば正則行列を解く事ができる.

import numpy as np

a = np.array(
    [
        [1, 1, -1, -1],
        [1, 0, 0, 1],
        [1, -1, 1, -1],
        [0, -1, 2, 1]
    ]
)

b = np.array([1, 2, 0, 2])

np.linalg.solve(a, b)

array([ 1.25, 2.25, 1.75, 0.75])

従って,e=4とすれば,それぞれ自然数で同様の結果が求まる事が分かる.
 
 
 
追記:
M元N連立方程式とみて,Sympyの線形システムソルバ「solve_linear_system」を使う場合

from sympy.abc import a, b, c, d, e

system = Matrix(
    [
        [1, 1, -1, -1, -1, 0],
        [1, 0, 0, 1, -2, 0],
        [1, -1, 1, -1, 0, 0],
        [0, -1, 2, 1, -2, 0]
    ]
)

solve_linear_system(system, a, b, c, d, e)
\left \{ a : \frac{5 e}{4}, \quad b : \frac{9 e}{4}, \quad c : \frac{7 e}{4}, \quad d : \frac{3 e}{4}\right \}
広告
カテゴリー: 未分類 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中