python画八角形代码步骤(python高级算法绘图实例)

技术python如何绘制超炫酷动态Julia集这期内容当中小编将会给大家带来有关python如何绘制超炫酷动态Julia集,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。前言此Julia

本期,边肖将为您带来关于python如何绘制酷动态Julia集的信息。文章内容丰富,从专业角度进行分析和描述。希望你看完这篇文章能有所收获。

00-1010这个Julia不是Julia,指的是使迭代公式F (z)=Z 2C F (z)=Z 2C F (z)=Z 2C C收敛于某个复数c c c的复数z z的集合例如,当c=0 c=0 c=0时,其收敛区间为z 2 nbsp。

;          <                      1                          z^2<1               z2<1的单位圆,对应的                              c                          c               c的Julia集便是                              cos                      ⁡                      θ                      +                      i                      sin                      ⁡                      θ                          \cos\theta+i\sin\theta               cosθ+isinθ。

Mandelbrot集

特别地,当                              c                      =                      z                          c=z               c=z的初始值时,符合收敛条件的                              z                          z               z的便构成大名鼎鼎的Mandelbrot集

python如何绘制超炫酷动态Julia集

在上图中,颜色表示该点的发散速度,可以理解为开始发散时迭代的次数。其生成代码也非常简单,唯一需要注意的是,由于使用了大量的矩阵运算,故使用了cupy,如果电脑没装cuda,只需将所有的cp改为np即可。

# 这些代码会在后面的程序中反复调用,不再说明
import numpy as np
import time
import matplotlib.pyplot as plt
import cupy as cp

#生成z坐标 x0,y0 为起始点, nx,ny为点数, delta为点距
def genZ(x0, y0, nx, ny, delta):
    real, img = cp.indices([nx,ny])*delta
    real += x0
    img += y0
    return real.T+img.T*1j

#获取Julia集,n为迭代次数,m为判定发散点,大于1即可
def getJulia(z,c,n,m=2):
    t = time.time()
    z,out = z*1, cp.abs(z)
    c = cp.zeros_like(z)+c
    for i in range(n):
        absz = cp.abs(z)
        z[absz>m]=0		#对开始发散的点置零
        c[absz>m]=0		
        out[absz>m]=i	#记录发散点的发散速度
        z = z*z + c
    print("time:",time.time()-t)
    return out

z1 = genZ(-2,-1.5,1000,1000,0.003)
mBrot = getJulia(z1,z1,50)
plt.imshow(mBrot.get(), cmap=plt.cm.jet)
plt.show()

如果对其生成过程感兴趣,那么可以观察一下随着迭代次数的增加,图像的变化情况

python如何绘制超炫酷动态Julia集

代码如下。

from matplotlib import animation

fig = plt.figure()
fig.subplots_adjust(top=1, bottom=0, left=0, right=1)
ax = plt.subplot()

def getJulias(z,c,n,m=2):
    z,out = z*1, cp.abs(z)
    c = cp.zeros_like(z)+c
    J = []
    for i in range(n):
        z = z*z + c
        absz = cp.abs(z)
        z[absz>m]=0		#对开始发散的点置零
        c[absz>m]=0		
        out[absz>m]=i	#记录发散点的发散速度
        im = ax.imshow(out.get(),cmap=plt.cm.jet, animated=True)
        ax.set_axis_off()
        J.append([im])
    return J

N = 75     #迭代次数
z1 = genZ(-2,-1.5,1000,1000,0.003)
J = getJulias(z1,z1,N)

ani = animation.ArtistAnimation(fig, J, interval=50, blit=True,repeat_delay=1000)
plt.show()
ani.save('julias.gif',writer='imagemagick')

无限缩放

Mandelbrot集的分形特征意味着我们所生成的图片可以无限放大,但是受到栅格化尺寸的影响,手动的放大并不会更改其真实尺寸,

