使用python绘制任意函数图像

使用python绘制任意函数图像
##原创文章不易,望点赞转发收藏三连

效果展示

使用python绘制任意函数图像_第1张图片

y = (sinx)/x
使用python绘制任意函数图像_第2张图片
y = x4+x3+x^2+1
使用python绘制任意函数图像_第3张图片
使用python绘制任意函数图像_第4张图片

y=-x^2

文末还会展示一些实例图片

引入需要的库

我们使用如下库

import turtle as t
import math 

这两个库的用法也是本项目的核心
其中基本语法不再赘述
大家可以网络搜索

核心算法

我们假设像素点为坐标点,通过goto(x,y)与y,x的函数关系进行找点
通过penup().pendown()连接个点,视觉上像素点的连线几乎为曲线
当然,可以通过仅仅画点保证准确度

绘画坐标系

坐标系的绘制不是难事,就是麻烦,我已经经过尝试,给出以下数据,方便大家使用

t.screensize(800,800,"white")
t.hideturtle()
t.speed(0)
t.pendown()
t.goto(0,0)
t.forward(800)
t.left(90)
t.goto(0,0)
t.forward(800)
t.left(90)
t.goto(0,0)
t.forward(800)
t.left(90)
t.goto(0,0)
t.forward(800)
t.left(90)
t.penup()
t.goto(-10,-15)
t.write("O")
t.goto(350,-15)
t.write("x")
t.goto(-15,337)
t.write("y")

基本设置

我们再画图像之前要初始化x的位置,避免画到画布外,否则会报错
之后处理y时,也要注意这一点
另外,可以设置曲线粗细和绘画速度
粗细1–>n变粗
速度1–>10->0变快

n = int(input(r"输入需要放大的倍数:"))
x = int((-350)/n)
t.pensize(1)
t.speed(10)
while pass:
    pass

处理函数关系

首先两个确定:
1.确定函数解析式,要符合python语法
2.确定定义域的补集合
然后避免两点:
1.避免x的取值超出定义域,出现MATHS ERROR
2.避免y超出范围,导致ERROE
再注意两个近似:
1.可以每个点向前画一个坐标,近似于点
2.pendown()下的goto()连接点,近似于曲线
还有两个选择:
1.penup()的注释取消后,将t.penup()加入代码,可以之画点不连线
2.math库可以丰富函数类型

while x <= int((350)/n):
    if x!=0:                  #定义域的反域
        y = m.sin(x)/x        #函数解析式
    if y>=-350 and y<=350:
        t.goto(n*x,y*n)
        t.pendown()
        t.forward(1)
        #t.penup()
    x+=1

如果实在不清楚定义域或者表示起来不方便
也可以采用try-except结构自动处理

while pass:
	try:
		y = math.sin(x)/x
	except:
		#break
		pass        ###根据需要选择,建议直接pass
	pass

最后别忘了title库结尾的title.done()

展示源代码

import turtle as t
import math as m 
t.screensize(800,800,"white")
t.hideturtle()
t.speed(0)
t.pendown()
t.goto(0,0)
t.forward(800)
t.left(90)
t.goto(0,0)
t.forward(800)
t.left(90)
t.goto(0,0)
t.forward(800)
t.left(90)
t.goto(0,0)
t.forward(800)
t.left(90)
t.penup()
t.goto(-10,-15)
t.write("O")
t.goto(350,-15)
t.write("x")
t.goto(-15,337)
t.write("y")

n = int(input(r"输入需要放大的倍数:"))
x = int((-350)/n)
t.pensize(1)
t.speed(10)
while x <= int((350)/n):
    if x!=0:                  #定义域的反域
        y = m.sin(x)/x        #函数解析式
    if y>=-350 and y<=350:
        t.goto(n*x,y*n)
        t.pendown()
        t.forward(1)
        #t.penup()
    x+=1
t.down()

图片展示

使用python绘制任意函数图像_第5张图片

双曲正弦
使用python绘制任意函数图像_第6张图片

双曲余弦
使用python绘制任意函数图像_第7张图片

双曲正切(原点附近)
使用python绘制任意函数图像_第8张图片
正弦
使用python绘制任意函数图像_第9张图片

余弦

你可能感兴趣的:(算法,python,线性代数,抽象代数)