用PolarDB生成“上帝的指纹”

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 分形法则被誉为神性法则, 因为它的公式极其简单, 但是能产生无穷无尽的自相似性. 例如通过分形公式产生的曼德勃罗集, 被成为上帝的指纹.本文介绍了上帝指纹的生成算法, 以及用PolarDB来生成"上帝的指纹".

背景

分形法则被誉为神性法则, 因为它的公式极其简单, 但是能产生无穷无尽的自相似性. 例如通过分形公式产生的曼德勃罗集, 被成为上帝的指纹.

PS: 如何部署PolarDB开源版, 请参考: 《如何用 PolarDB 证明巴菲特的投资理念》

1、分形公式:

z=z^2+c    
z可以是单数、也可以是复数、甚至可以是多维数.

2、复数运算:

(a+bi)(c+di) = (ac-bd)+(ad+bc)i    
(a+bi) + (c+di) = (a+c)+(b+d)i    
(a+bi) - (c+di) = (a-c)+(b-d)i

3、如何产生"上帝的指纹"?

当z的初始值固定时, 取不同的c, z的发散速度是不一样的, 例如某个c, 100次之后z就趋于无穷大, 某个c, 不管迭代多少次, z都在某个范围内跳动.

以一块白布为底图, 把c的坐标映射到这个二维白布中, 用颜色来标记该c值引起的z值发散速度, 越黑表示z值越不会被发散.

我们固定z0=0,那么对于不同的复数c,函数的迭代结果也不同。由于复数c对应平面上的点,因此我们可以用一个平面图形来表示,对于某个复数c,函数f(z)=z^2+cz0=0开始迭代是否会发散到无穷。我们同样用不同颜色来表示不同的发散速度,最后得出的就是Mandelbrot集分形图形:

先来个简单的, 训练一下c和z0固定时, 如何产生z的迭代值:

WITH RECURSIVE t(n, zr, zi, cr, ci) AS (      
    VALUES (1, 0::float8, 0::float8, 0.1::float8, 0.1::float8)      
  UNION ALL      
    SELECT n+1, zr*zr - zi*zi + cr, zr*zi + zi*zr + ci, cr, ci FROM t WHERE n < 100      
)      
SELECT n,zr,zi FROM t;
do language plpgsql $$    
declare    
  zr float8 := 0;    
  zi float8 := 0;    
  cr float8 := 0.1;    
  ci float8 := 0.1;    
  tmpr float8;    
  tmpi float8;    
begin    
  for i in 1..100 loop    
    raise notice '%, %i', zr, zi;    
    tmpr := zr*zr - zi*zi + cr;    
    tmpi := zr*zi + zi*zr + ci;    
    zr := tmpr;    
    zi := tmpi;    
  end loop;    
    raise notice '%, %i', zr, zi;    
end;    
$$;
NOTICE:  0, 0i  
NOTICE:  0.1, 0.1i  
NOTICE:  0.1, 0.12000000000000001i  
NOTICE:  0.0956, 0.12400000000000001i  
NOTICE:  0.09376336, 0.12370880000000001i  
NOTICE:  0.09348770048104961, 0.123198705499136i  
NOTICE:  0.0935620291045716, 0.12303512735871254i  
NOTICE:  0.09361621072599009, 0.12302283233364109i  
NOTICE:  0.09362937763530182, 0.12303386279170858i  
NOTICE:  0.093629128962925, 0.1230391680025096i  
NOTICE:  0.09362777692760627, 0.12304010025679593i  
NOTICE:  0.0936272943412032, 0.1230399421199872i  
...  
基本不发散, 所以这个 0.1,0.1i 的C对应复平面的坐标就用黑色的像素点表示.

把这个函数扩展到整个复数范围。对于复数z0=x+iy,取不同的x值和y值,函数迭代的结果不一样:

对于有些z0,函数值约束在某一范围内;

而对于另一些z0,函数值则发散到无穷。

由于复数对应平面上的点,因此我们可以用一个平面图形来表示,对于哪些z0函数值最终趋于无穷,对于哪些z0函数值最终不会趋于无穷。

