作者简介:85后一名分析化学工作者及科学爱好者,深爱著北京的老北京人,爱好运动,科学,旅行,本文作者的个人微信公众号《科学是什么东东》,欢迎关注!

在这一专题中,我们将更贴近实际应用:函数的动态图形化,我们可以将其应用在示波器中,在软体上就可以模拟示波器的电压随时间变化的波形图(效果如下):

y=sinx的示波器模拟

我们需要著手设计程序,可实现的功能为:

允许用户输入x,y轴的正负半轴的长度值,x,y,z轴和主标题的标签名称(英文)。

同时我们需要构建需要图形化的函数,为了使其变为动画,我们将使用matplotlib中的animation功能(动画)

最终效果:生成动态视图,显示x,y轴名称及主标题。

在图形显示窗口,我们可以通过滑鼠操作改变视角,缩放图形,也可保存视图。

主程序代码如下:

主要步骤解析为#后面的部分

#分别导入numpy函数模块,matplotlib库模块,animation动画模块以及time模块

import numpy as np

import matplotlib.pyplot as plt

import matplotlib.animation as animation

import time

#以下为输入部分,主要输入部分为x,y正负半轴长度

主函数y=n1*sin(n2*(x-n3*i)^n4)中各个系数的值

print("Welcome to use animation graphic fitting generator, the formula model is y=n1*sin(n2*(x-n3*i)^n4).
")

print("n1,n2 are coefficient. n3 is X-axis transformation coefficient,the range is 0 ~ 1, the larger of the coefficient, the faster of animation will be.")

print("n4 is the power number.
")

a1=input("please enter x negative axis length value(absolute value):
")

a1=float(a1)

a2=input("please enter x postive axis length value:
")

a2=float(a2)

print("The x axis actual display range is from - "+str(a1)+" to "+str(a2)+":
")

a3=input("please enter y negative axis length value(absolute value):
")

a3=float(a3)

a4=input("please enter y postive axis length value:
")

a4=float(a4)

print("The y axis actual display range is from - "+str(a3)+" to "+str(a4)+":
")

a5=input("please enter n1 value:
")

a5=float(a5)

a6=input("please enter n2 value:
")

a6=float(a6)

a7=input("please enter n3 value:
")

a7=float(a7)

a8=input("please enter n4 value:
")

a8=float(a8)

print("The n1,n2,n3,n4 values are "+str(a5)+" , "+str(a6)+" , "+str(a7)+" , "+str(a8)+".
")

#构建图形,x,y轴的坐标范围以刚输入的值为准

其中lw是图形的线宽,color代表颜色

fig = plt.figure()

ax = plt.axes(xlim=(-a1, a2), ylim=(-a3, a4))

line, = ax.plot([], [], lw=4,color=red)

#这里定义2个函数,分别获取数据,以及定义x,y的显示,在输入y时,我们将需要拟合的函数加入,其中:

a5,a6分别为系数,a7为x轴的位移,是按照x-a7*i计算的,因此a7设定越大,函数在x轴的位移越快,一般建议设定1以下

a8为次方数

注意冒号后一定要首行缩进

def init():

line.set_data([], [])

return line,

def animate(i):

x = np.linspace(-a1, a2, 1000)

y= a5*(np.sin(a6* ((x - a7 * i)**a8)))

line.set_data(x, y)

return line,

#这里大家应该比较熟悉了,允许输入x,y轴标题及主标题,以及定义字型大小大小

x1=input("please enter x label name:
")

x2=input("please enter y label name:
")

x3=input("please enter title label name:
")

ax.set_xlabel(x1,fontsize=20)

ax.set_ylabel(x2,fontsize=20)

ax.set_title(x3,fontsize=25)

#最后一步,生成动画视图,定义帧数,间隔等

anim = animation.FuncAnimation(fig, animate, init_func=init, frames=200, interval=20, blit=True)

plt.show()

同理,对于函数主体,我们也可以加入重复绘图的命令:

在导入各种库的命令之后,加入(这里不需要首行缩进)

while True:

结尾处加入(注意全部需要首行缩进,break在if语句后进行首行缩进)

keep_testing=input("continuepainting?")

if keep_testing==n:

break

中间的全部命令也要首行缩进

这样就可以在图形关闭后,系统会自动提示是否再次画图,按n后结束程序

动态函数,不光可以应用在示波器模拟中,也可以在数学或教学领域中得到很好的拓展和应用:

我们来比较几种函数的动态图形:

y=sin(2x)

y=2sinx

y=3sin(2x)

y=sin(x^2)

讲到这里,本期的内容就告一段落了,脚本编辑是开放式设计,可以进行很多改造,让程序段更完善。

本文作者的个人微信公众号《科学是什么东东》,欢迎关注!


推荐阅读:
相关文章