1、问题的提出
牛吃草问题是一个经典的数学问题,最早出现在科学家牛顿的一本著作中,问题内容是:
有一块牧场草地,长得一样密,一样快。有一些牛在该草地上吃草,若每头牛每天吃的草量相同,如果饲养27头牛,这些牛6天可以把草吃完;如果饲养23头牛,这些牛9天可以把草吃完;如果饲养21头牛,这些牛多少天可以把草吃完?
2、建立问题的数学模型
应用问题的解决,对问题的理解非常重要,找出问题各种量之间的关系,是建立模型的关键。
在这个问题中涉及的量有牛的数量、草的总量、牛吃草的天数。在这些量中,草的总量是动态变化的,即牛每天在吃草,草则每天在生长。
草的总量由两部分总成,一部分是草原有的量,一部分是草新生长的量。当这些牛把草全部吃完后,这些牛吃草的总量就等于草的总量。
在问题中给出了两个已知条件:一个条件是27头牛,6天可以把草吃完;另外一个条件是23头牛9天可以把草吃完。如果设牛每天吃草的量为y,草地中原有的量为a,草每天生长的量为c,根据已知条件,可以列出下面的方程组:

化解方程组:

解方程组可以求得c和y的值,c是草每天的生长量,y是一头牛每天吃的草量。
要解决的问题是求21头牛,多少天可以把草吃完。如果设z天可以把草吃完,则得出下面的方程:

由此得出:

3、使用NumPy库求解线性方程组
求解二元一次方程组可以使用消元法,这些知识在中学才能学到。我们可以利用Python的NumPy库来求解二元一次方程组。
NumPy是Python中科学计算的基础软件包,它提供了众多数学运算工具,这些数学运算工具包括:线性代数中的矩阵和向量运算、傅里叶变换、多维数组运算、数据统计运算以及丰富的数学函数库。
下面安装numpy库:
(1)启动Windows命令行窗口,在Windows命令行窗口输入命令:
pip install numpy

(2)pip工具会自动下载numpy包并安装,如下图所示:
(3)下图是安装成功信息。当pip版本不是最新版本时,pip会提示是否更新pip版本。
(4)如果提示pip版本更新,在Windows命令行窗口输入命令:
python -m pip install –upgrade pip
(5)pip版本更新成功。
4 、编写程序求解数学模型
数学模型需要用户输入草的总量,草的总量没有单位,可以是大于零的任何整数。

程序流程图如下:

(1)接收用户输入的草的总量;
(2)验证草的总量是否是整数,如果不是整数,输出“草的总量为整数,请输入整数”,程序结束,否则执行第3个步骤;
(3)创建矩阵和向量,创建的矩阵是二元一次方程组的系数,向量是二维向量,向量元素是x和y;
(4)使用numpy库求解线性方程组;
(5)计算21头牛吃完全部草需要的天数;
(6)输出天数。
程序代码如下:
'''
程序文件:main.py
功能描述:牛吃草问题
代码编写时间:2020/05/05
作者:编程训练营
'''
# 导入numpy库
import numpy as np
# 程序入口
if __name__ == '__main__':
# 要求用户输入草的总量
a = input("请输入草的总量:")
if a.isdigit():
# 建立2X2矩阵
ta = np.array([[162,-6],[207,-9]])
# 建立2维向量
tb = np.array([int(a),int(a)])
# 解线性方程组
x = np.linalg.solve(ta,tb)
# 输出x和y的值
print("X = %.2f Y = %.2f" % (x[0],x[1]))
# 求解21头牛多少天可以把草吃完
z = (int(a)/21)/(x[0]-x[1]/21)
print("21头牛 %d 天可以把草吃完" % (int(z)))
else:
print("草的总量为整数,请输入整数")代码解读
代码导入了numpy库。
numpy库的array函数可以创建矩阵,在代码中创建的矩阵为2X2矩阵,是模型中二元一次方程组的系数,创建的二维向量是模型中二元一次方程组的等式右侧的数值。
代码使用numpy库的linalg模块的solve函数,来求解模型中的二元一次方程组,函数传入的参数为已创建的2X2矩阵和二维向量,函数返回的结果是一个列表,该列表存储了二元一次方程组的未知数x和y的值。
最后按照模型公式计算出21头牛吃完全部草需要的天数。