我们用深灰色表示不会使函数值趋于无穷的z0;对于其它的z0,我们用不同的颜色来区别不同的发散速度。由于当某个时候|z|>2时,函数值一定发散,因此这里定义发散速度为:使|z|大于2的迭代次数越少,则发散速度越快。这个图形可以编程画出。

f(z)=z^2+(-0.75+0i)时的Julia集:

我们固定z0=0,那么对于不同的复数c,函数的迭代结果也不同。由于复数c对应平面上的点,因此我们可以用一个平面图形来表示,对于某个复数c,函数f(z)=z^2+c从z0=0开始迭代是否会发散到无穷。

我们同样用不同颜色来表示不同的发散速度,最后得出的就是Mandelbrot集分形图形(也就是上帝的指纹):

4、用PolarDB来生成"上帝的指纹":

do language plpgsql $$    
declare    
  zr numeric := 0.0;  -- z0r    
  zi numeric := 0.0;  -- z0i    
  tmpr numeric;    
  tmpi numeric;    
  i int;    
begin    
  <<label_x>>     
  for x in -300..300 loop  -- cr, 表示白布的x轴像素点范围是-300到300    
  <<label_y>>     
  for y in -200..200 loop  -- ci, 表示白布的y轴像素点范围是-200到200    
  <<label_i>>     
  for k in 1..200 loop  -- z的发散速度, i 表示颜色深度; 最多迭代200次, 200次就是黑色, 1次可能就接近白色.      
    tmpr := zr*zr - zi*zi + x::numeric/300.0::numeric;    
    tmpi := zr*zi + zi*zr + y::numeric/200.0::numeric;    
    zr := tmpr;    
    zi := tmpi;     
    i := k;    
    exit label_i when sqrt(zr*zr + zi*zi) > 2;    -- z的迭代次数截止于|z|>2, 因为此时z会无限发散.        
  end loop label_i ;    
  raise notice 'cr:%, ci:%, i:%', x, y, i;    
  zr := 0.0;  -- z0r    
  zi := 0.0;  -- z0i    
  end loop label_y ;    
  end loop label_x ;    
end;    
$$;

cr为x坐标,ci为y坐标,i为颜色深度:

