python探索分形和混沌

news2025/1/13 15:30:00

简单产生复杂,混沌孕育秩序

0. 引言

a. 分形 fractal

【也叫碎形】
分形是一种具有自相似性和复杂结构的几何图形。在分形结构中,无论放大多少次,局部的结构特征都与整体结构相似。这种特性在自然界中广泛存在,比如树木枝干、山脉轮廓、云的形状等。

一些常见的分形:
🔸 规则分形:理想的数学模型,自相似性是明显的。包括但不限于:科赫曲线,科赫雪花,谢尔宾斯基三角形,谢尔品斯基地毯,康托尔集,皮亚诺曲线等。
🔹 无规分形:在物理学或自然界存在的分形,自相似是近似的或统计的。包括但不限于:雪花、海岸线、海绵、叶脉和毛细血管,茱利亚集,曼德尔布罗特集合等。

b. 混沌 chaos

混沌系统是指具有高度敏感性和不确定性的动态系统,其行为在长期预测中极为复杂。混沌系统通常表现出对初始条件的敏感性(蝴蝶效应),即微小的变化可以导致完全不同的结果,而且其行为往往看似随机,但实际上是由确定的规则产生的。

一些常见的混沌系统:
洛伦兹吸引子,罗西尔系统,Henon映射,杜福尔系统,物流映射,摆的混沌,干涉系统,螺旋混沌等。

c. 分形与混沌

分形强调几何图形和自相似性的特性,而混沌系统则侧重于动态行为和时间演化的性质。

分形具有缩放对称性,在标度变换下仍具有分形整体上相似的复杂性和不规则性(即无穷层次的自相似性),在某些情况下,分形可以是混沌系统的一种表现形式,出现在其分析中,但并非所有分形都是混沌系统。
有些分形(例如:洛伦兹吸引子,曼德尔布罗特集合)展示了混沌特性,而其他一些分形(例如:康托尔集)则缺乏动态的混沌行为。

d. 分维 D

零维的点、一维的线、二维的面、三维的立体、四维的时空,然而空间维数也可以是分数,不是整数。

分维(fractional dimension) D = l o g M l o g n D=\frac{logM}{logn} D=lognlogM

图形由M个相等的部分组成,其在先行尺度上是原图形的 1 n \frac{1}{n} n1 ,则 M × ( 1 n ) D = 1 M×{(\frac{1}{n})}^D=1 M×(n1)D=1 .

比如:

谢尔品斯基地毯
D = l g 3 l g 2 ≈ 1.585 \begin{align} D & = \frac{lg3}{lg2} ≈ 1.585\\ \end{align} D=lg2lg31.585

科赫曲线 D = l g 4 l g 3 ≈ 1.262 \begin{align} D & = \frac{lg4}{lg3} ≈ 1.262\\ \end{align} D=lg3lg41.262

二维扩散置限凝聚
D = 1.66 ∼ 1.71 \begin{align} D & = 1.66 ∼ 1.71\\ \end{align} D=1.661.71

1. 常见的分形

a. 蕨菜叶分形 fern

f ( x , y ) = [ a b c d ] [ x y ] + [ e f ] = [ a x + b y + e c x + d y + f ] f(x,y) = \left[ \begin{matrix} a & b\\ c & d\\ \end{matrix} \right] \left[ \begin{matrix} x\\ y\\ \end{matrix} \right]+\left[ \begin{matrix} e\\ f\\ \end{matrix} \right]= \left[ \begin{matrix} ax+by+e\\ cx+dy+f\\ \end{matrix} \right] f(x,y)=[acbd][xy]+[ef]=[ax+by+ecx+dy+f]

ω \omega ωabcdefp产生的部分
ƒ10000.16000.01
ƒ20.850.04−0.040.8501.600.84连续变小的小叶子
ƒ30.20−0.260.230.2201.600.07最大的左侧叶
ƒ4−0.150.280.260.2400.440.07最大的右侧叶

a-f 系数;p 概率因子
所有变换的概率总和等于1,以保证在随机选择时,只有一项变换会被选中。

最知名的蕨菜叶分形是Barnsley Fern.

Barnsley fern

Barnsley fern

茎:
f 1 ( x , y ) = [ 0 0 0 0.16 ] [ x y ] + [ 0 0 ] = [ 0 0.16 y ] f_1(x,y) = \left[ \begin{matrix} 0 & 0\\ 0 & 0.16\\ \end{matrix} \right] \left[ \begin{matrix} x\\ y\\ \end{matrix} \right]+\left[ \begin{matrix} 0\\ 0\\ \end{matrix} \right]= \left[ \begin{matrix} 0\\ 0.16y\\ \end{matrix} \right] f1(x,y)=[0000.16][xy]+[00]=[00.16y]

