对比python学julia(第二章)--(第三节)玫瑰曲线—数学之美
3.1.问题描述
在数学世界中有一些美丽的曲线图形,有螺旋线、摆线、双纽线、蔓叶线且、心脏线、渐开线、玫瑰曲线、蝴蝶曲线…… 这些形状各异、简有繁别的数学曲线图形为看似枯燥的数学公式披上精彩纷呈的美丽衣裳。
在数学曲线的百花园中,玫瑰曲线算得上个中翘楚,它的数学方程简单,曲线变化众多,根据参数的变化能展现出姿态万千的优美形状。玫瑰曲线可用极坐标方程表示为

图一、三叶玫瑰曲线
3.2.问题描述
在数学世界中,像玫瑰曲线这样美丽的曲线图形实际上是由简单的函数关系生成的。通过利用曲线函数的参数方程,可以在平面直角坐标系中方便地绘制出它们的图形。
假如要利用玫瑰曲线的参数方程绘制三叶玫瑰曲线,则参数n的值可以设定为3,参数a的值可以设定叶子的长度(如 100)。因为参数 n=3 是奇数,所以三叶玫瑰曲线的闭合周期为π。 只要将参数 θ从0变化到 π,就能利用玫瑰曲线的参数方程求出平面内的一系列连续的点的坐标(x,y),由此可构成三叶玫瑰曲线的图形。
绘制玫瑰曲线的编程思路: 在一个循环结构中让参数 θ从 0 变化到π,再利用玫瑰曲线的参数方程求出点坐标x和y的值,并通过海龟绘图库绘制一系列连续的点,最终绘制出一个完整的玫瑰曲线图。
3.3.编程解题
根据上述算法分析中给出的编程思路,编程绘制玫瑰曲线的图形。这个案例需要用到海龟绘图的知识.,请回顾上一节介绍的海龟绘图方法。
首先我们来看Python的代码:
1 '''
2 程序:绘制玫瑰曲线
3 作者:苏秦@小海豚科学馆公众号
4 来源:图书《Python趣味编程:从入门到人工智能》
5 '''
6 from turtle import *
7 from math import *
8
9 def draw(a, n, end):
10 '''绘制玫瑰曲线'''
11 t = 0
12 while t <= end:
13 x = a * sin(n * t) * cos(t)
14 y = a * sin(n * t) * sin(t)
15 goto(x, y)
16 t = t + 0.01
17
18 if __name__ == '__main__':
19 '''三叶玫瑰'''
20 draw(100, 3, 3.14)
21 '''六叶玫瑰'''
22 #draw(100, 1.5, 12.56)
在上面的代码中可以看出,Python除了要导入海龟绘图库外,还要导入数学库,因为玫瑰曲线函数中涉及三角函数,需要用到 Python 内置的数学库。
用于绘制玫瑰曲线的 draw()函数有3个参数,其中参数变量 a 表示叶子的长度,参数变量 n 表示叶子的数量,参数变量 end 表示曲线闭合周期。
在函数体中,通过 while 循环结构画出一系列连续的点,循环变量为t,循环控制条件为 t <= end,即在从 0 到 end 的范围内绘制一个闭合的玫瑰曲线。
在循环体中,使用玫瑰曲线的参数方程求出点坐标 x 和 y 的值,再利用海龟绘图库提供的 goto(x,y)函数定位画笔就能绘制出相应的图形。 为了绘制出平滑的曲线,循环变量t每次以0.01 的幅度增加。
上面代码中的main函数中“三页玫瑰”的代码调用 draw()绘制出一个叶子长度为 100 的三叶玫瑰曲线。由于叶子数3是奇数,所以闭合周期为π ,这里选取 3.14 即可。它绘出的图形如下:
然而“六叶玫瑰”的参数n=1.5,end=12.56,这又是怎么得来的呢?下面我们来讨论玫瑰线参数的特性。
当在整数范围内讨论参数n时,玫瑰曲线的参数特性:若n为奇数,则玫瑰曲线n个叶子数,闭合周期为π,即θ取值为0~ π;若n为偶数,玫瑰曲线2n个叶子数,闭合周期为2π ,即θ取值为 0~2π。
当在有理数范围内讨论参数n时,可利用公式 确定玫瑰曲线的叶子数和闭合周期。n为非整数的有理数,L/W为简约分数,参数L控制叶子数,参数W控制闭合周期。玫瑰曲线的参数特性:当参数L和W仅有一个是偶数时,则闭合周期为2Wπ,叶子数为2L;当参数L和W都是奇数时,则闭合周期为Wπ ,叶子数为L。
在下图中展示的是玫瑰曲线 7 代图谱,位于顶端的数字表示参数 L 的值,位于左端的数字表示参数W 的值,通过选择 L 和W 的值,就能确定玫瑰曲线的图形。
所以,当 L=3、W=2 时,则n=1.5,闭合周期为 2Wπ =12.56。 根据这两个参数就可以绘制出六叶玫瑰曲线图形。如下图:
好了,我们已经知道了绘制玫瑰曲线的原理,转换为Julia语言来实现相比也不困难。
当然还是要请出Julia的海龟绘图库Luxor,在上一节中已有介绍。不过,笔者在Luxor中没有找到类似Python海龟绘图库turtle中的goto()函数,所以只能自主实现了自定义函数Goto()。
完整代码如下:
1 """
2 程序:Julia绘制玫瑰曲线
3 Python原作者:苏秦@小海豚科学馆公众号
4 来源:图书《Python趣味编程:从入门到人工智能》
5 """
6
7 using Luxor
8
9 #实现海龟画线,从原坐标点到目标坐标点
10 function Goto(t::Turtle,p::Point)
11 oldx, oldy = t.xpos, t.ypos
12 t.xpos=p.x
13 t.ypos=p.y
14 if t.pendown
15 gsave()
16 sethue(t.pencolor...)
17 line(Point(oldx, oldy), Point(t.xpos, t.ypos), :stroke)
18 grestore()
19 end
20 end
21
22 #绘制玫瑰曲线'''
23 function draw(t::Turtle,a, n, stop)
24 s = 0
25 while s <= stop
26 x = a * sin(n * s) * cos(s)
27 y = a * sin(n * s) * sin(s)
28 Goto(t,Point(x,y))
29 s = s + 0.01
30 end
31 end
32 function main()
33 Drawing(300, 300, "mgqx.svg")
34 origin()
35 turtle=Turtle()
36 #三叶玫瑰曲线
37 draw(turtle,100, 3, 3.14)
38 finish()
39 end
40 main()
绘制的三叶玫瑰图如下:
可以发现,上图与Python绘制的三叶玫瑰曲线上下颠倒了,当然这关系不大,只能说明Luxor的海龟与Python的turtle移动方向是相反的。
- 扩展阅读
在用海龟绘图库实现绘制玫瑰曲线之后,我们并不打算就此停步。因为原书作者是用参数方方程作为编程的数学模型:
{x=a∗sinnθ∗cosθy=a∗sinnθ∗sinθ
而我们打算回归玫瑰曲线的极坐标方程:
ρ=a∗sinθ
而且,无论是Python还是Julia都有丰富的科学计算和数据可视化绘图库,相比于海龟绘图库更加高效。因此我们用极坐标方程作为数学模型,并采用其它可视化库来看看如何绘制玫瑰曲线。
经过这么些年的发展,Julia的绘图库也日渐丰富,比较常用的有Gadfly, Plots, PyPlot库等,大家可以在下面的网址查看这些库的说明:https://juliapackages.com/c/graphics。
本文选用PyPlot.jl库来实现绘制玫瑰曲线。PyPlot库实际上是一个经典的Python绘图库Matplotlib的一个模块,PyPlot.jl提供了一个接口用于调用Matplotlib.PyPlot模块,所以在使用它之前需要先安装matplotlib:
方法一,使用pip安装matplotlib
pip install matplotlib
方法二,使用pip安装光速安装matplotlib如果安装太慢,可替换国内的下载源
pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
然后我们用之前介绍的Julia的库安装方法来安装PyPlot.jl库,或者直接在Julia终端环境输入using PyPlot,然后根据提示操作即可。
所谓玫瑰曲线就是在平面内,围绕某一中心点平均分布整数个正弦花瓣的曲线,在极坐标下可表示为ρ=a*sin(nθ),a为定长,n为整数,来看完整代码:
1 using PyPlot
2 function draw()
3 theta=0:0.01:2*pi
4 #上面返回一个array对象,其元素从0-2*pi,步长0.01
5 subplot(111,polar=true) #设置为极坐标模式
6 #6瓣花瓣
7 plot(theta,sin.(6*theta),linewidth=2.0, linestyle="-")
8 #5瓣花瓣
9 plot(theta,sin.(5*theta),linewidth=2.0, linestyle="--")
10 #4瓣花瓣
11 plot(theta,2*sin.(4*theta),linewidth=2)
12 rgrids((0.5:0.5:2),angle=45) #网格线
13 thetagrids([0,45,90])#角度值
14 show()
15 end
16 draw()
运行后,会打开一个图形窗口,显示所画的图形:
怎么样,是不是很漂亮!
对比python学julia(第二章)--(第三节)玫瑰曲线—数学之美的更多相关文章
- 《零压力学Python》 之 第二章知识点归纳
第二章(数字)知识点归纳 要生成非常大的数字,最简单的办法是使用幂运算符,它由两个星号( ** )组成. 如: 在Python中,整数是绝对精确的,这意味着不管它多大,加上1后都将得到一个新的值.你将 ...
- 路飞学城-Python爬虫集训-第二章
本次爬虫集训的第二次作业是web微信. 先贴一下任务: 作业中使用到了Flask. Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模 ...
- 《python可以这样学》第二章
Python序列 列表与列表推导式 列表创建与删除 创建列表对象 >>> a_list = list((3, 5, 7, 9, 11)) >>> a_list = ...
- Python开发【第二章】:Python模块和运算符
一.模块初识: Python有大量的模块,从而使得开发Python程序非常简洁.类库有包括三中: Python内部提供的模块 业内开源的模块 程序员自己开发的模块 1.Python内部提供一个 sys ...
- python基础教程-第二章-列表和元组
本章将引入一个新的概念,:数据结构.数据结构是通过某种方式(例如对元素进行编号)组织在 一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其他数据结构.在python中,最基本的数据结构 ...
- Python开发【第二章】:模块和运算符
一.模块初识: Python有大量的模块,从而使得开发Python程序非常简洁.类库有包括三中: Python内部提供的模块 业内开源的模块 程序员自己开发的模块 1.Python内部提供一个 sys ...
- python学习心得第二章
python基础 1.关于python编码的问题. python的编码现在主要是两种版本python2.7和python3.5 python2.7默认的是ascii码进行编译,我们可以采用 # -*- ...
- Python开发【第二章】:Python深浅拷贝剖析
Python深浅拷贝剖析 Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果. 下面本文就通过简单的例子介绍一下这些概念之间的差别. 一.对象赋值 ...
- Python开发【第二章】:Python的数据类型
基本数据类型 一.整型 如: 18.73.84 整型具备如下功能: class int(object): """ int(x=0) -> int or long i ...
- Python之旅.第二章数据类型 3.19/3.20/3.21/3.22/3.23
一.数字类型 1.int类型: 基本使用: 用途:用于年龄,手机号,身份证号: 定义: age=18: 常用操作+内置方法: 正常的运算赋值: 进制转换: print(bin(3)); 把十进制3转换 ...
随机推荐
- MySQL创建表的时候建立联合索引的方法
1.MySQL创建表建立联合索引的步骤 在MySQL中,联合索引(也称为复合索引或多列索引)是基于表中的多个列创建的索引.这种索引可以提高多列查询的性能,特别是当查询条件涉及这些列时.下面是一个详细的 ...
- Mysql 创建索引语句
mysql有哪些索引 index 普通索引 alter table table_name add index index_name(column) 最基本的索引,没有任何限制 primary key ...
- minos 0 前(废)言(话)
- 首发公号:Rand_cs minos 0 前(废)言(话) 从今天开始开启一个新的系列,讲述虚拟化的那些事儿.时隔上次发文又隔了好几个月了,主要是平时工作比较忙,没太多时间精力维护博客之类的. 前 ...
- 借助 DSL 来简化 Loadgen 配置
引言 在上篇文章中,我们介绍了如何用 Loadgen 来简化 HTTP API 的集成测试.在实际使用中会发现,编写测试时最令人"头疼"的部分是设计测试的输入和校验程序的输出,而针 ...
- 请写出常用的linux指令
a.cd /home 进入 '/ home' 目录' b.cd .. 返回上一级目录 c.cd ../.. 返回上两级目录 d.mkdir dir1 创建一个叫做 'dir1' 的目录' e.mkdi ...
- 洛谷 P1226 快速幂
题目链接:快速幂 思路 简单快速幂模板.a ^ 17 = (a ^ 2) ^ 8 * a,此时pow()中的y就可以视为17 -> 8(y >>= 1),pow()中的x就是底数a ...
- 35个Redis企业级性能优化点与解决方案
Redis作为企业级应用中广泛使用的高性能键值存储数据库,其性能优化是一个复杂且多面的话题.以下是V 哥整理的一些关键的优化点和相应的解决方案,提供给兄弟们参考. Redis的性能优化涉及到硬件选择. ...
- ODPS 不用循环生成连续日期
生成 20230801 ~ 20230831之间的每一天的sql代码怎么写? 只要一行代码. 一行代码: select TO_CHAR(DATEADD(TO_DATE(bizdate,'yyyymmd ...
- Linux内核:regmap机制
背景 在学习SPI框架的时候,看到了有一个rtc驱动用到了regmap,本想通过传统方式访问spi接口的我,突然有点不适应,翻了整个驱动,愣是没有找到读写spi的范式:因此了解了regmap以后,才发 ...
- Linux 内核:设备树(1)dtb格式
Linux 内核:设备树(1)dtb格式 背景 dtb作为二进制文件被加载到内存中,然后由内核读取并进行解析,如果对dtb文件的格式不了解,那么在看设备树解析相关的内核代码时将会寸步难行,而阅读源代码 ...