NOTICE:  cr:-300, ci:-200, i:3    
NOTICE:  cr:-300, ci:-199, i:3    
NOTICE:  cr:-300, ci:-198, i:3    
NOTICE:  cr:-300, ci:-197, i:3    
NOTICE:  cr:-300, ci:-196, i:3    
NOTICE:  cr:-300, ci:-195, i:3    
NOTICE:  cr:-300, ci:-194, i:3    
NOTICE:  cr:-300, ci:-193, i:3    
NOTICE:  cr:-300, ci:-192, i:3    
NOTICE:  cr:-300, ci:-191, i:3    
NOTICE:  cr:-300, ci:-190, i:3    
NOTICE:  cr:-300, ci:-189, i:3    
NOTICE:  cr:-300, ci:-188, i:3    
NOTICE:  cr:-300, ci:-187, i:3    
NOTICE:  cr:-300, ci:-186, i:3    
NOTICE:  cr:-300, ci:-185, i:3    
NOTICE:  cr:-300, ci:-184, i:3    
NOTICE:  cr:-300, ci:-183, i:3    
NOTICE:  cr:-300, ci:-182, i:3    
NOTICE:  cr:-300, ci:-181, i:3    
NOTICE:  cr:-300, ci:-180, i:3    
NOTICE:  cr:-300, ci:-179, i:3    
NOTICE:  cr:-300, ci:-178, i:3    
NOTICE:  cr:-300, ci:-177, i:3    
NOTICE:  cr:-300, ci:-176, i:3    
NOTICE:  cr:-300, ci:-175, i:3    
NOTICE:  cr:-300, ci:-174, i:3    
NOTICE:  cr:-300, ci:-173, i:3    
NOTICE:  cr:-300, ci:-172, i:3    
NOTICE:  cr:-300, ci:-171, i:3    
NOTICE:  cr:-300, ci:-170, i:3    
NOTICE:  cr:-300, ci:-169, i:3    
NOTICE:  cr:-300, ci:-168, i:3    
NOTICE:  cr:-300, ci:-167, i:3    
NOTICE:  cr:-300, ci:-166, i:3    
NOTICE:  cr:-300, ci:-165, i:3    
NOTICE:  cr:-300, ci:-164, i:3    
NOTICE:  cr:-300, ci:-163, i:3    
NOTICE:  cr:-300, ci:-162, i:3    
NOTICE:  cr:-300, ci:-161, i:3    
NOTICE:  cr:-300, ci:-160, i:3    
NOTICE:  cr:-300, ci:-159, i:3    
NOTICE:  cr:-300, ci:-158, i:3    
NOTICE:  cr:-300, ci:-157, i:3    
NOTICE:  cr:-300, ci:-156, i:3    
NOTICE:  cr:-300, ci:-155, i:3    
NOTICE:  cr:-300, ci:-154, i:3    
NOTICE:  cr:-300, ci:-153, i:3    
NOTICE:  cr:-300, ci:-152, i:3    
NOTICE:  cr:-300, ci:-151, i:3    
NOTICE:  cr:-300, ci:-150, i:3    
NOTICE:  cr:-300, ci:-149, i:3    
NOTICE:  cr:-300, ci:-148, i:4    
NOTICE:  cr:-300, ci:-147, i:4    
NOTICE:  cr:-300, ci:-146, i:4    
NOTICE:  cr:-300, ci:-145, i:4    
NOTICE:  cr:-300, ci:-144, i:4    
NOTICE:  cr:-300, ci:-143, i:4    
NOTICE:  cr:-300, ci:-142, i:4    
NOTICE:  cr:-300, ci:-141, i:4    
NOTICE:  cr:-300, ci:-140, i:4    
NOTICE:  cr:-300, ci:-139, i:4    
NOTICE:  cr:-300, ci:-138, i:4    
NOTICE:  cr:-300, ci:-137, i:4    
NOTICE:  cr:-300, ci:-136, i:4    
NOTICE:  cr:-300, ci:-135, i:4    
NOTICE:  cr:-300, ci:-134, i:4    
NOTICE:  cr:-300, ci:-133, i:4    
NOTICE:  cr:-300, ci:-132, i:4    
NOTICE:  cr:-300, ci:-131, i:4    
NOTICE:  cr:-300, ci:-130, i:4    
NOTICE:  cr:-300, ci:-129, i:4    
NOTICE:  cr:-300, ci:-128, i:4    
NOTICE:  cr:-300, ci:-127, i:4    
NOTICE:  cr:-300, ci:-126, i:4    
NOTICE:  cr:-300, ci:-125, i:4    
NOTICE:  cr:-300, ci:-124, i:4    
NOTICE:  cr:-300, ci:-123, i:4    
NOTICE:  cr:-300, ci:-122, i:4    
NOTICE:  cr:-300, ci:-121, i:4    
NOTICE:  cr:-300, ci:-120, i:4    
NOTICE:  cr:-300, ci:-119, i:5    
NOTICE:  cr:-300, ci:-118, i:5    
NOTICE:  cr:-300, ci:-117, i:5    
NOTICE:  cr:-300, ci:-116, i:5    
NOTICE:  cr:-300, ci:-115, i:5    
NOTICE:  cr:-300, ci:-114, i:5    
NOTICE:  cr:-300, ci:-113, i:5    
NOTICE:  cr:-300, ci:-112, i:5    
NOTICE:  cr:-300, ci:-111, i:5    
NOTICE:  cr:-300, ci:-110, i:5    
NOTICE:  cr:-300, ci:-109, i:5    
NOTICE:  cr:-300, ci:-108, i:5    
NOTICE:  cr:-300, ci:-107, i:5    
NOTICE:  cr:-300, ci:-106, i:5    
NOTICE:  cr:-300, ci:-105, i:5    
NOTICE:  cr:-300, ci:-104, i:5    
NOTICE:  cr:-300, ci:-103, i:5    
NOTICE:  cr:-300, ci:-102, i:5    
NOTICE:  cr:-300, ci:-101, i:5    
NOTICE:  cr:-300, ci:-100, i:5    
NOTICE:  cr:-300, ci:-99, i:5    
NOTICE:  cr:-300, ci:-98, i:5    
NOTICE:  cr:-300, ci:-97, i:5    
NOTICE:  cr:-300, ci:-96, i:5    
NOTICE:  cr:-300, ci:-95, i:5    
NOTICE:  cr:-300, ci:-94, i:5    
NOTICE:  cr:-300, ci:-93, i:5    
NOTICE:  cr:-300, ci:-92, i:5    
NOTICE:  cr:-300, ci:-91, i:5    
NOTICE:  cr:-300, ci:-90, i:5    
NOTICE:  cr:-300, ci:-89, i:5    
NOTICE:  cr:-300, ci:-88, i:5    
NOTICE:  cr:-300, ci:-87, i:6    
NOTICE:  cr:-300, ci:-86, i:6    
NOTICE:  cr:-300, ci:-85, i:6    
NOTICE:  cr:-300, ci:-84, i:6    
NOTICE:  cr:-300, ci:-83, i:6    
NOTICE:  cr:-300, ci:-82, i:7    
NOTICE:  cr:-300, ci:-81, i:7    
NOTICE:  cr:-300, ci:-80, i:7    
NOTICE:  cr:-300, ci:-79, i:8    
NOTICE:  cr:-300, ci:-78, i:8    
NOTICE:  cr:-300, ci:-77, i:8    
NOTICE:  cr:-300, ci:-76, i:8    
NOTICE:  cr:-300, ci:-75, i:8    
NOTICE:  cr:-300, ci:-74, i:9    
NOTICE:  cr:-300, ci:-73, i:9    
NOTICE:  cr:-300, ci:-72, i:10    
NOTICE:  cr:-300, ci:-71, i:10    
NOTICE:  cr:-300, ci:-70, i:10    
NOTICE:  cr:-300, ci:-69, i:10    
NOTICE:  cr:-300, ci:-68, i:11    
NOTICE:  cr:-300, ci:-67, i:11    
NOTICE:  cr:-300, ci:-66, i:12    
NOTICE:  cr:-300, ci:-65, i:13    
NOTICE:  cr:-300, ci:-64, i:15    
NOTICE:  cr:-300, ci:-63, i:18    
NOTICE:  cr:-300, ci:-62, i:23    
NOTICE:  cr:-300, ci:-61, i:37    
NOTICE:  cr:-300, ci:-60, i:35    
NOTICE:  cr:-300, ci:-59, i:34    
NOTICE:  cr:-300, ci:-58, i:59    
NOTICE:  cr:-300, ci:-57, i:200    
NOTICE:  cr:-300, ci:-56, i:200    
.....

