算法笔记(二)
见识数学的美
- 算法笔记(二)
- 前言
- 一、笛卡尔的心
- 二、蒙特卡洛法求pi
- 三.最大公约数和最小公倍数
- 四.闰年问题
- 五.求三维空间三角形的面积
- 总结
前言
接触了基础内容,知道了用程序能来实现许多数学计算,那么这一节让我们看看数学的魅力吧
一、笛卡尔的心
关于笛卡尔的心形曲线,有个童话版本是这样的:
52岁的笛卡尔,遇到了28岁的瑞典公主克里斯汀。笛卡尔对公主一见钟情,但因为阶级差距感到非常伤心。有一天,公主的马车路过某地,发现笛卡尔正在学习数学。公主非常好奇,就下了车询问了笛卡尔一些问题。后来笛卡尔收到一份通知,国王要他做公主的数学老师。而在接下来的日子里,公主和笛卡尔相爱了。国王发现了这件事,非常生气,要处死笛卡尔,公主苦苦哀求,最终将其流放回法国,回答法国后的笛卡尔天天给公主写信,但都被国王拦截。当寄出第十三封信后,笛卡尔就气绝身亡了,而第十三封心中只有一个公式y=a(1-sinθ),国王下令全城数学家来都解不开,国王不忍看着女儿整天郁郁寡欢,又想着笛卡尔应该不会时时刻刻都在说情话,就把信交给了女儿,公主拿到信后看到内容立马理解,拿出纸笔开始画,看到图案开心极了,因为图案赫然是一个心。
接下来就用代码小小实现一波
import matplotlib.pyplot as plt # 导入matplotlib第三方绘图库
import numpy as np # 导入第三方科学计算库
x = np.linspace(0, 2 * np.pi, 500) # 0 到 2Π 范围内均匀取500个值
a = 6
rho = a * (1 - np.sin(x)) # 心形公式
plt.subplot(polar=True) # 设置为极坐标
plt.plot(x, rho, c='r') # 绘制红色的心型图
plt.text(0, 0, 'Love You!',color='m') # 标注 ”Love You!“
plt.show() # 显示绘制结果
运行结果:
二、蒙特卡洛法求pi
蒙特卡洛是北非摩纳哥一个著名的赌场城市。赌博具有很大的随机性,实践性,而蒙特卡洛法就采用了概率和统计思路,通过实验解决问题。
求Π的思路:
在一个单位正方形与其内切圆上随机投掷产生坐标点,在圆内产生点数c与正方形里产生的点数n之比约为Π/4
from random import random
n = 100000
def xy_range(n):
m = 0
for i in range(1, n + 1):
x = random() * 2 - 1 # x的随机取值范围在[-1,1)
y = random() * 2 - 1 # y的随机取值范围在[-1,1)
if x ** 2 + y ** 2 < 1: # 单位圆公式判断点在圆内
m += 1
return m
c1 = xy_range(n)
print("总试验次数为%d,计算的圆周率是%f" % (n, 4*c1/n))
运行结果如下:
三.最大公约数和最小公倍数
1.了解
最大公约数:最大公约数指某几个整数共有因子中最大的一个
最小公倍数:两个或多个整数公有的倍数叫做它们的公倍数。
2.代码如下:
"""
---------------------最大公约数----------------------
"""
def big_num(x, y): # 自定义求两个整数的最大公约数方法
reduce = 0
if x > y: # 确定最小的数
reduce = x
elif y > x:
reduce = y
else: # 相等时随便返回一个,此处返回x
reduce = x
while reduce >= 1: # 从小的数开始作为除数,减1进行整除运算
if x % reduce == 0 and y % reduce == 0:
return reduce # 返回最大公约数
else:
reduce -= 1
try:
x = int(input("请输入第一个数:"))
y = int(input("请输入第二个数:"))
if x <= 0 or y <= 0:
print("应该输入大于零的数")
else:
print("%d和%d的最大公约数是%d" % (x, y, big_num(x, y)))
except:
print("输入数出错!")
"""
-------------------------最小公倍数------------------------
"""
def small_num(x, y):
reduce = 0
if x > y: # 确定最小的数
reduce = x
elif y > x:
reduce = y
else: # 相等时随便返回一个,此处返回x
reduce = x
while reduce:
if reduce % x == 0 and reduce % y == 0:
return reduce
else:
reduce += 1
try:
n1 = int(input("请输入第一个数:"))
n2 = int(input("请输入第二个数:"))
if n1 <= 0 or n2 <= 0:
print("请输入大于零的数")
else:
print("%d和%d最小公倍数为%d" % (n1, n2, small_num(n1, n2)))
except:
print("输出数出错!")
这个案例就不演示结果了
四.闰年问题
1.了解闰年:
是4的倍数,但不为百年的是闰年
是400倍数的
2.代码实现
def runyear(y):
if y % 4 == 0 and y % 100 != 0:
return 1
elif y % 400 == 0:
return 1
else:
return 0
try:
y = int(input("请输入年份:"))
if y >= 0:
x = runyear(y)
if x:
print(f"{y}是闰年")
else:
print(f"{y}不是闰年")
else:
print("输入的年份不对")
except:
print("输出有误")
五.求三维空间三角形的面积
1.需求
(1).已知三点坐标
(2).利用欧式距离公式,求得两点间的距离
(3).利用海伦公式求任意三角形的面积
代码如下:
import numpy as np
A = np.array([1, 1, 1])
B = np.array([3, 1.5, 1.5])
C = np.array([4, 2, 2])
dab = np.sqrt(np.sum((A - B) ** 2))
dac = np.sqrt(np.sum((A - C) ** 2))
dbc = np.sqrt(np.sum((B - C) ** 2))
print('AB的长度为', dab)
print('AC的长度为', dac)
print('BC的长度为', dbc)
s = (dab + dac + dbc) / 2
area = np.sqrt(s * (s - dab) * (s - dac) * (s - dbc))
print("该任意三角形的面积为%.2f平方米" % (area))
结果如下:
总结
数学的美也只不过是另外一种吸引人的方法,本质还是希望有更多的人学好数学,喜欢博主的文章的记得三连哦~