ニュートン算をPythonで解いてみた。

 ネットで見つけたニュートン算の問題Pythonで解いてみました。(^_^;

もし12頭の牛が3\frac{1}{3}(3と三分の1)エーカーの牧草を4週間で食べ尽くし、21頭の牛が10エーカーの牧草を9週間で食べ尽くすとすると、何頭の牛が24エーカーの牧草を18週間で食べ尽くすか。

 この問題を一般化すると、次のようになります。

a_1 頭の牛は b_1 個の牧場の牧草を c_1 日で食べつくす。
a_2 頭の牛は b_2 個の牧場の牧草を c_2 日で食べつくす。
a_3 頭の牛は b_3 個の牧場の牧草を c_3 日で食べつくす。
このとき、a_1,a_2,a_3,b_1,b_2,b_3,c_1,c_2,c_3 の間の関係はどうなるか。ただし、各牧場の牧草の量は等しく、また、それぞれの牧場の牧草の 1 日の生長量は一定で、それぞれの牛が 1 日に食べる量も一定であるものとする。

 3番目の参考URLから次式を得ます。ただし、変数は上記に従いました。また、分数が含まれますが、変数がダブらないので公式としてはこの方が憶えやすくていいかなと思います。分数を含まない形が欲しいときは必要に応じて変形すればいいでしょう。(^_^;

\left|\begin{array}{cc}\frac{a_1}{b_1}&\frac{1}{c_1}&1\\ \frac{a_2}{b_2}&\frac{1}{c_2}&1\\ \frac{a_3}{b_3}&\frac{1}{c_3}&1\end{array}\right|=\left|\begin{array}{cc}\frac{a_2}{b_2}-\frac{a_1}{b_1}&\frac{1}{c_2}-\frac{1}{c_1}\\ \frac{a_3}{b_3}-\frac{a_1}{b_1}&\frac{1}{c_3}-\frac{1}{c_1}\end{array}\right|=0

 このニュートン算の公式を用いて解くと、求める牛をx[頭]として、次の方程式を得ます。
\left|\begin{array}{cc}\frac{12\times3}{10}&\frac{1}{4}&1\\ \frac{21}{10}&\frac{1}{9}&1\\ \frac{x}{24}&\frac{1}{18}&1\end{array}\right|=0

 この行列式の方程式をPythonのNumpyとScipyを使って解くと以下のような結果を得ました。(^_^;

● NewtonProb1.py

# coding: UTF-8
# NewtonProb1.py

import numpy as np
from scipy.optimize import newton

def f(x):
    a1,b1,c1 = 12.0, 3.0+1.0/3.0, 4.0
    a2,b2,c2 = 21.0, 10.0,        9.0
    a3,b3,c3 =  x,   24.0,       18.0
    a = np.array([[a1/b1,1/c1,1],
                  [a2/b2,1/c2,1],
                  [a3/b3,1/c3,1]])
    return np.linalg.det(a)

def main():
    print(newton(f,1.0))

if __name__ == '__main__':
    main()

●実行結果

36.0

 ちなみに、数的推理などに出てくるニュートン算の場合、b_1=b_2=b_3=1とみなせる場合が多いので、ニュートン算の公式は次式のように簡単になります。
\left|\begin{array}{cc}a_2-a_1&\frac{1}{c_2}-\frac{1}{c_1}\\a_3-a_1&\frac{1}{c_3}-\frac{1}{c_1}\end{array}\right|=0\Rightarrow (a_2-a_1):(a_3-a_1)=(\frac{1}{c_2}-\frac{1}{c_1}):(\frac{1}{c_3}-\frac{1}{c_1})

※参考URL
「ニュートン算が解けない」|メタメタの日
ニュートン算 出典
『100 Great Problems of Elementary Mathematics』第3話
numpy.linalg.det − NumPy v1.8 Manual
scipy.optimize.newton − SciPy v0.16.1 Reference Guide
非線形方程式を解く − 読書ノート v1.4.0dev - プレハブ小屋
つまみぐいプログラミング Python で方程式を数値的に解く

100 Great Problems of Elementary Mathematics (Dover Books on Mathematics)

100 Great Problems of Elementary Mathematics (Dover Books on Mathematics)