> 文章列表 > 用Python求解牛顿的草地与母牛问题

用Python求解牛顿的草地与母牛问题

用Python求解牛顿的草地与母牛问题

文章目录

    • 问题概览
    • 符号推导

问题概览

牛顿在1707 年提出了如下一个有趣的问题:

  • a 头母牛将b 块地上的牧草在c 天内吃完了;
  • a′头母牛将b′块地上的牧草在c′天内吃完了;
  • a″头母牛将b″块地上的牧草在c″天内吃完了;

求出从a 到c″ 9 个数量之间的关系

假设所有草地提供的牧草数量相同,每块草地每日长草量保持不变,而且每头母牛每天吃草量也相同。

这个题乍看上去实在不像是一道题,而且这九个数虽然不是毛关系都没有,但彼此之间的关系其实是非常简单的,无非假定每块地草量为xxx;每日长草yyy;每头牛每天吃zzz,可以得出

acz=bx+cbya′c′z=b′x+c′b′ya′′c′′z=b′′x+c′′b′′yacz=bx+cby\\\\ a'c'z=b'x+c'b'y\\\\ a''c''z=b''x+c''b''y\\\\ acz=bx+cbyacz=bx+cbya′′c′′z=b′′x+c′′b′′y

符号推导

接下来要将这三个等式中的x,y,zx,y,zx,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′′改写为a1,a2,a3a_1, a_2, a_3a1,a2,a3b,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]))

[b1b1c1−a1c1b2b2c2−a2c2b3b3c3−a3c3]\\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

由于这个式子乘以[x,y,z][x,y,z][x,y,z]等于0,说明这个矩阵不满秩,即行列式为0,换言之,这九个数有如下关系

∣b1b1c1−a1c1b2b2c2−a2c2b3b3c3−a3c3∣\\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

这个关系并不优雅,主要是其中的负号有点破坏美感。想解决这个问题很容易,只需假定z是个负数就行了,这样的话每头牛每天吃-z草,得到的结果如下

∣b1b1c1a1c1b2b2c2a2c2b3b3c3a3c3∣\\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