为了照顾观感,将缩放中心作为图像的中心,所以对genZ函数进行修改。如果选取(-0.75,-0.2)作为缩放中心,则其变化如下

python如何绘制超炫酷动态Julia集

代码为

from matplotlib import animation

# 生成z坐标 xy=np.array([xc,yc]) 为起始点,
# nxy=np.array([nx,ny])为点数, delta为点距
def genZbyCenter(xy,nxy,delta):
    x0, y0 = xy-np.array(nxy)*delta/2
    return genZ(x0,y0,*nxy,delta)

mBrots = []
xy = [-0.75,-0.2]
nxy = [1000,1000]
delta0 = 0.003  #初始宽度

fig = plt.figure()
fig.subplots_adjust(top=1, bottom=0, left=0, right=1)
ax = plt.subplot()

for n in range(50):
    z1 = genZbyCenter(xy,nxy,1.1**(-n)*delta0)
    out = getJulia(z1,z1,40)
    im = ax.imshow(out.get(),cmap=plt.cm.jet, animated=True)
    ax.set_axis_off()
    mBrots.append([im])

ani = animation.ArtistAnimation(fig, mBrots, interval=50, blit=True)
plt.show()
ani.save('zoom.gif',writer='imagemagick')

Julia集

如果更改c的值,那么就能得到一个变化着的Julia集,例如,下面选取一条直线

y                         =                         x                              y=x                  y=x

上面的Julia集,效果如图所示

python如何绘制超炫酷动态Julia集

代码为

z1 = genZ(-2,-1.5,1000,1000,0.003)

fig = plt.figure()
fig.subplots_adjust(top=1, bottom=0, left=0, right=1)
ax = plt.subplot()

mBrots = []
for x in np.arange(0.5,1,0.01):
    c = x + x*1j
    out = getJulia(z1,c,40)
    im = ax.imshow(out.get(),cmap=plt.cm.jet, animated=True)
    ax.set_axis_off()
    mBrots.append([im])

ani = animation.ArtistAnimation(fig, mBrots, interval=50)
plt.show()
ani.save('julia.gif',writer='imagemagick')

上述就是小编为大家分享的python如何绘制超炫酷动态Julia集了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/144748.html

(0)

相关推荐

  • 怎么搭建Solr8与ikanalyzer

    技术怎么搭建Solr8与ikanalyzer今天就跟大家聊聊有关怎么搭建Solr8与ikanalyzer,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。服务安装并启

    攻略 2021年10月19日
  • Javascript中DOM、节点和获取元素的示例分析

    技术Javascript中DOM、节点和获取元素的示例分析这篇文章给大家分享的是有关Javascript中DOM、节点和获取元素的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。DOM文

    攻略 2021年11月2日
  • 15.MongoDB数据库

    技术15.MongoDB数据库 15.MongoDB数据库1.介绍与安装
    介绍MongoDB是非关系型数据库,基于分布式文件存储的开源数据库系统理解关系型数据库与非关系型数据库(表就是关系)
    关系型数据

    礼包 2021年12月10日
  • css如何加载外部字体文件

    技术css如何加载外部字体文件这篇文章主要介绍“css如何加载外部字体文件”,在日常操作中,相信很多人在css如何加载外部字体文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”css如何加

    攻略 2021年11月10日
  • 简述spark的运行架构(spark可以运行在哪些模式下)

    技术如何解析Spark运行模式这篇文章将为大家详细讲解有关如何解析Spark运行模式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Spark运行模式1 Spark的两个

    攻略 2021年12月17日
  • 赞美春天的句子,有没有对春天赞美的好句子

    技术赞美春天的句子,有没有对春天赞美的好句子)春天来了!你看,融化的冰水把小溪弄醒了。“丁冬赞美春天的句子、丁冬”,它就像大自然的神奇歌手,唱着清脆悦耳的歌,向前奔流……
    2)柳树舒展开了黄绿嫩叶的枝条,在微微的春风

    生活 2021年10月23日