连续变小的小叶子:
f 2 ( x , y ) = [ 0.85 0.04 − 0.04 0.85 ] [ x y ] + [ 0 1.6 ] = [ 0.85 x + 0.04 y − 0.04 x + 0.85 y + 1.6 ] f_2(x,y) = \left[ \begin{matrix} 0.85 & 0.04\\ -0.04 & 0.85\\ \end{matrix} \right] \left[ \begin{matrix} x\\ y\\ \end{matrix} \right]+\left[ \begin{matrix} 0\\ 1.6\\ \end{matrix} \right]= \left[ \begin{matrix} 0.85 x + 0.04y\\ -0.04x + 0.85y + 1.6\\ \end{matrix} \right] f2(x,y)=[0.850.040.040.85][xy]+[01.6]=[0.85x+0.04y0.04x+0.85y+1.6]

最大的左侧叶:
f 3 ( x , y ) = [ 0.2 − 0.26 0.23 0.22 ] [ x y ] + [ 0 1.6 ] = [ 0.2 x − 0.26 y 0.23 x + 0.22 y + 1.6 ] f_3(x,y) = \left[ \begin{matrix} 0.2 & -0.26\\ 0.23 & 0.22\\ \end{matrix} \right] \left[ \begin{matrix} x\\ y\\ \end{matrix} \right]+\left[ \begin{matrix} 0\\ 1.6\\ \end{matrix} \right]= \left[ \begin{matrix} 0.2x - 0.26y\\ 0.23x + 0.22y + 1.6\\ \end{matrix} \right] f3(x,y)=[0.20.230.260.22][xy]+[01.6]=[0.2x0.26y0.23x+0.22y+1.6]

最大的右侧叶:
f 4 ( x , y ) = [ − 0.15 0.28 0.26 0.24 ] [ x y ] + [ 0 0.44 ] = [ − 0.15 x + 0.28 y 0.26 x + 0.24 y + 0.44 ] f_4(x,y) = \left[ \begin{matrix} -0.15 & 0.28\\ 0.26 & 0.24\\ \end{matrix} \right] \left[ \begin{matrix} x\\ y\\ \end{matrix} \right]+\left[ \begin{matrix} 0\\ 0.44\\ \end{matrix} \right]= \left[ \begin{matrix} -0.15x + 0.28y\\ 0.26x + 0.24y + 0.44\\ \end{matrix} \right] f4(x,y)=[0.150.260.280.24][xy]+[00.44]=[0.15x+0.28y0.26x+0.24y+0.44]

通过这些参数,可以创建不同的蕨类品种,比如:变化为Thelypteridaceae fern.
Thelypteridaceae fern

Thelypteridaceae fern

ω \omega ωabcdefp产生的部分
ƒ10000.250-0.40.02
ƒ20.950.005−0.0050.93-0.0020.50.84连续变小的小叶子
ƒ30.035−0.20.160.04-0.090.020.07最大的左侧叶
ƒ4−0.040.20.160.040.0830.120.07最大的右侧叶

在这里插入图片描述


改变茎的朝向:

# 旋转点以使茎朝左
# 这里使用旋转矩阵将点旋转 180 度(在 x 轴上翻转)
points[:, 0] = -points[:, 0]

Barnsley fern

Barnsley fern

变色
在这里插入图片描述
在这里插入图片描述

b. 科赫曲线 KochCurve

在这里插入图片描述turtle绘制科赫曲线:

import turtle
import threading

pens = [] # 画笔列表
iterations_list = [1, 2, 3, 4, 5, 6] # 迭代次数列表
y_positions = [-250, -150, -50, 50, 150, 250] # 各个画笔的起始y坐标

def koch_curve(t, size, iterations):
    # 科赫曲线
    if iterations == 0:
        t.forward(size)
    else:
        for angle in [0, 60, -120, 60]:
            t.left(angle)
            koch_curve(t, size / 3, iterations - 1)

def draw_koch_curve(t, iterations):
    # 绘制科赫曲线
    t.pendown()
    koch_curve(t, 300, iterations)
    t.hideturtle()

def setup_turtles():
    # 设置多个画笔
    for i, iterations in enumerate(iterations_list):
        t = turtle.Turtle()
        t.speed(0)  # 设置绘制速度为最快
        t.penup()
        t.goto(-150, y_positions[i])  # 设置起始位置,x 坐标固定,y 坐标变化
        pens.append((t, iterations))

def draw_curve_in_thread(t, iterations):
    # 在新线程中绘制科赫曲线
    draw_koch_curve(t, iterations)

