【计算几何】大自然的数学模型--分形几何

article/2025/1/6 20:39:34

一、前言

        分形几何是几何数学中的一个分支,也称大自然几何学,由著名数学家本华曼德勃罗( 法语:BenoitB.Mandelbrot)在 1975 年构思和发展出来的一种新的几何学。分形几何是对大自然中微观与宏观和谐统一之美的发现,并且揭示的部分只是冰山之一角,相信在人类认知的进步下,会开出一朵接一朵的美丽花朵。

        美国杰出的物理学家( 两弹元勋 、现代广义相对论之父)、物理学思想家、物理学教育家惠勒( Wheeler )断言: “ 可以相信,明天谁不熟悉分形,谁就不能被认为是科学上的文化人。”可以看出分形强大的影响力,当然个人也比较喜欢分形,因为利用分形可以画出很多美丽的图形,利用分形我们可以描绘出 树叶的纹路、画出完整的一棵树、形状酷似病毒的图形,混沌 ( chaos )、孤立子( solitons )和分形 ( fractals )是非线性科学 ( nonlinear  science ) 中三个最重要的概念。

二、什么是分形

        分形(英语:fractal,源自拉丁语:frāctus,有“零碎”、“破裂”之意),又称碎形残形,通常被定义为:

        “一个零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”[2],即具有自相似的性质。

        分形在数学中是一种抽象的物体,用于描述自然界中存在的事物。人工分形通常在放大后能展现出相似的形状[3]。 分形也被称为扩展对称展开对称。如果在每次放大后,形状的重复是完全相同的,这被称为自相似。自相似的一个例子是门格海绵[图1]。 分形在不同的缩放级别上可以是近似相似的。曼德博集合的【图2】放大图像中显示了这种模式[2][5][6][7]。 分形也包有图像的细节重复自身的意味。

三、关于自相似

        如果一个物体自我相似(Self-similarity),表示它和它本身的一部分完全或是几乎相似。若说一个曲线自我相似,即每部分的曲线有一小块和它相似。自然界中有很多东西有自我相似性质,例如海岸线。

3.1 谢尔宾斯基地毯(Sierpinski carpet、波兰语:Dywan Sierpińskiego)

        由波兰数学家瓦茨瓦夫·谢尔宾斯基(Wacław Sierpiński)于1916年提出的一种分形,是自相似集的一种。它的豪斯多夫维是 log 8/log 3 ≈ 1.8928。门格海绵是它在三维空间中的推广。

        将一个实心正方形划分为3X3的9个小正方形,去掉中间的小正方形,再对余下的小正方形重复这一操作便能得到谢尔宾斯基地毯。

3.2 门格海绵说明

        门格海绵(英语:Menger sponge、英语:Menger universal curve)是分形的一种。它是一个通用曲线,因为它的拓扑维数为一,且任何其它曲线或图都与门格海绵的某个子集同胚。它有时称为门格-谢尔宾斯基海绵谢尔宾斯基海绵。它是康托尔集和谢尔宾斯基地毯在三维空间的推广。它首先由奥地利数学家卡尔·门格在1926年描述,当时他正在研究拓扑维数的概念。

图1- 门格海绵的样子

3.3  曼德博集合

        是基于复平面的分形典范。曼德博集合可以用复二次多项式来定义:

f_c(z) = z^2+c     ,其中c 是一个复数参数。

从z = 0开始迭代:

        不同的参数c可能使序列的绝对值逐渐发散到无限大,也可能收敛在有限的区域内。曼德博集合M 就是使序列不延伸至无限大的所有复数c的集合。

图2- 曼德博集合

3.4 科赫雪花

        科赫雪花是由瑞典数学家科赫在 1904 年提出的一种不规则几何图形,也称为雪花曲线。

        分形图形的特点是整体几何图形是由一个微图形结构自我复制、反复叠加形成,且最终形成的整体图案和微图形结构一样。在编写分形算法时,需要先理解微图案的生成过程。

科赫雪花的微图案生成过程:

  •  先画一条直线。科赫雪花本质就由一条直线演化而成。
  • 三等分画好的直线。
  • 取中间线段,然后用夹角为 60° 的两条等长线段替代。
  • 可在每一条线段上都采用如上方式进行迭代操作,便会构造出多层次的科赫雪花。

