我正在尝试在 J 中实现 sine(x) 的级数扩展(我不担心准确性,但更多的是很好地表达级数的问题)。
到目前为止,我有以下显式版本,它使用 50 个项计算 sine(pi):
3.14 (4 :'+/((_1^y) * (x^(1+2*y)) % !1+2*y)') i.50
但这似乎有些笨拙,有没有“更好”的版本(可能是默认的?)?
我正在尝试在 J 中实现 sine(x) 的级数扩展(我不担心准确性,但更多的是很好地表达级数的问题)。
到目前为止,我有以下显式版本,它使用 50 个项计算 sine(pi):
3.14 (4 :'+/((_1^y) * (x^(1+2*y)) % !1+2*y)') i.50
但这似乎有些笨拙,有没有“更好”的版本(可能是默认的?)?
您想要一个奇数的幂和阶乘列表: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.
泰勒近似值。
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
第一个和第二个几乎是默认翻译,最后一个使用钩子和叉子,除非您习惯它们,否则可能会有点多。