用Python求解牛顿的草地与母牛问题
文章目录
- 问题概览
- 符号推导
问题概览
牛顿在1707 年提出了如下一个有趣的问题:
- a 头母牛将b 块地上的牧草在c 天内吃完了;
- a′头母牛将b′块地上的牧草在c′天内吃完了;
- a″头母牛将b″块地上的牧草在c″天内吃完了;
求出从a 到c″ 9 个数量之间的关系。
假设所有草地提供的牧草数量相同,每块草地每日长草量保持不变,而且每头母牛每天吃草量也相同。
这个题乍看上去实在不像是一道题,而且这九个数虽然不是毛关系都没有,但彼此之间的关系其实是非常简单的,无非假定每块地草量为 x x x;每日长草 y y y;每头牛每天吃 z z z,可以得出
a c z = b x + c b y a ′ c ′ z = b ′ x + c ′ b ′ y a ′ ′ c ′ ′ z = b ′ ′ x + c ′ ′ b ′ ′ y acz=bx+cby\\ a'c'z=b'x+c'b'y\\ a''c''z=b''x+c''b''y\\ acz=bx+cbya′c′z=b′x+c′b′ya′′c′′z=b′′x+c′′b′′y
符号推导
接下来要将这三个等式中的
x
,
y
,
z
x,y,z
x,y,z约掉,得到的就是
a
,
b
,
c
,
a
′
,
b
′
,
c
′
,
a
′
′
,
b
′
′
,
c
′
′
a, b, c, a' ,b' ,c' ,a'' ,b'' ,c''
a,b,c,a′,b′,c′,a′′,b′′,c′′之间的关系。为了写diamagnetic方便,下面将
a
,
a
′
,
a
′
′
a, a', a''
a,a′,a′′改写为
a
1
,
a
2
,
a
3
a_1, a_2, a_3
a1,a2,a3,b,c
也是。
很显然,可以写成矩阵的形式,而将线性方程组转为矩阵可是sympy
的看家本领
import sympy
a = sympy.symbols("a1,a2,a3")
b = sympy.symbols("b1,b2,b3")
c = sympy.symbols("c1,c2,c3")
x,y,z = sympy.symbols("x,y,z")
eqs = []
for i in range(3):
eqs.append(b[i]*x+c[i]*b[i]*y-a[i]*c[i]*z)
mat = sympy.linear_eq_to_matrix(eqs, x,y,z)
print(sympy.latex(mat[0]))
[ b 1 b 1 c 1 − a 1 c 1 b 2 b 2 c 2 − a 2 c 2 b 3 b 3 c 3 − a 3 c 3 ] \left[\begin{matrix}b_{1} & b_{1} c_{1} & - a_{1} c_{1}\\b_{2} & b_{2} c_{2} & - a_{2} c_{2}\\b_{3} & b_{3} c_{3} & - a_{3} c_{3}\end{matrix}\right] b1b2b3b1c1b2c2b3c3−a1c1−a2c2−a3c3
由于这个式子乘以 [ x , y , z ] [x,y,z] [x,y,z]等于0,说明这个矩阵不满秩,即行列式为0,换言之,这九个数有如下关系
∣ b 1 b 1 c 1 − a 1 c 1 b 2 b 2 c 2 − a 2 c 2 b 3 b 3 c 3 − a 3 c 3 ∣ \left|\begin{matrix}b_{1} & b_{1} c_{1} & - a_{1} c_{1}\\b_{2} & b_{2} c_{2} & - a_{2} c_{2}\\b_{3} & b_{3} c_{3} & - a_{3} c_{3}\end{matrix}\right| b1b2b3b1c1b2c2b3c3−a1c1−a2c2−a3c3
这个关系并不优雅,主要是其中的负号有点破坏美感。想解决这个问题很容易,只需假定z
是个负数就行了,这样的话每头牛每天吃-z
草,得到的结果如下
∣ b 1 b 1 c 1 a 1 c 1 b 2 b 2 c 2 a 2 c 2 b 3 b 3 c 3 a 3 c 3 ∣ \left|\begin{matrix}b_{1} & b_{1} c_{1} & a_{1} c_{1}\\b_{2} & b_{2} c_{2} & a_{2} c_{2}\\b_{3} & b_{3} c_{3} & a_{3} c_{3}\end{matrix}\right| b1b2b3b1c1b2c2b3c3a1c1a2c2a3c3