python在数学建模中的应用,python数学建模基础教程

本篇文章给大家谈谈python在数学建模中的应用,以及python数学建模基础教程,希望对各位有所帮助,不要忘了收藏本站喔。

Source code download: 本文相关源码

习题1

1.1 Python语言有哪些数据类型?

  1. 数值数据类型
    数值数据类型主要有整数和浮点数,浮点数就是带有小数点的数字
  2. 布尔数据类型
    Python语言的布尔(bool)数据类型只有True和False两个值,布尔数据类型通常用于流程控制中的逻辑判断。
  3. 字符串数据类型
    在Python中定义一个字符串可以使用单引号、双引号和三引号,这使得Python输入文本更方便python自动化运维应用
  4. 复合数据类型
    数值类型、布尔类型数据不可再分解为其他类型,而列表、元组、集合和字典类型的数据包含多个相互关联的数据元素,所以称它们为符合数据类型。字符串起始也是一种复合数据,其元素是单个字符。

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−s2​s.difference(s2)
集合的交: s = s & s 2 s = s \& s_2 s=s&s2​s.intersection(s2)
集合的对称差: s = s ∧ s 2 s=s^{\wedge}s_2 s=s∧s2​s.symmetric_difference(s2)
集合的并集: s = s ∣ s 2 s=s|s_2 s=s∣s2​s.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中导入模块中的对象有哪几种方式?

  1. import 模块名 [as 别名]
    模块名字很长可以为模块设置一个别名,然后使用“别名.对象名”的方式来使用其中的对象。
  2. from 模块名 import 对象名 [as 别名]
    这种方式可以明确指定的对象,并且可以为导入的对象确定一个别名。
  3. from 模块名 import *
    可以一次导入模块中通过__all__变量指定的所有对象。
  4. 自定义模块的导入
    通过长用户将多个函数收集在一个脚本文件,创建一个用户自定义的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<2500
250 ≤ s < 500 250 \leq s<500 250≤s<5002.5
500 ≤ s < 1000 500 \leq s<1000 500≤s<10004.5
1000 ≤ s < 2000 1000 \leq s<2000 1000≤s<20007.5
2000 ≤ s < 2500 2000 \leq s<2500 2000≤s<25009.0
2500 ≤ s < 3000 2500 \leq s<3000 2500≤s<300012.0
3000 ≤ s 3000 \leq s 3000≤s15.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​)cosy1​cosy2​+siny1​siny2​]

其中 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])
  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值