# 创建一个 turtle 窗口
screen = turtle.Screen()
screen.title("Multiple Koch Curves")

setup_turtles() # 设置画笔

# 创建并启动线程
threads = []
def draw_all_curves():
    for t, iterations in pens:
        thread = threading.Thread(target=draw_curve_in_thread, args=(t, iterations))
        threads.append(thread)
        thread.start()

# 等待所有线程完成
for thread in threads:
    thread.join()

draw_all_curves()

turtle.done() # 保持窗口开启,直到用户关闭

RuntimeError: main thread is not in main loop

threads = []

for t, iterations in pens:
    thread = threading.Thread(target=draw_curve_in_thread, args=(t, iterations))
    threads.append(thread)
    thread.start()

# 等待所有线程完成
for thread in threads:
    thread.join()

turtle.done() # 保持窗口开启,直到用户关闭

解决办法

在这里插入图片描述

c. 科赫雪花 KochSnowflake

在这里插入图片描述可以由科赫曲线旋转得到。

import turtle

def koch_curve(size, iterations):
    # 递归绘制科赫曲线
    if iterations == 0:
        turtle.fd(size)
    else:
        for angle in [0, 60, -120, 60]:
            turtle.left(angle)
            koch_curve(size / 3, iterations - 1)


# 设置 turtle 窗口
turtle.setup(800, 600)  # 增加高度以适应更大的布局
turtle.speed(0)  # 设置为最快速度
turtle.pensize(1)

# 绘制多个不同迭代次数的科赫曲线
iterations_list = [0, 1, 2, 3, 4]  # 定义要绘制的迭代次数
size = 100  # 每条曲线的长度,可以调整以适应布局
horizontal_spacing = 110  # 各个曲线间的垂直间距

# 循环绘制
for i, iterations in enumerate(iterations_list):
    turtle.penup()
    turtle.goto( i*horizontal_spacing -300, 250 -size / 2)  # 适当的垂直间距
    turtle.setheading(0)  # 确保每条曲线都从水平位置开始绘制
    turtle.pendown()

    koch_curve(size, iterations)  # 绘制科赫曲线

    # 旋转并绘制相同曲线两次,形成完整的三角形
    for _ in range(2):
        turtle.right(120)
        koch_curve(size, iterations)

turtle.hideturtle() # 隐藏 turtle
turtle.done() 

上色
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2064472.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

目前AI 辅助代码生成是否将成为未来编程的主流?

最强AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量https://aitools.jurilu.com/ 我的答案是 肯定的 ! AI辅助代码生成正在迅速崛起,将会成为未来编程的主流趋势。 当然这里的问题是"…

代码随想录算法训练营第二十三天(回溯 二)

力扣题部分: 39. 组合总和 题目链接:. - 力扣(LeetCode) 题面: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以…

Windows系统,查看本机端口被哪个进程占用

1 打开CMD 快捷键 WinR,输入cmd,确定,打开命令行窗口。 2 查看端口的进程PID netstat -aon|findstr "80" 3 根据进程PID查看应用名称 tasklist|findstr "1468" 4 如果想关掉该进程,在任务管理器结束进程既…

「数组」数组双指针算法合集:二路合并|逆向合并|快慢去重|对撞指针 / LeetCode 88|26|11(C++)

目录 概述 1.二路合并 思路 复杂度 Code 2.逆向合并 思路 复杂度 Code 3.快慢去重 思路 复杂度 Code 4.对撞指针 思路 复杂度 Code 总结 概述 数组的线性枚举是我们学习编程时遇到的第一种枚举手段。但是它看起来有点愚蠢:只有一个索引i承担全部…

美食攻略系统---附源码99630

摘要 本论文旨在探讨如何利用SpringBoot技术开发一个美食攻略系统。系统将按照软件开发流程,采用B/S架构和面向对象编程思想进行项目开发。在引言部分,将介绍美食攻略系统的背景和开发目的,后续章节将依据软件开发流程,对系统进行…

电路笔记(PCB):数字信号的带宽与上升沿时间经验公式 BW = \frac{0.35}{T_r}

数字信号的带宽由上升沿决定 1. 传输线路的带宽如果小于信号的带宽就会产生失真 带宽限制和失真:当信号通过带宽受限的传输线路时,如果线路的带宽小于信号的带宽,信号的高频成分将被削弱或完全滤除。这种削弱会导致信号失真,特别…

Luma 1.5正式发布,文生视频加强真实感,时长最长5秒

距离上次版本发布仅过去了两个月,Luma AI再次发布了升级版本Dream Machine 1.5。新版本具有更好的文本到视频转换、更智能地提示理解、自定义文本渲染和改进图像到视频的功能。 得益于Luma AI对所有公众开放,任何人都可以免费试用,平台用户在…