四、谢尔宾斯基地毯代码实现 

4.1 算法代码:

# importing necessary modules
import numpy as np
from PIL import Image# total number of times the process will be repeated
total = 7# size of the image
size = 3 ** total# creating an image
square = np.empty([size, size, 3], dtype=np.uint8)
color = np.array([255, 255, 255], dtype=np.uint8)# filling it black
square.fill(0)for i in range(0, total + 1):stepdown = 3 ** (total - i)for x in range(0, 3 ** i):# checking for the centremost squareif x % 3 == 1:for y in range(0, 3 ** i):if y % 3 == 1:# changing its colorsquare[y * stepdown:(y + 1) * stepdown, x * stepdown:(x + 1) * stepdown] = color# saving the image produced
save_file = "sierpinski.jpg"
Image.fromarray(square).save(save_file)# displaying it in console
i = Image.open("sierpinski.jpg")
i.show()

4.2 谢尔宾斯基地毯结果:

五、分形树代码实现

5.1 分形树代码

import turtledef draw_tree(length):if length>=5:#设定颜色if length <=15:turtle.color('green')else:turtle.color('black')'''先画右侧树枝'''#向前turtle.forward(length)#右转25度turtle.right(25)#递归draw_treedraw_tree(length - 15)'''画左侧树枝'''#左转50度turtle.left(50)#递归draw_treedraw_tree(length - 15)'''回退'''#设定颜色if length <=15:turtle.color('green')else:turtle.color('black')#右转25度turtle.right(25)#回退turtle.backward(length)def main():#起始点往下移100turtle.pensize(4)turtle.left(90)turtle.penup()turtle.backward(100)turtle.pendown()draw_tree(100)turtle.exitonclick()if __name__ == '__main__':main()

5.2 分形树结果 

六、曼德博集合代码

6.1 代码

from PIL import Image
import colorsys
import math
import os#frame parameters
width = 1000 #pixels
x = -0.65
y = 0
xRange = 3.4
aspectRatio = 4/3precision = 500height = round(width / aspectRatio)
yRange = xRange / aspectRatio
minX = x - xRange / 2
maxX = x + xRange / 2
minY = y - yRange / 2
maxY = y + yRange / 2img = Image.new('RGB', (width, height), color = 'black')
pixels = img.load()def logColor(distance, base, const, scale):color = -1 * math.log(distance, base)rgb = colorsys.hsv_to_rgb(const + scale * color,0.8,0.9)return tuple(round(i * 255) for i in rgb)def powerColor(distance, exp, const, scale):color = distance**exprgb = colorsys.hsv_to_rgb(const + scale * color,1 - 0.6 * color,0.9)return tuple(round(i * 255) for i in rgb)for row in range(height):for col in range(width):x = minX + col * xRange / widthy = maxY - row * yRange / heightoldX = xoldY = yfor i in range(precision + 1):a = x*x - y*y #real component of z^2b = 2 * x * y #imaginary component of z^2x = a + oldX #real component of new zy = b + oldY #imaginary component of new zif x*x + y*y > 4:breakif i < precision:distance = (i + 1) / (precision + 1)rgb = powerColor(distance, 0.2, 0.27, 1.0)pixels[col,row] = rgbindex = row * width + col + 1print("{} / {}, {}%".format(index, width * height, round(index / width / height * 100 * 10) / 10))img.save('output.png')
os.system('open output.png')

6.2 运算结果 

七  科赫雪花代码

7.1 科赫雪花代码

