2

我知道我可以把它扔进 wolfram alpha 并使用正弦函数得到答案,但假设我的所有数据都是整数,它也应该是可解的。

所以我有两个波,它们总是有整数波长。对于我的示例,它是一个 3 波长波和一个 4 波长波。在最简单的情况下,两者都从 0 秒开始,它们在开始时和之后每 12 秒都为 0。使用 lcm 来确定这些交叉点在我认为的每种情况下都有效,但是如果它们在不同的时间开始,它只能预测它们的频率都为零,但不能预测何时开始。

例如,如果 3 长度的波在时间 1 开始,而 4 长度的波在时间 0 开始,那么它们在时间 4 都为 0,然后每 12 次。但是如果 4 的长度从时间 2 开始,而 3 的长度从时间 1 开始,那么它们在时间 10 和之后的每 12 都为 0。

确定第一次它们都为 0 的方法是什么?

4

2 回答 2

2

对于每个波浪,生成波浪为 0 的时间列表;取列表的交集;最早的时间从路口。需要比这更复杂吗?我猜你只想在每个列表中生成有限数量的元素,除非你有一个可以处理无限数据结构的系统。

另一种方法是在您的示例中将每个波的项写为算术级数(1+3m)(0+4n)求解方程

(1+3m)-(0+4n) == 0

这将有无限的解决方案。但是如果你设置了m==1那么n==1; 如果您设置m==2,则整数没有解决方案n。用你最喜欢的语言编写一个小函数来逐个输出整数解决方案是很容易的。

再多一点代数表明,对于给定的示例,(m,n)值的序列是(1,1),(5,4),(9,7), ...,(m,n),(m+4,n+3),...

和以前一样,我将作为练习留给感兴趣的一方来概括这一点。

于 2012-10-05T15:42:15.077 回答
2

您正在寻找以下形式的方程的解:

sin((2π*A)(x-B)) == 0 

sin((2π*C)(x-D)) == 0

通过相乘,还要注意:

sin(2πAx - 2πAB) == 0

同样地

sin(2πCx - 2πCD) == 0

或者:

Ax - AB == 0
Cx - CD == 0

它提供了以下完全不令人震惊的值,其中这些函数为零:

x = B + 2π/(2π*A) * k
x = D + 2π/(2π*C) * k 

其中 K 是一个整数。

由于您将自己限制为具有波长为整数的值的函数,因此 1/A 和 1/C 的值同样保证为整数。因此,这进一步简化了:

x = B mod a
x = D mod c

其中 a 和 c 是这里的频率。

你可以选择你最喜欢的解联立模方程的形式,我将演示其中最简单的一种:

x = B + k*a
B+ k*a = D mod c
k * a = D - B mod c
k = (a^-1M) (D-B) mod c
k = (a^-1M) (D-B) + j*c
x = B + a*(a^-1M)*(D-B) + (a*j-c)
x = B + a*(a^-1M)(D-B) mod ac

请注意,a^-1m 是 mod c 的模逆,您必须使用扩展欧几里得算法进行计算。(我将省略它,因为您的示例的值非常小):

x = 1 + 3(3)(0-1) mod ac
x = -8 mod ac

给定这样的一些值,您可以在脚本中取右侧 mod ac 并获得正确的第一个值;但是请注意,像 Javascript 之类的一些清理语言将允许绝对值小于 ac 的负结果。

所以你想要这样的东西:

( ( (B + a*(a^-1M)*(D-B) ) % ac) + ac ) % ac)

a^-1M 是 c 中 a 的模数倒数。如果 a%c == 0 或 c%a == 0,您的函数也应该呕吐,因为这些波永远不会相交

于 2012-10-05T16:34:34.400 回答