对比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转换 ...
随机推荐
- 阿里云入选Gartner「边缘分发平台市场指南」代表厂商
近日,全球技术研究与咨询机构Gartner首次发布边缘分发平台市场指南报告<Market Guide for Edge Distribution Platforms>,阿里云凭借内容分发网 ...
- Linux网络驱动
1 简介 1.1 硬件说明 嵌入式网络硬件分为:MAC和PHY.MAC一般时SOC内置,PHY是外部器件. (1)SOC内部没有MAC 如果SOC内部没有网络MAC外设,可使用外置的MAC,一般外置的 ...
- pandas基础--数据结构:DataFrame
从本文开始介绍pandas的相关知识. pandas含有是数据分析工作变得更快更简单的高级数据结构和操作工具,是基于numpy构建的. 本章节的代码引入pandas约定为:import pandas ...
- 在 TypeScript 中,extends
extends 是一个关键字,用于指定类型参数的约束.它在类型参数的声明中使用,以确保类型参数满足特定的条件. 具体来说,extends 后面可以跟随一个类型,表示类型参数必须是该类型的子类型.在泛型 ...
- 关于使用Gitlab CI-CD
关于使用 Gitlab CI/CD 如果是个人建议自己写脚本,手动运行,而不是使用 Gitlab CI/CD. 免费的 Runner 需要 Credit Card!
- 腾讯视频遇到“前设备播放4K可能引发卡顿等异常,建议降低清晰度”
腾讯视频遇到"前设备播放4K可能引发卡顿等异常,建议降低清晰度". 解决方法: 在菜单-设置-播放设置-勾选"开启硬件加速"-应用,然后退出腾讯视频,重新打开腾 ...
- web框架及Django简介
WEB框架 Web框架是一种开发框架,用来支持动态网站.网络应用和网络服务的开发.这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方法. web框架已经实现了很多功能 ...
- element-ui 合并行或列 table :span-method(行合并)
element-ui 官网案例:table合并行或列 element-ui官网中关于行合并的例子是根据行号进行合并的,这显然不符合我们日常开发需求,因为通常我们table中的数据都是动态生成的,所以需 ...
- Niagara 物联网技术基础应用(文章修复中,不定时更新)
新手指南 前言 鉴于市面上有关Niagara物联网技术资料较少,笔者结合自生参加竞赛的经历编写此指南,该指南旨在让新手快速上手Niagara workbench 主要分以下几个模块讲解: 物联网软件平 ...
- 你不知道的 CSS 之包含块
你不知道的 CSS 之包含块 一说到 CSS 盒模型,这是很多小伙伴耳熟能详的知识,甚至有的小伙伴还能说出 border-box 和 content-box 这两种盒模型的区别. 但是一说到 CSS ...