CANoe.DiVa的应用——生成TP层测试用例过程流程详解(二)

🙋‍♂️【Vector CANdelastudio配置CDD】文章合集💁‍♂️点击跳转 ——————————————————————————————————–—— 从0开始学习CANoe使用 从0开始学习车载测试 相信时间的力量 星光不负赶路者,时光不负有心人。 目录 一.概述2.经典CAN T…

基于x86 平台opencv的图像采集和seetaface6的人脸朝向姿态估计功能

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、开发流程3.1 编写测试3.2 配置资源文件3.2 验证功能一、概述 本文档是针对x86 平台opencv的图像采集和seetaface6的人脸朝向姿态估计功能,opencv通过摄像头采集视频图像,将采集的视频图像送给seetaface6的人脸朝向姿态…

JavaEE 第15节 JUC相关组件介绍

目录 前言: Callable ReentrantLock Semaphore CountDownLatch 前言: 在Java中,JUC(包路径:java.util.concurrent)是一个用于并发编程的包,提供了线程安全的集合类、同步工具、并发执行框…

OSPF配置学习笔记

1.OSPF基础配置命令 1.1(系统视图)创建并运行OSPF进程 [Huawei] ospf [ process-id | router-id router-id ] porcess-id用于标识OSPF进程,默认进程号为1。OSPF支持多进程,在同一台设备上可以运行多个不同的OSPF进程&#xff0…

[000-01-022].第09节:RabbitMQ中的消息分发策略

我的后端学习大纲 RabbitMQ学习大纲 1.不公平分发: 1.1.什么是不公平分发: 1.在最开始的时候我们学习到 RabbitMQ 分发消息采用的轮训分发,但在某种场景下这种策略并不是很好,比方说有两个消费者在处理任务,其中有个…

【机器学习】联邦学习技术

欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 文章目录 引言联邦学习的定义与原理联邦学习的用例联邦学习示例与代码 引言 在大数据时代,数据隐私和安全成为了一个日益重要的议题。传统的机器学习模型训练通常需要集中大量数据到一个中心服务器…

【自然语言处理】 构建文本对话系统

构建文本对话系统的框架如下: 根据聊天系统目的功用的不同,可分成三大类型: 闲聊式机器人:较有代表性的有微软小冰、微软小娜、苹果的 Siri、小 i 机器人等,主要以娱乐为目的。 **知识问答型机器人:**知识…

Linux别名与用户管理体系

一、别名 1、概述 别名,给命令进行设置 一般用于给命令设置一个昵称/爱称 主要应用场景: 给常用命令设置个快捷方式,使用简单方便给危险命令加上的防护措施 查看系统已有的别名 [rootyunwei ~]# alias alias cpcp -i alias egrepegrep --coloraut…

[alien Invasion]python小游戏阶段总结

以后可能还会进行代码重构,以最终版本为准 本篇文章旨在理清程序脉络,方便以后写类似的程序时提供一个习惯的思路 未经允许,禁止转载 实体区 ship.py import pygame class Ship():def __init__(self,screen,ai_settings):#储存以便后续使…

RocketMQ广播模式消费失败是否会重试?

文章目录 前言继续广播和集群模式的消费流程集群模式(默认的)广播模式小结 push和pull介绍源码展示 偏移量保存失败情况1. 网络问题2. Consumer本地问题3. 消费进度记录器问题4. 程序设计问题5. 异常终止6. 持久化策略问题7. 同步问题 源码解析OffsetSto…

亚马逊测评号生存法则:如何抵御亚马逊封号风波?

距离黑五购物狂欢节还剩99天,相信各位商家都在紧锣密鼓的筹备相关事宜,然而,亚马逊的封号风波再次席卷而来。那如何在这场风暴中让亚马逊矩阵测评号安全航行亦或是脱颖而出呢?本文将给你一个答案,并帮助你的亚马逊店铺…

【PyTorch快速入门教程】03 PyTorch基础知识

在PyTorch中,最小的计算单元是张量(tensor)。因此关于张量的学习还是至关重要的。通过本章节学习,希望你对张量有一个更清晰的了解。 文章目录 1 什么是Tensor2 PyTorch中Tensor使用2.1 创建Tensor2.1.1 直接创建Tensor2.1.2 间接…

anaconda上安装pytorch

1、选择anaconda prompt 2、创建虚拟环境 3、激活进入虚拟环境 4、安装pytorch 怎么得到上面的这串命令? 输入nvidia-smi,查看cuda的版本号为11.7 我这里选择安装cuda的版本号为11.3,满足向下兼容即可。 在安装深度学习环境时,要…