制造一个圆形飞轮

 这是两个用于绘制圆形轨迹的 Python 代码示例。它们使用了 numpy、matplotlib 和 ipywidgets 库。代码的目的是根据给定的频率和时间参数,在复平面上绘制圆形轨迹,并使用滑动条实时调整这些参数。下面分别对两个示例进行详细解释。

第一个示例:

导入所需库:numpy、matplotlib、ipywidgets 和 IPython.display。
定义一个名为 draw_circle 的函数,该函数将绘制圆形轨迹。它接受两个参数:频率(f)和时间(t)。
在该函数内部,设置采样率(srate),并根据采样率生成等间隔的时间点。
计算复平面上的圆形轨迹点,然后用 plot 函数绘制平滑的细线条。
添加一个红点,表示圆形轨迹上的最后一个点。
设置坐标轴比例、范围和网格线,然后显示图像。
创建两个滑动条,用于调整频率和时间参数。
使用 ipywidgets.interact 函数将滑动条与 draw_circle 函数关联,实现实时调整。

import numpy as np
import matplotlib.pyplot as plt
import ipywidgets
from IPython.display import clear_output, display
import math


# 定义绘制圆形轨迹的函数
def draw_circle(f, t):
    srate = 1000  # 设置采样率
    t = np.linspace(0, t, srate)  # 根据采样率在时间范围内生成等间隔的点
    
    # 根据频率 f 和时间 t,计算复平面上的圆形轨迹点
    p = np.exp(-1j * 2 * math.pi * f * t)
    
    # 绘制平滑的细线条
    plt.plot(np.real(p), np.imag(p), linewidth=1)
    
    # 添加红点领导
    red_dot = p[-1]  # 获取最后一个点作为红点
    plt.plot(np.real(red_dot), np.imag(red_dot), "ro")
    
    plt.axis('square')  # 设置坐标轴比例相等
    plt.axis([-2, 2, -2, 2])
    plt.grid()  # 显示网格线
    plt.show()  # 显示图像

# 调节画圆的频率从0.1hz上升到2hz,每次调节改变0.01hz
srate = ipywidgets.IntSlider(
    min=1, max=1000, step=1, value=1000, 
    description='采样率',
    continuous_update=True)

# 创建一个滑动条,用于调节画圆的频率,范围从 0.1 Hz 到 2 Hz,步长为 0.01 Hz
f = ipywidgets.FloatSlider(
    min=0.1, max=2, step=0.01, value=0.5, 
    description='频率(Hz)',
    continuous_update=True)

# 创建一个滑动条,用于调节画圆的总时间,范围从 0 秒到 10 秒,步长为 0.1 秒
t = ipywidgets.FloatSlider(
    min=0, max=10, step=0.1, value=0, 
    description='时间(秒)',
    continuous_update=True)

# 使用 ipywidgets 的交互功能,将滑动条与绘制圆形轨迹的函数关联
ipywidgets.interact(draw_circle, t=t, f=f)



第二个示例:

在导入库和初始化画布后,定义一个名为 draw_circle 的函数,该函数与第一个示例中的函数类似,但有一些差异。
在函数内部,先清除轴上的内容,然后设置轴的范围和比例。
使用 ax.plot 函数绘制圆形轨迹,然后添加一个红点。
使用 clear_output 和 display 函数来清除输出并显示新图像。
创建滑动条和 ipywidgets.interact 函数与第一个示例相同。

#另一种可能

import numpy as np
import matplotlib.pyplot as plt
import ipywidgets
from IPython.display import clear_output, display
import math

# 初始化画布
fig, ax = plt.subplots()
plt.close(fig)

# 定义绘制圆形轨迹的函数
def draw_circle(f, t):
    srate = 100  # 设置采样率
    t = np.linspace(0, t, srate)  # 根据采样率在时间范围内生成等间隔的点
    
    # 根据频率 f 和时间 t,计算复平面上的圆形轨迹点
    p = np.exp(-1j * 2 * math.pi * f * t)
    
    ax.clear()  # 清除轴上的内容
    ax.set_xlim(-2, 2)
    ax.set_ylim(-2, 2)
    ax.axis('equal')  # 修改为 'equal'
    ax.grid()
    
    # 绘制平滑的细线条
    ax.plot(np.real(p), np.imag(p), linewidth=1)
    
    # 添加红点领导
    red_dot = p[-1]  # 获取最后一个点作为红点
    ax.plot(np.real(red_dot), np.imag(red_dot), "ro")

    clear_output(wait=True)  # 清除输出,以便显示新图像
    display(fig)  # 显示图像

# 创建一个滑动条,用于调节画圆的频率,范围从 0.1 Hz 到 2 Hz,步长为 0.01 Hz
f = ipywidgets.FloatSlider(
    min=0.1, max=2, step=0.01, value=0.5, 
    description='频率(Hz)',
    continuous_update=True)

# 创建一个滑动条,用于调节画圆的总时间,范围从 0 秒到 10 秒,步长为 0.1 秒
t = ipywidgets.FloatSlider(
    min=0, max=10, step=0.1, value=0, 
    description='时间(秒)',
    continuous_update=True)

# 使用 ipywidgets 的交互功能,将滑动条与绘制圆形轨迹的函数关联
ipywidgets.interact(draw_circle, t=t, f=f)

这两个示例的主要区别在于如何绘制和更新图像。第一个示例直接在全局 plt 对象上绘制,而第二个示例使用了更灵活的子图(ax)对象。第二个示例还使用了 clear_output 函数来更清晰地更新图像。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值