我正在尝试在J中实现sine(x)的系列扩展(我不担心准确性,但更多的是很好地表达系列的问题)。
到目前为止,我有以下显式版本,使用50个术语计算正弦(pi):
3.14(4:'+ /((_ 1 ^ y)*(x ^(1 + 2 * y))%!1 + 2 * y)')i.50
但它似乎有点笨重,是否有一个“更好”的版本(也许是默认?)?
答案 0 :(得分:3)
如果您的y为l =: >:+:i. y
,您需要幂和因子的奇数列表:>:@+:@i.
(>:@+:
)或i.
。
然后,你想要幂(x ^ l)除以阶乘(!l)。一种方法是将其视为分叉(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)
:< / p>
ms =: (] _1&^) * ((^ % (]!)) (>:@+:))
+/ 3.14 ms i.50
0.00159265
或
f =: +/@(ms i.)
3.14 f 50
0.00159265
另一方面,您可以T.
使用the taylor approximation。
答案 1 :(得分: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
第一个和第二个是非常隐性的翻译,最后一个使用钩子和叉子,除非你习惯了它们,否则可能会有点多。