类似的: 固定c (f(z)=z^2+(-0.75+0i)), 取不同的z0值作为起点, 看z的发散速度, 绘制不同z0的二维平面图, 颜色深浅对应z的发散速度, 可以得到julia集合.

参考

http://www.matrix67.com/blog/archives/4570

http://www.matrix67.com/blog/archives/6231

https://www.cnblogs.com/anderslly/archive/2008/10/10/mandelbrot-set-by-fsharp.html

http://www.matrix67.com/blog/archives/292

https://www.eefocus.com/e/500748

分形艺术网: http://www.fxysw.com/

https://zhuanlan.zhihu.com/p/450061289

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
关系型数据库 分布式数据库 数据库
沉浸式学习PostgreSQL|PolarDB 8: 电商|短视频|新闻|内容推荐业务(根据用户行为推荐相似内容)、监控预测报警系统(基于相似指标预判告警)、音视图文多媒体相似搜索、人脸|指纹识别|比对 - 向量搜索应用
1、在电商业务中, 用户浏览商品的行为会构成一组用户在某个时间段的特征, 这个特征可以用向量来表达(多维浮点数组), 同时商品、店铺也可以用向量来表达它的特征. 那么为了提升用户的浏览体验(快速找到用户想要购买的商品), 可以根据用户向量在商品和店铺向量中进行相似度匹配搜索. 按相似度来推荐商品和店铺给用户. 2、在短视频业务中, 用户浏览视频的行为, 构成了这个用户在某个时间段的兴趣特征, 这个特征可以用向量来表达(多维浮点数组), 同时短视频也可以用向量来表达它的特征. 那么为了提升用户的观感体验(推荐他想看的视频), 可以在短视频向量中进行与用户特征向量的相似度搜索.
328 0
|
3月前
|
关系型数据库 MySQL 分布式数据库
零基础教你用云数据库PolarDB搭建企业网站,完成就送桌面收纳桶!
零基础教你用云数据库PolarDB搭建企业网站,完成就送桌面收纳桶,邀请好友完成更有机会获得​小米Watch S3、小米体重称​等诸多好礼!
零基础教你用云数据库PolarDB搭建企业网站,完成就送桌面收纳桶!
|
4月前
|
关系型数据库 MySQL Serverless
探索PolarDB MySQL版:Serverless数据库的灵活性与性能
本文介绍了个人开发者对阿里云PolarDB MySQL版,特别是其Serverless特性的详细评测体验。评测涵盖了产品初体验、性能观测、Serverless特性深度评测及成本效益分析等方面。尽管试用过程中遇到一些小问题,但总体而言,PolarDB MySQL版表现出色,提供了高性能、高可用性和灵活的资源管理,是个人开发者和企业用户的优秀选择。
|
5月前
|
关系型数据库 MySQL 分布式数据库
PolarDB 与传统数据库的性能对比分析
【8月更文第27天】随着云计算技术的发展,越来越多的企业开始将数据管理和存储迁移到云端。阿里云的 PolarDB 作为一款兼容 MySQL 和 PostgreSQL 的关系型数据库服务,提供了高性能、高可用和弹性伸缩的能力。本文将从不同角度对比 PolarDB 与本地部署的传统数据库(如 MySQL、PostgreSQL)在性能上的差异。
344 1
|
9天前
|
NoSQL 关系型数据库 分布式数据库
基于PolarDB的图分析:通过DTS将其它数据库的数据表同步到PolarDB的图
本文介绍了使用DTS任务将数据从MySQL等数据源实时同步到PolarDB-PG的图数据库中的步骤.
|
12天前
|
SQL 关系型数据库 分布式数据库
夺冠在即 | PolarDB数据库创新设计赛(天池杯)决赛答辩通知
2024年全国大学生计算机系统能力大赛PolarDB数据库创新设计赛(天池杯)于8月21日启动,吸引了200多所高校近千支队伍参赛。经过激烈角逐,60支队伍晋级决赛第一阶段,36支队伍脱颖而出进入现场答辩,将于12月29日在武汉大学争夺最终奖项。决赛要求选手基于PolarDB-PG开源代码部署集群并优化TPCH查询性能。完赛率超90%,成绩表现出明显梯度,前20名均在500秒内完成。评委来自学术界和工业界,确保评选公正。预祝选手们取得优异成绩!
|
27天前
|
Cloud Native 关系型数据库 分布式数据库
PolarDB 分布式版 V2.0,安全可靠的集中分布式一体化数据库管理软件
阿里云PolarDB数据库管理软件(分布式版)V2.0 ,安全可靠的集中分布式一体化数据库管理软件。
|
9天前
|
NoSQL 关系型数据库 分布式数据库
PolarDB图数据库快速入门
图数据库(Graph Database)专门存储图数据,适合处理社交网络、知识图谱等复杂关系。它使用图查询语言(如Cypher、Gremlin)进行操作。PolarDB兼容OpenCypher语法,支持创建、查询、更新和删除图数据,包括模式匹配、过滤、MERGE避免重复、可视化工具等功能,简化了图数据的管理和应用。
|
2月前
|
关系型数据库 分布式数据库 数据库
锦鲤附体 | PolarDB数据库创新设计赛,好礼不停!
锦鲤附体 | PolarDB数据库创新设计赛,好礼不停!

热门文章

最新文章

相关产品

  • 云原生数据库 PolarDB