用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+cbyacz=bx+cbya′′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,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]))

[ 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

由于这个式子乘以 [ 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| b1b2b3b1c1b2c2b3c3a1c1a2c2a3c3

这个关系并不优雅,主要是其中的负号有点破坏美感。想解决这个问题很容易,只需假定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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微小冷

请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值