import turtle
turtle.speed(100)
def ke_line(line_, n):if n == 0:turtle.fd(line_)else:line_len = line_ // 3for i in [0, 60, -120, 60]:turtle.left(i)ke_line(line_len, n - 1)
# 原始线长度
line = 300
# 移动小海龟画布左下角
turtle.penup()
turtle.goto(-150, -150)
turtle.pendown()
# 几阶科赫雪花
di_gui_deep = int(input("请输入科赫雪花的阶数:"))
while True:# 当多少科赫雪花围绕成一个圆周时,就构成一个完整的雪花造型count = int(input("需要几个科赫雪花:"))if 360 % count != 0:print("请输入 360 的倍数")else:break
for i in range(count):ke_line(line, di_gui_deep)turtle.left(360 // count)
turtle.done()

7.2 结果

八、后记

        有专门的理论教学《分形几何》,其中的内容更加丰富, 我们将在以后的博客中继续介绍。


http://chatgpt.dhexx.cn/article/jinjQ2C4.shtml

相关文章

Java分形递归——门格海绵

门格海绵的结构简单来说就是从一个正方体开始&#xff1b;再把正方体的每一个面分成9个正方形&#xff0c;这时就形成了由27个小正方体组成的一个大正方体&#xff1b;然后再把每一面的中间的正方体和最中心的正方体去掉&#xff0c;最终留下20个正方体。最后&#xff0c;把每一…

门格海绵的实现

实现效果&#xff1a; 源代码&#xff1a; package sponge;import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Polygon;import javax.swing.JFrame;public class Sponge_Main extends JFrame impleme…

混沌与分形(一):谢尔宾斯基三角形与门格海绵

研究混沌运动&#xff0c;少不了对分形理论的探讨。分形&#xff1a;通常被定义为“一个粗糙或零碎的几何形状&#xff0c;可以分成数个部分&#xff0c;且每一部分都&#xff08;至少近似地&#xff09;是整体缩小后的形状”&#xff0c;即具有自相似的性质。 本篇将从一维过…

分形之门格海绵

门格海绵解决思路&#xff1a; 1. 迭代如何实现 2. 立方体该怎么画 3. 实现门格海绵代码 4. 画图板门格海绵代码 1. 迭代如何实现 为了实现从1图—>2图—>3图效果,我们就要想到用迭代去实现. 因为像3图这样的图形,是由若干个2图这样的基本图形组成的 那么,怎样实现…

JAVA学习日志之门格海绵

门格海绵的结构可以用以下方法形象化&#xff1a; 从一个正方体开始。&#xff08;第一个图像&#xff09; 把正方体的每一个面分成9个正方形。这将把正方体分成27个小正方体&#xff0c;像魔方一样。 把每一面的中间的正方体去掉&#xff0c;把最中心的正方体也去掉&#xff0…

复杂分形,简单规则:门格海绵世界探秘

连绵的山川、飘浮的云朵、岩石的断裂口、布朗粒子运动的轨迹、树冠、花菜、大脑皮层……这些部分与整体以某种方式相似的形体&#xff0c;可以说&#xff0c;就是“分形”的要义了&#xff0c;也恰恰是这些“不规则的”、“分散的”、“支离破碎的”物体又重新让我们认识了自然…

JQData | 高校版使用教程,30秒安装完成,自带Python环境

本地量化金融数据JQData&#xff0c;是聚宽数据团队专门为金融机构、学术团体和量化研究者们提供的本地量化金融数据服务。自有版权&#xff0c;支持国内多家头部券商实盘交易。历经15万量化研究者与数百家机构使用验证。 JQData目前已支持国内30 高校&#xff0c;本次更新&…

JQData + matplotlib 实现回测日志的交易细节可视化 量化数据接口

原文&#xff1a;https://zhuanlan.zhihu.com/p/49051899 前言&#xff1a; 做量化交易的朋友都知道回测的重要性&#xff0c;回测结果是衡量一个量化交易策略是否靠谱的重要依据。回测平台会按历史行情数据模拟成交&#xff0c;并将回测结果汇总成报告。 在很多时候&#xf…

Note: Python学习笔记 -- Anaconda install jqdata

运行代码下列代码&#xff0c;提示错误 没有安装 jqdata。打开Anaconda Prompt 输入 pip install jqdata 提示cannot find command git然后百度了半天&#xff0c;有人说 pip install git 出错可以使用 conda install git 但是依然出错。最后去官网下载了Git:https://git-scm.…

jq使用教程01_最贴心教程,安装JQData全靠这篇指南

Hi, 各位亲爱的小伙伴们&#xff01; 近来听说有部分小伙伴在安装JQData时遇到了点小麻烦&#xff0c;导致最后没有安装成功&#xff0c;为了帮助小伙伴们快速成功安装JQData&#xff0c;小编今天来为大家排一下“雷”&#xff0c;希望能帮到你们哟 (&#xff65;ω&#xff6…

事件驱动的选股小工具(JQData)

昨天发改委下发了《关于积极推进风电、光伏发电无补贴平价上网有关工作的通知》&#xff0c;也不知道对股市是利空还是利多。连夜做了一个搜索公司经营范围的小工具,看看那些股票受到影响。 以后还可以增加筛选条件&#xff0c;比如财务指标&#xff0c;剔除ST股票&#xff0c;…

股票python量化交易008-JoinQuant中JQData的使用

查阅JoinQuant中JQData的使用文档python代码实现导入JQData,并认证用户身份。认证完毕显示“auth success”后即可使用 from jqdatasdk import *; auth(ID,Password);#ID是申请时所填写的手机号;Password为聚宽官网登录密码 # 查询jqdata的调用次数情况 surplus_count = g…

jqdata pyechart: 用grid双图实现k线带图成交 — by QUANTAXIS

from jqdatasdk import * from pyecharts import Kline,Bar,Grid 首先我们先应JQDATA 的活动演示一下如何调用pyecharts 画图 auth(acc,password) dataget_price(000001.XSHE) auth success先打印下 data 我们可以看到 jqdata返回的格式是 一个单index的Dataframe data.he…

Quant | JQData使用API简单梳理(二)

聚宽平台实际上提供了两种查询数据的方法,第一种是线上在聚宽平台可以使用的API:jqdata,另外一种则是本地的接口:JQData,是的,你没有看错,只是大小写的不同,搞得一开始我以为完全是同一种。jqdata可以线上通过import jqdata来引入数据接口,本地的JQData则是通过import…

jqdata(data是什么文件格式)

期货交易中bar和tick是什么意思 Bar 的概念 在一定时间段内的时间序列就构成了一根 K 线(日本蜡烛图)&#xff0c;单根 K 线被称为 Bar。 如果是一分钟内的 Tick 序列&#xff0c;即构成一根分钟 K 线&#xff0c;又称分钟 Bar; 如果是一天内的分钟序列&#xff0c;即构成一根日…

JQData | 量化界最好用的本地量化金融数据(free free~)

什么是本地量化金融数据 - JQData &#xff1f; 使用JQData本地量化金融数据服务&#xff0c;可快速查看、计算或接入金融数据信息&#xff0c;解决本地、web、自研金融终端调用数据的需求。支持python多版本及多操作系统。为财经类企业、金融机构、学术研究机构和量化爱好者们…

获取股票数据【使用JQData查询行情数据、财务指标、估值指标】

了解股票&#xff1a; 在上一次量化小科普【什么是量化&#xff1f;常用的股票量化指标、如何搭建量化交易系统】对于量化的概念有了一个基本认识&#xff0c;其中量化的主体在这门课程的学习中是“股票”&#xff0c;而当别人问你&#xff1a;“什么是股票&#xff1f;”&…

JQData安装的问题(本地调用的量化金融数据接口-免费)

JQData简介(1)JQData是聚宽数据团队专门为有志于从事量化投资的金融机构、研究人员以及个人量化爱好者提供的本地量化金融数据。用户只需在本地Python环境下安装JQData数据包,输入三行代码,即可调用由聚宽数据团队专业生产的全套量化金融数据,让你轻松告别平台限制,灵活安…

JQData安装(转)

首先&#xff0c;JQData是基于python的一个数据包&#xff0c;所以安装JQData的第一步是安装Python &#xff08;没有接触过python或者python基础不好的小伙伴&#xff0c;可以关注聚宽量化课堂的python讲堂进行python学习&#xff09;。 对于python安装包的选择&#xff0c;…

JQData安装的问题(只解决安装的问题)

1. JQData简介 &#xff08;1&#xff09;JQData是聚宽数据团队专门为有志于从事量化投资的金融机构、研究人员以及个人量化爱好者提供的本地量化金融数据。用户只需在本地Python环境下安装JQData数据包&#xff0c;输入三行代码&#xff0c;即可调用由聚宽数据团队专业生产的…