本篇文章给大家谈谈python在数学建模中的应用,以及python数学建模基础教程,希望对各位有所帮助,不要忘了收藏本站喔。
Source code download: 本文相关源码
习题1
1.1 Python语言有哪些数据类型?
- 数值数据类型
数值数据类型主要有整数和浮点数,浮点数就是带有小数点的数字 - 布尔数据类型
Python语言的布尔(bool)数据类型只有True和False两个值,布尔数据类型通常用于流程控制中的逻辑判断。 - 字符串数据类型
在Python中定义一个字符串可以使用单引号、双引号和三引号,这使得Python输入文本更方便python自动化运维应用。 - 复合数据类型
数值类型、布尔类型数据不可再分解为其他类型,而列表、元组、集合和字典类型的数据包含多个相互关联的数据元素,所以称它们为符合数据类型。字符串起始也是一种复合数据,其元素是单个字符。
1.2 使用pip命令安装Matplotlib模块。
pip install Matplotlib
1.3 什么叫序列?它有哪些类型?各有什么特点?
①有顺序的数据元素的集合体,称为序列(sequence)。序列可以通过各数据元素在序列中的位置编号(索引)来访问数据类型。
②列表、元组、字符串、集合、字典。
③列表可以通过索引(或下标)的方式实现列表元素的获取。元组是一个不可改变的列表。字符串的本质字符序列。字典以键值对的形式存储数据。集合是一个无序排列、不重复的几何体。
1.4 什么是空集合和空字典?如何创建?
s = set() #定义一个空集合
s = {} #定义一个空字典
1.5 Python支持的集合运算有哪些?集合对象的方法有哪些?
集合的差: s = s − s 2 s = s - s_2 s=s−s2s.difference(s2)
集合的交: s = s & s 2 s = s \& s_2 s=s&s2s.intersection(s2)
集合的对称差: s = s ∧ s 2 s=s^{\wedge}s_2 s=s∧s2s.symmetric_difference(s2)
集合的并集: s = s ∣ s 2 s=s|s_2 s=s∣s2s.union(s2)
s.add(x)#在集合s中添加对象x;如用s与果对象已经存在,则不添加
s.remove(x)#从集合s中删除x,若x不存在,则引发KeyError错误
s.discard(x)#如果x是s成员,测删除x。x不存在,也不出现错误
s.clear()#清空集合s中所有元素
s.copy()#将集合s进行一次浅拷贝
s.pop()#从集合s中删除第一个元素;如果s为空,则引发KeyError异常
s.update(s2)#用s与s2得到的并集更新变量s
1.6 在Python中导入模块中的对象有哪几种方式?
- import 模块名 [as 别名]
模块名字很长可以为模块设置一个别名,然后使用“别名.对象名”的方式来使用其中的对象。 - from 模块名 import 对象名 [as 别名]
这种方式可以明确指定的对象,并且可以为导入的对象确定一个别名。 - from 模块名 import *
可以一次导入模块中通过__all__变量指定的所有对象。 - 自定义模块的导入
通过长用户将多个函数收集在一个脚本文件,创建一个用户自定义的Python模块。
1.7 输入一个整数,判断它是否为水仙花数。所谓水仙花数,是指这样的一些3位整数,各位数字的立方和等于该数本身,例如, 153 = 1 3 + 5 3 + 3 3 153=1^3+5^3+3^3 153=13+53+33,因此153是水仙花数。
查阅资料表明:水仙花数是正整数
a = input('请输入一个整数,下面判断是否其为水仙花数')
result = int(a[0]) ** 3 + int(a[1]) ** 3 + int(a[2]) ** 3
if len(a) == 3 and result == int(a):
print('此数是水仙花数')
else:
print('此数不是水仙花数')
1.8 随机产生一个三位整数,将它的十位数字变为0。假设生成的3位整数位738,则输出为708。
import random
num = random.randint(100, 999) # 生成随机三位整数
print('生成随机三位数为:', num)
num_str = str(num)
num = int(num_str[0] + '0' + num_str[-1])
print('十位数字变为0后三位数为:', num)
1.9 输入整数 x , y x,y x,y和 z z z,若 x 2 + y 2 + z 2 x^2+y^2+z^2 x2+y2+z2大于1000,则输出 x 2 + y 2 + z 2 x^2+y^2+z^2 x2+y2+z2千位以上的数字,否则输出三个数之和。
x = input('请输入x的值:')
y = input('请输入y的值:')
z = input('请输入z的值:')
result = int(x) ** 2 + int(y) ** 2 + int(z) ** 2
num = int(result) # 数值类型三位数
num_str = str(num) # 字符串类型三位数
if result > 1000:
print(num_str[0:-4])
1.10 某运输公司在计算运费时,按运输距离 s s s对运费给一定的折扣率 d d d,折扣率d的标准如表1.10所示,输入基本运费 p p p,货物重量 ω \omega ω,距离 s s s,计算总运费 f f f,其中,总运费的计算公式为 f = p ω s ( 1 − d ) f=p\omega s(1-d) f=pωs(1−d)。
运输距离 s s s | 折扣率 d / % d/\% d/% |
---|---|
s < 250 s<250 s<250 | 0 |
250 ≤ s < 500 250 \leq s<500 250≤s<500 | 2.5 |
500 ≤ s < 1000 500 \leq s<1000 500≤s<1000 | 4.5 |
1000 ≤ s < 2000 1000 \leq s<2000 1000≤s<2000 | 7.5 |
2000 ≤ s < 2500 2000 \leq s<2500 2000≤s<2500 | 9.0 |
2500 ≤ s < 3000 2500 \leq s<3000 2500≤s<3000 | 12.0 |
3000 ≤ s 3000 \leq s 3000≤s | 15.0 |
s = int(input('运输距离s:'))
p = int(input('基本运费p:'))
ω = int(input('货物重量ω:'))
if s < 250:
d = 0
elif 250 <= s < 500:
d = 0.025
elif 500 <= s < 1000:
d = 0.045
elif 1000 <= s < 2000:
d = 0.075
elif 2000 <= s < 2500:
d = 0.09
elif 2500 <= s < 3000:
d = 0.12
elif 3000 <= s:
d = 0.15
print('总运费f=pωs(1-d)为:', p * ω * s * (1 - d))
1.11 编写一个Python程序,将日期作为输入并打印该日期是一周当中的周几,用户输入有3个:m(月)、d(日)、y(年)。对于m,用1表示一月,2表示二月,以此类推。对于输出,0表示周日、1表示周一、2表示周二,以此类推。计算阳历日期对应的周几可用以下公式。
y 0 = y − ( 14 − m ) / / 12 y_0=y-(14-m)//12 y0=y−(14−m)//12 x = y 0 + y 0 / / 4 − y 0 / / 100 + y 0 / / 400 x=y_0+y_0//4-y_0//100+y_0//400 x=y0+y0//4−y0//100+y0//400 m 0 = m + 12 × ( ( 14 − m ) / / 12 ) − 2 m_0=m+12\times((14-m)//12)-2 m0=m+12×((14−m)//12)−2 d 0 = ( d + x + ( 31 × m 0 ) / / 12 % 7 d_0=(d+x+(31\times m_0)//12\%7 d0=(d+x+(31×m0)//12%7
这里符号"\\"表示整除
例如:2019年3月2日是周几?
y 0 = y − ( 14 − m ) / / 12 = 2019 y_0=y-(14-m)//12=2019 y0=y−(14−m)//12=2019 x = y 0 + y 0 / / 4 − y 0 / / 100 + y 0 / / 400 = 2508 x=y_0+y_0//4-y_0//100+y_0//400=2508 x=y0+y0//4−y0//100+y0//400=2508 m 0 = m + 12 × ( ( 14 − m ) / / 12 ) − 2 = 1 m_0=m+12\times((14-m)//12)-2=1 m0=m+12×((14−m)//12)−2=1 d 0 = ( d + x + ( 31 × m 0 ) / / 12 % 7 = 6 d_0=(d+x+(31\times m_0)//12\%7=6 d0=(d+x+(31×m0)//12%7=6
y = int(input("请输入年:"))
m = int(input("请输入月:"))
d = int(input("请输入日:"))
y0 = y - (14 - m) // 12
x = y0 + y0 // 4 - y0 // 100 + y0 // 400
m0 = m + 12 * ((14 - m) // 12) - 2
d0 = (d + x + (31 * m0) // 12) % 7
print(str(y) + '年' + str(m) + '月' + str(d) + '日是周' + str(d0))
1.12 编写一个Python程序,在给定年限N和年利率r的情况下,计算当贷款金额为P时,每月需要还贷的金额,每月还贷公式为 P r ′ ( 1 + r ′ ) N ′ ( 1 + r ′ ) N ′ − 1 \frac{Pr'(1+r')^{N'}}{(1+r')^{N'}-1} (1+r′)N′−1Pr′(1+r′)N′,其中 N ′ = 12 N , r ′ = r 12 N'=12N,r'=\frac{r}{12} N′=12N,r′=12r为月利息。
N = int(input("请输入年限N:"))
r = float(input("请输入年利率r:"))
P = float(input("请输入贷款金额P:"))
r_ = r / 12
N_ = 12 * N
money = (P * r_ * (1 + r_) ** N_) / ((1 + r_) ** N_ - 1)
print('每月还款金额为:', money)
1.13 设地球表面A点的经度和纬度分别为 x 1 x_1 x1和 y 1 y_1 y1,B点的经度和围堵分别为 x 2 x_2 x2和 y 2 y_2 y2,编写一个计算并打印地球上A,B两点的大圆弧距离 d d d的Python程序。大圆弧距离计算公式为:
d = R a r c c o s [ c o s ( x 1 − x 2 ) c o s y 1 c o s y 2 + s i n y 1 s i n y 2 ] d=R arccos[cos(x_1-x_2)cosy_1cosy_2+siny_1siny_2] d=Rarccos[cos(x1−x2)cosy1cosy2+siny1siny2]
其中 R = 6370 k m R=6370km R=6370km,请计算所给坐标之间的大圆弧距离(单位:km)注意:sin,cos函数输入的弧度制,而程序中给的是角度值,需要转换。
math.radians()角度转为弧度
from math import *
A_longitude = float(input('A地经度:'))
A_latitude = float(input('A地纬度:'))
B_longitude = float(input('B地经度:'))
B_latitude = float(input('B地纬度:'))
R = 6370
d = R * acos(cos(radians(A_longitude - B_longitude)) * cos(radians(A_latitude)) * cos(radians(B_latitude)) + sin(radians(A_latitude)) * sin(radians(B_latitude)))
print('所给坐标之间的大圆弧距离为:', d)
1.14 如果一个整数等于它的因子(不包括该数本身)之和,则称该数为完数。例如,6的因子为1,2,3,因为6=1+2+3,因此6就是完数,找出1000以内的所有完数。
for i in range(1,1000):
factor = []
for j in range(1,i):
if i % j == 0 :
factor.append(j) #因子列表
sum = 0
for k in factor:
sum = sum + k
if sum == i:
print(sum,'是完数')
1.15 令x=[1,2,3],y=[-1,-2,-3]。代码zip(*zip(x,y))的结果是什么,解释其工作原理。
<zip object at 0x0000026753ACB8C0>
zip()函数返回的对象类型为<class ‘zip’>
当zip()函数有两个参数时分别从a和b依次各取出一个元素组成元组,再将依次组成的元组组合成一个新的迭代器–新的zip类型数据。
*zip()函数是zip()函数的逆过程,将zip对象变成原先组合前的数据。
1.16 编写函数,接受一个字符串,分别统计大写字母、小写字母、数字、其他字符的个数,并以元组的形式返回结果。
string = input('请输入一个字符串:')
a = 0 # 大写字母个数
b = 0 # 小写字母个数
c = 0 # 数字个数
d = 0 # 其他字符个数
for i in string:
if i.isupper() == True:
a = a + 1
elif i.islower() == True:
b = b + 1
elif i.isdecimal() == True:
c = c + 1
else:
d = d + 1
print('大写字母个数、小写字母个数、数字个数、其他字符个数分别为:', (a, b, c, d))
1.17 编写一个Python程序,将用户输入的一个1~999的整数转换成其对应的英文表示,例如,729将被转换成seven hundred and twenty nine。要求在程序中尽可能地使用函数封装一些常用的转换,至少要使用一个函数。
def single_English(n):
if n == '1':
return 'one'
elif n == '2':
return 'two'
elif n == '3':
return 'three'
elif n == '4':
return 'four'
elif n =='5':
return 'five'
elif n == '6':
return 'six'
elif n == '7':
return 'seven'
elif n == '8':
return 'eight'
elif n == '9':
return 'nine'
def double_English(n):
if n=='10':
return 'ten'
elif 20<=int(n)<30:
return 'twenty'
elif 30<=int(n)<40:
return 'thirty'
elif 40<=int(n)<50:
return 'forty'
elif 50<=int(n)<60:
return 'fifty'
elif 60<=int(n)<70:
return 'sixty'
elif 70<=int(n)<80:
return 'seventy'
elif 80<=int(n)<90:
return 'eighty'
elif 90<=int(n)<100:
return 'ninety'
elif n == '11':
return 'eleven'
elif n == '12':
return 'twelve'
elif n == '13':
return 'thirteen'
elif n == '14':
return 'fourteen'
elif n == '15':
return 'fifteen'
elif n == '16':
return 'sixteen'
elif n == '17':
return 'seventeen'
elif n == '18':
return 'eighteen'
elif n == '19':
return 'nineteen'
def output_double_English(a):
if a[1] == '0':
print(double_English(a))
elif 11 <= int(a) < 20:
print(double_English(a))
else:
print(double_English(a) + ' ' + single_English(a[1]))
a = input('请输入一个1~999的数字:')
print('输出英文为:', end='')
if len(a) == 1:
print(single_English(a))
elif len(a) == 2:
output_double_English(a)
else:
print(single_English(a[0]) + ' hundred and ', end='')
output_double_English(a[1:3])