1

我正在尝试在 J 中实现 sine(x) 的级数扩展(我不担心准确性,但更多的是很好地表达级数的问题)。

到目前为止,我有以下显式版本,它使用 50 个项计算 sine(pi):

3.14 (4 :'+/((_1^y) * (x^(1+2*y)) % !1+2*y)') i.50

但这似乎有些笨拙,有没有“更好”的版本(可能是默认的?)?

4

2 回答 2

3

您想要一个奇数的幂和阶乘列表:l =: >:+:i. y( >:@+:@i.) 或者>:@+:如果您的 y 是i.

然后,您需要幂 (x^l) 除以阶乘 (!l)。一种方法是将其视为 fork (x f y) h (x g y)-> (x ^ l) % (x (]!) l)(^ % (]!))

最后一步是将这个系列乘以系列1, _1, 1, ..._1 ^ y_1&^

所以,最终的形式(_1 ^ y) * (x (^ * (]!)) (>:@+:@i.) y)火车 (h y) j (x f (g y))(h y) j (x (f g) y)(x (]h) y) j (x (f g) y)(]h) j (f g)

ms =: (] _1&^)  *   ((^ % (]!)) (>:@+:))
+/ 3.14 ms i.50 
0.00159265

或者

f =: +/@(ms i.)
3.14 f 50
0.00159265

另一方面,您可以使用T.泰勒近似值

于 2015-03-26T23:37:29.860 回答
0
   3.14 (4 :'+/((_1^y) * (x^(1+2*y)) % !1+2*y)') i.50
0.00159265

默认版本可能如下所示:

   3.14 +/@:((_1 ^ ]) * ([ ^ 1 + +:@]) % !@(1 + +:@])) i.50
0.00159265

或这个:

   3.14 +/@:((_1 ^ ]) * ([ ^ >:@+:@]) % !@>:@+:@]) i.50
0.00159265

甚至这个:

   3.14 +/@:((_1 ^ ]) * (( ^  % !@])(>:@+:@]))) i.50
0.00159265

第一个和第二个几乎是默认翻译,最后一个使用钩子和叉子,除非您习惯它们,否则可能会有点多。

于 2015-03-26T23:17:01.820 回答