在小米春季新品发布会上,小米的CEO雷军宣布,小米正式推出全新LOGO,采用新的超椭圆轮廓设计,替换原先的方形轮廓

超椭圆的三两个实验_数学

超椭圆是超椭圆曲线的简称,是拉梅曲线的一个分支,拉梅曲线最初由法国科学家拉梅(Gabriel Lame)发现和提出的,是一种类似于椭圆的封闭曲线,保留了椭圆的长轴、短轴、对称性的特点。拉梅曲线的数学方程如下:

                                ∣                         x                                  ∣                          n                                 +                         ∣                         y                                  ∣                          n                                 =                         1                            |x|^n+|y|^n=1                 ∣x∣n+yn=1

当参数n大于1的时候就是超椭圆,超椭圆的形状是一种介于正圆形到正方形之间的的形状,而当n小于1的时候就是星形线
超椭圆的三两个实验_数学_02

我们来做几个关于超椭圆的实验,限定再笛卡尔直角坐标系下

(1) n是正偶数

当n为偶数的时候,随着n逐渐变大,其形状越来越往外拓,越来越饱满,特别的,n=2的时候就是常规的半径为1的的单位圆,而n趋向无穷的时候就是一个边长为1的单位正方形。

# n为偶数ns = np.arange(2, 34, step=2) #设定n值范围plt.figure(figsize=(6, 6)) #新建画布for ind_, n in enumerate(ns): 
    plt.subplot(math.isqrt(len(ns)), math.isqrt(len(ns)), ind_+1) #4*4的子图
    myx = np.linspace(-1, 1, 10000, endpoint = True) #横坐标范围
    myy = (1-myx**n)**(1/n) #横坐标
    plt.plot(myx, myy, c ="blue", linewidth = 0.3)  #y正半轴
    plt.plot(myx, -myy, c= "blue", linewidth = 0.3) #y负半轴
    plt.title(y = 0.85, label="n="+ str(n), fontsize = 5,  loc = "right")  #标题
    plt.tick_params(labelsize = 4)#刻度字体大小plt.show()

其效果图如下

(2) n是正奇数

从拉梅曲线方程来看,如果n是正奇数的话,可能会出现复数的情形,所以需要先取绝对值,再开方,形状跟n为正偶数差不多

# n为奇数ns = np.arange(3, 35, step=2) #设定n值范围plt.figure(figsize=(6, 6)) #新建画布for ind_, n in enumerate(ns): 
    plt.subplot(math.isqrt(len(ns)), math.isqrt(len(ns)), ind_+1) #4*4的子图
    myx = np.linspace(-1, 1, 10000, endpoint = True) #横坐标范围
    myy = (1-np.abs(myx)**n)**(1/n) #横坐标
    plt.plot(myx, myy, c ="blue", linewidth = 0.3)  #y正半轴
    plt.plot(myx, -myy, c= "blue", linewidth = 0.3) #y负半轴
    plt.title(y = 0.85, label="n="+ str(n), fontsize = 5,  loc = "right")  #标题
    plt.tick_params(labelsize = 4)#刻度字体大小plt.show()

效果图如下

超椭圆的三两个实验_数学_03

(3) n是大于2的正整数

既然n可以取偶数也可以取奇数,那么就统一一下,取大于2的正整数,与n是正奇数差不多

# n为大于2的正整数ns = np.arange(2, 18, step=1) #设定n值范围print(ns, len(ns), math.isqrt(len(ns)), math.isqrt(len(ns))+1 )plt.figure(figsize=(6, 6)) #新建画布for ind_, n in enumerate(ns): 
    plt.subplot(math.isqrt(len(ns)), math.isqrt(len(ns)), ind_+1) #4*4的子图
    myx = np.linspace(-1, 1, 10000, endpoint = True) #横坐标范围
    myy = (1-np.abs(myx)**n)**(1/n) #横坐标
    plt.plot(myx, myy, c ="blue", linewidth = 0.3)  #y正半轴
    plt.plot(myx, -myy, c= "blue", linewidth = 0.3) #y负半轴
    plt.title(y = 0.85, label="n="+ str(n), fontsize = 5,  loc = "right")  #标题
    plt.tick_params(labelsize = 4)#刻度字体大小plt.show()

其效果图如下

超椭圆的三两个实验_数学_04

(4) 动图

这种随着n变化而变化的图,可以通过动图的展示对比来看会更加直观

# 动图fig = plt.figure(figsize=(4, 4)) #新建画布模板plt.ylabel('x', fontsize =5) #x轴plt.xlabel('y', fontsize =5) #y轴plt.tick_params(labelsize = 4)#刻度字体大小def  chartFunc(i = int): #定义超椭圆曲线图
    colormap = cm.rainbow(np.linspace(0, 1, 10))
    myx = np.linspace(-1, 1, 10000, endpoint = True) #横坐标范围
    myy = (1-np.abs(myx)**i)**(1/i) #横坐标
    plt.plot(myx, myy, linewidth = 0.3, color = colormap[i])  #y正半轴
    plt.plot(myx, -myy, linewidth = 0.3, color = colormap[i]) #y负半轴
    plt.title(y = 0.5, label = "$|x|^{}+|y|^{}=1$".format(str(i), str(i)), loc = "center")animator = FuncAnimation(fig, chartFunc, frames = np.arange(2, 10, step=1),  interval = 500, repeat = True) #渲染动图animator.save("D:\markdown\配套图片\superellipse.gif", writer="pillow") #保存为gif动图

效果如下动图所示

超椭圆的三两个实验_数学_05

今天我们的实验就到这里了,如果小伙伴有什么有问题欢迎留言!

超椭圆的三两个实验_数学_06