Python中的正弦波
编写一个函数 sinusoid(a, w, n)
,这个函数会返回一个有序对的列表,表示一个正弦波的 n 个周期,波的幅度是 a,频率是 w。每个周期应该包含 180 个有序对。
到目前为止,我有:
def sinusoid(a,w,n):
return [a*sin(x) for x in range 180]
2 个回答
好的,我们知道这是一个作业,我们不会直接帮你做。不过,我可以给你一些提示。
指示内容:
写一个函数 sinusoid(a, w, n)
,这个函数会返回一个有序对的列表,表示一个振荡波(正弦波)有 n 个周期,振幅为 a,频率为 w。每个周期应该包含 180 个有序对。
... 这可以转化为以下要点:
- 写一个函数
- ... 名字叫
sinusoid()
- ... 接受三个参数:
a
、w
和n
- 返回一个列表
- ... 包含 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
可能是某个与 a
和 w
相关的 math.sin()
的值……不过这只是我的猜测。
请考虑一下正弦波的实际功能形式,以及频率是如何进入这个公式的。(提示:http://en.wikipedia.org/wiki/Sine_wave)
我不太确定“有序对”具体指的是什么,但我猜应该是指 x 和 y 的配对。目前你只返回了一组单独的数值。另外,你可能还想看看 Python 的 sin
函数的文档。