python 画不同形状散点_欧拉数e的python-matplotlib可视化

1 说明

=====

1.1 欧拉数:就是自然常数,e。

1.2 e是“指数”(exponential)的首字母,也是欧拉名字的首字母。

1.3 三大数学常数:自然常数e、圆周率π和虚数单位i。

1.4 第一次把e看成常数的是雅各布•伯努利,他开始尝试计算lim(1+1/n) n 的值;1727年欧拉首次用小写字母“e”表示这常数。

f8559f55ffd1b900fbe2c9cf05c5f15e.png

欧拉恒等式:真正的宇宙第一公式

ab8436d194151303fa3458471d616def.png

欧拉(Leonhard Euler,1707年4月15日-1783年9月18日),瑞士数学家和物理学家

2 python实现自然常数e

==================

2.1 图1

2e9d6e91504912e407df28d775a2bff3.png

图片1:静态

2.2 图2

570f3e641857d245860c9901c23a5eaf.gif

图片2:蒙特卡洛法动态散点分布图

3 python的e求近似值==求阶乘法

=========================

3.1 代码1:

#计算e的值(精度为10**-6,可调节,最大50,即小数点后50位)sum,tmp = 1,1for i in range(1,100):  #100,为取值最小17,代码2有讲解    tmp*=i    sum += 1/tmpprint("e的近似值(精度为10**-6)为%.6f"%sum)print("e的近似值(精度为10**-9)为%.9f"%sum)print("e的近似值(精度为10**-29)为%.29f"%sum)print("e的近似值(精度为10**-69)为%.69f"%sum)

3.2 代码1结果:

#e的近似值(精度为10**-6)为2.718282#e的近似值(精度为10**-9)为2.718281828#e的近似值(精度为10**-29)为2.71828182845904553488480814849#e的近似值(精度为10**-69)为2.718281828459045534884808148490265011787414550781250000000000000000000

3.3 代码2:

n = int(input())sum = 0def jc(a):    #求阶乘    num = 1    for i in range(a + 1):        if i != 0:            num *= i    return numfor i in range(n + 1):    sum += 1 / jc(i)print('{:.50f}'.format(sum))

3.4 结果

n为输入非负整数 n(≤1000)17 #为最小n,大于17的n值基本不变2.7182818284590455348848081484902650117874145507812516 #<17的数值改变2.71828182845904287034954904811456799507141113281250

4 图片1的代码

import matplotlib.pyplot as plt#级数 1+1/1!+1/2!+⋯+1/n!+⋯ 来近似计算x = []y = []#计算e的值(精度为10**-50)edata,tmp = 1,1for i in range(1,50):    x.append(i)    tmp*=i        y.append(edata)    edata += 1/tmpplt.plot(x, y)plt.title('e自然常数(欧拉数)(小数点后50位)≈:{:.50f}'.format(edata))plt.show()

5 图片2的说明

===========

5.1 源代码来自

https://www.jianshu.com/p/107d97423e6b#2019-3-14 张子豪 同济大学 感谢原作者#源代码有报错,修改bug,并对代码进行注释、修改、整理

5.2 源代码bug

No handles with labels found to put in legend./home/xgj/Desktop/python-e/2.py:35: MatplotlibDeprecationWarning: Adding an axes using the same arguments as a previous axes currently reuses the earlier instance.  In a future version, a new instance will always be created and returned.  Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.  plt.subplot(121)......(省略)

5.3 解决bug思路

#参考文章https://www.it1352.com/1605941.html  

6 图片2代码

=========

6.1 第1步:导入模块

import randomimport matplotlib.pyplot as pltimport numpy as np

6.2 第2步:初始化参数设置

#plt背景颜色定义,一定放在前面plt.style.use('dark_background')DARTS = 300  #可自定义,源代码1024*1024,太大了counts = 0 # 落在曲线下方的点数e = 0 # e的计算值xs = [0,0]ys = [0,0]#初始化定义画布,一行2个子图axfig, (ax1, ax2) = plt.subplots(1, 2)

6.3 第3步:子图1=ax1

# 开始画左边的图:撒点估计曲线下方的面积x = np.arange(0.5,2.5,0.001)ax1.set_ylim(0,1.25) # y轴坐标范围ax1.set_xlabel('x') # x轴标签ax1.set_ylabel('y') # y轴标签ax1.plot(x,1/x) # 绘制反比例函数曲线ax1.legend(['loc=1']) # 在右上角增加图例ax2.legend(['y = 1 / x']) # 图例的内容ax1.plot([1,1,2,2],[0,1,1,0],'r',linewidth=0.2) # 绘制撒点范围框ax1.set_title('蒙特卡洛法动态散点分布图') # 图的标题动态更新

6.4 第4步:联动子图1和子图2

#4-1 子图1的散点图for i in range(DARTS):    x = random.uniform(1,2)    y = random.uniform(0,1)    if y < 1/x: # 点落在曲线下方        counts += 1        ax1.plot(x,y,'g.')    else: # 点落在曲线上方        ax1.plot(x,y,'r.')    if counts>0:        e = pow(2,i/counts)        #4-2 子图2设置    # 开始画右边的图:e的计算值随投掷次数的关系    xs[0] = xs[1] # 上一个e值与下一个e值,通过xs与ys列表中的两个元素进行两点连线    xs[1] = i    ys[0] = ys[1]    ys[1] = e    ax2.set_ylim(0,4.5) # y轴坐标范围    ax2.set_xlabel('Number of try') # x轴标签    ax2.set_ylabel('Estimation of e') # y轴标签    ax2.set_yticks(np.arange(0,4.5,0.5)) # y轴刻度线    ax2.set_title('e:{:.10f}count:{}'.format(e,i)) # 图的标题动态更新    # 绘制2.71828参考线    ax2.axhline(np.e,linewidth=0.05,color='r')     # 绘制e的计算值随撒点次数变化的曲线    ax2.plot(xs,ys,'y--',linewidth=0.3)     #子图1和子图2交互(ax1与ax2交互)    plt.ion() # 保持图像处于交互更新状态     plt.pause(0.2) # 控制撒点速度

7 小结

=====

7.1 环境:matplotlib3.2+python3.8

7.2 注意matplotlib中文设置:

请参考我的文章,以免报错。

《强!3种方法实现python-matplotlib显示中文》

===分析仔细,值得收藏===

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值