1、由七桥问题了解数学建模
在德国的哥尼斯堡有一条河从城市穿过,河中有两个小岛,有七座桥把河中的两个小岛与河两岸联系起来。

有人提出一个问题,就是一个人如何从桥的一端开始,顺序走过每一座桥,每一座桥仅走一次,最后再回到起点。
问题提出后,很多人就开始尝试求解这个问题,求解问题的方法就是在每座桥上走来走去,试图每座桥仅走一次,并且走过全部的七座桥,最终还要回到起点。
很多人走了无数次,都没有找到一种走法来解决上面的问题。于是有人就找到了数学家欧拉。
欧拉解决七桥问题的方法和其他人不一样,他并不去桥上走来走去,而是按照桥和两岸的布局绘制了一个几何图形。

图中的A和B是河上的两座小岛,C和D是河的两岸。
A岛和河的两岸分别有两座桥相连,因此A点和C点、A和D点用直线连接,A岛和B岛有一座桥相连,因此A点和B点用直线连接。
B岛和河的两岸分别有两座桥相连,因此B点和C点、B和D点分别有两条线连接,为了区分两个顶点的两条连接线,连接线用狐线连接。
通过把七桥问题映射为几何图形,欧拉就把七桥问题转换为数学问题,这就是数学建模。数学建模将现实问题的求解,变成了数学问题的求解,七桥问题转变为求从图中的任意一个顶点出发,经过且仅经过一次图中所有的边,最后再回到原点的可能性。最后欧拉证明七桥问题没有解。
2、 闰年问题的提出
闰年比普通年份多一天,闰年是366天,普通年份是365天。有人就提出一个问题,有没有一种方法?可以判断任意一个年份为闰年。

3、建立判断闰年的数学模型
建立数学模型前,我们需要对问题进行深入地了解,搜集和观察与问题相关的数据,看看这些数据有没有规律。如果能够用数学符号,数学公式或者图形来描述这些规律,就能够对现实问题用数学语言进行抽象和量化,从而建立现实问题对应的数学模型、
由于数学模型是建立在假设的基础上,因此需要对建立的数学模型进行验证,如果模型有问题,就需要对数学模型再进行假设,然后再验证,如此循环往复,才能建立实用的数学模型。
如何建立闰年的数学模型呢?
我们可以搜集已知的闰年年份,将已知的闰年年份进行比对分析,看能不能找出年份与闰年之间的数学规律,即年份通过一定的数学运算可推导出该年份是否是闰年。

这里给出了16个闰年年份,数据量不大,主要是为了说明数学建模的过程。我们仔细观察16个数据,发现它们都是偶数,再进一步观察,发现它们都能被4整除。
现在假设年份被4整除的是闰年,这样就建立了闰年对应的数学模型:

由于数学模型是在假设的前提下建立的,因此还需要验证数学模型的正确性。我们可以编写程序来验证模型的正确性。例如,可以让程序输出1800年~2020年被4整除的所有年份,观察输出的年份是否都是闰年。
可以发现1800年、1900年都不是闰年,因此需要修改数学模型,因为1800年、1900年都是世纪年(一个世纪是一百年,世纪年通常是指连续的一百年),暂时把世纪年排除在数学模型外面。修改后的数学模型:

编写程序来验证模型的正确性,输出1800年~2020年所有的闰年,世纪年暂时排除在外,观察发现数学模型工作正确。
因为上面的数学模型排除了对世纪年的判断,因此还需要确定判断世纪年的数学模型。观察公元1世纪到公元21世纪的世纪年发现,只有被400整除的世纪年才是闰年。修改后的闰年数学模型为:

4、 编写程序求解模型
闰年数学模型的求解可以用程序来实现,模型有两个数学判断,一个数学判断是年份被4整除,且不能被100整除;另外一个数学判断是年份被400整除。
用Python函数来实现闰年数学模型的求解,函数流程图如下:

闰年数学模型代码如下:
# 定义判断闰年的函数leapYear def leapYear(year): # 如果year被400整除,返回闰年 if year % 400 == 0: return "闰年" # 如果year被4整除,且不能被100整除,返回闰年 elif (year % 4 == 0) and (year % 100 !=0): return "闰年" # 如果前面条件都不满足,返回平年 else: return "平年"
代码解读
函数传入参数year,year是整数类型,是需要判断闰年的年份。
函数首先判断year能否被400整除,若能被400整除,函数返回闰年。若不能被400整除,再继续判断year是否能被4整除,且不能被100整除,若是函数返回闰年。
如果year不满足前面的两种条件判断,函数返回平年。
主程序流程图如下:

判断闰年的完整代码如下:
'''
程序文件:main.py
功能描述:判断某一年是否是闰年
代码编写时间:2020/04/26
作者:编程训练营
'''
# 定义判断闰年的函数leapYear
def leapYear(year):
# 如果year被400整除,返回闰年
if year % 400 == 0:
return "闰年"
# 如果year被4整除,且不能被100整除,返回闰年
elif (year % 4 == 0) and (year % 100 !=0):
return "闰年"
# 如果前面条件都不满足,返回平年
else:
return "平年"
# 程序入口
if __name__ == '__main__':
while(True):
# 等待用户输入
year = input("请输入4位数的年份,或者输入quit退出程序:")
# 判断year是否是年份
if (year.isdigit()) and (len(year)==4):
temp = leapYear(int(year))
print("%s年是%s" % (year,temp))
# 如果输入是quit,跳出循环
elif year == "quit":
break代码解读
程序定义了函数leapYear,用于判断传入的年份是否是闰年。leapYear传入整数类型的年份,返回“闰年”或“平年”字符串。
代码需要判断用户输入的年份是否正确,判断用户输入的年份是否正确分为两种下面情况:
(1) 用户输入的内容全部是数字字符;
(2) 用户输入的内容长度为4个字符。
当上面两种情况都满足时,就认为用户输入的是正确的年份。代码使用and运算符连接两个关系表达式进行判断,当这两个关系表达式都成立时,if条件才能满足。
当用户输入正确的年份时,调用leapYear函数,并传入年份,最后输出函数返回的判断信息。
