Python中的正弦波

1 投票
2 回答
1510 浏览
提问于 2025-04-16 13:01

编写一个函数 sinusoid(a, w, n),这个函数会返回一个有序对的列表,表示一个正弦波的 n 个周期,波的幅度是 a,频率是 w。每个周期应该包含 180 个有序对。

到目前为止,我有:

def sinusoid(a,w,n):
    return [a*sin(x) for x in range 180]

2 个回答

2

好的,我们知道这是一个作业,我们不会直接帮你做。不过,我可以给你一些提示。

指示内容:

写一个函数 sinusoid(a, w, n),这个函数会返回一个有序对的列表,表示一个振荡波(正弦波)有 n 个周期,振幅为 a,频率为 w。每个周期应该包含 180 个有序对。

... 这可以转化为以下要点:

  • 写一个函数
  • ... 名字叫 sinusoid()
  • ... 接受三个参数:awn
  • 返回一个列表
  • ... 包含 n 个周期(?)
  • ... (每个周期由?)180 个“有序对”组成

你给出的例子确实定义了一个函数,名字也对,参数数量也对。这是个开始(虽然不算太好,但总算是有点进展)。

明显的问题是,它没有使用两个必需的参数,而且没有返回任何有序对。看起来它会返回 180 个数字,这些数字是基于第一个参数的值。

你肯定能做得比这更好。

我们先从一个简单的框架开始:

def sinusoid(a, w, n):
    '''Return n cycles of the sinusoid for a given amplitude and frequence
       where each cycle consists of 180 ordered pairs
    '''
    results = list()
    # do stuff here
    return results

这就是一个函数,接受三个参数并返回一个列表。现在在返回这个列表之前,我们需要往里面添加一些东西……而指示告诉我们应该返回多少个东西(n 乘以 180)以及这些东西应该是什么(有序对)。

这听起来像是我们需要一个循环(针对 n)和另一个循环(针对 180)。嗯……

这可能看起来像:

for each_cycle in range(n):
    for each_pair in range(180):
        # do something here
        results.append(something) # where something is a tuple ... an "ordered pair"

……或者可能看起来像:

for each_cycle in range(n):
    this_cycle = list()
    for each_pair in range(180):
        this_cycle.append(something)
    results.extend(this_cycle)

……甚至可能看起来像:

for each_pair in range(n*180):
    results.append(something)

……不过,老实说,这种情况不太可能。(如果你尝试将内层循环扁平化到外层循环中,你可能会发现需要用到取模运算来处理某些中间计算目的的 n)。

我不知道老师到底在问什么。看起来 math.sin() 函数可能会用到,我猜“有序对”可能是一些坐标,用于图形系统的绘图。我猜 180 个这样的点可以展示正弦波的完整范围。也许你需要把某个东西乘以振幅,或者把其他东西除以频率,甚至可能还需要为每个周期加上某个偏移量……让图形向右移动之类的。

但看起来你可以从这个函数框架开始,尝试将这些循环体中的一个或另一个粘贴进去,然后找出如何在我用“某个东西”作为占位符的地方返回有意义的值。

假设这些“有序对”是用于绘图的坐标,那么你添加到结果中的每个东西应该是 (x,y) 的形式,其中 x 是单调递增的(简单来说就是一直在增加,从不减少),可能总是 range(0,n*180),而 y 可能是某个与 aw 相关的 math.sin() 的值……不过这只是我的猜测。

2

请考虑一下正弦波的实际功能形式,以及频率是如何进入这个公式的。(提示:http://en.wikipedia.org/wiki/Sine_wave

我不太确定“有序对”具体指的是什么,但我猜应该是指 x 和 y 的配对。目前你只返回了一组单独的数值。另外,你可能还想看看 Python 的 sin 函数的文档。

撰写回答