0

我有一个正弦波,我可以确定其参数(它们是用户输入的)。它的形式为 y=a*sin(m*x + t)

我想知道是否有人知道一种有效的算法来计算给定区间的 y 范围,该区间从 [0, x] 开始(x 又是另一个输入)

例如:

对于 y = sin(x) (即 a=1,t=0,m=1),对于区间 [0, 4] 我想要像 [1, -0.756802] 这样的输出

请记住,m 和 t 可以是任何值。因此,y 曲线不必从 0(或 1)开始(或结束)。它可以从任何地方开始。

另外,请注意 x 将是离散的。

有任何想法吗?

PS:我将使用python来实现算法。

4

3 回答 3

2

如果您有一个以上的时期,那么结果只是 +/- a。

在不到一个时间段内,您可以在起点/终点评估 y,然后通过求解 找到起点/终点之间的任何最大值y' = 0,即cos(m*x + t) = 0

于 2010-12-25T19:17:45.553 回答
2

由于函数y(x) = a*sin(m*x + t)是连续的,最大值将在间隔的一端或在最大的内部间隔处,在这种情况下dy/dx将等于零。

所以:
1. 在区间的末尾找到 y(x) 的值。
2. 找出 dy/dx == a * m cos (mx + t) 在区间内是否有零,找出 y(x) 在零处的值。
3.选择y(x)具有最大值的点

于 2010-12-25T19:21:24.213 回答
0

所有的答案或多或少都是一样的。谢谢大家=)

我想我会使用类似以下的内容(请注意,我将我称为“x”的变量重命名为“end”。我在开头有这个“x”,表示我在 X 轴上的间隔结束):

1) 在 0 和 "end" 处评估 y,使用 if 块将这两个值分配给范围的正确 PRELIMINARY "min" 和 "max"

2)评估进化次数:“evolNr”=(m*end)/2Pi。如果 evolNr > 1,返回 [-a, a]

3) 如果evolNr < 1:首先求导数的根,即在"firstRoot" = (1/2m)*Pi - phase + q * 1/m * Pi,其中q = ceil(m/Pi * ( (1/2m) * Pi - phase) ) --- 这给了我在某个位置 x > 0 的第一个根。从那时起,我知道所有其他极端都在 firstRoot 和“end”之内,我们每个都有一个新根1/m * Pi。

在代码中: for (a=firstRoot; a < end; a += 1/m*Pi) {在 a 处评估 y,如果 > 0 为最大值,则更新“max”,否则更新“min”}

返回[最小,最大]

于 2010-12-25T22:57:35.837 回答