数学中国

 找回密码
 注册
搜索
热搜: 活动 交友 discuz
查看: 7402|回复: 30

请问这个多项式是哪个三角函数的值?

[复制链接]
发表于 2021-3-25 19:04 | 显示全部楼层 |阅读模式
网上见到的如下多项式:
x*(1-(x^2/6)*(1-(x^2/20)*(1-(x^2/42)*(1-x^2/72*(……))))),


如果是三角函数的值,用程序计算,速度可能是比较快的。

希望老师指点,谢谢!
发表于 2021-3-25 19:16 | 显示全部楼层
下面是我过去在《数学中国》发表过的一个帖子,可供参考:



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-25 19:51 | 显示全部楼层
本帖最后由 ysr 于 2021-3-25 11:59 编辑

谢谢教授,非常感谢!
我需要这方面的公式,如果级数收敛快,就可以迅速得到高精度的三角函数值。常规的电脑几乎都是给出15位有效数字,这个精度满足不了需要,在快速傅里叶变换中必须用到三角函数,15位的有效数字只能变换3位数字,最多4位,就是在乘法中把3位数字当一位进行变换,变换后乘数与被乘数对应项相乘(说是叫卷积),然后再逆变换,错位相加就可以,目前我做到了4位一组,程序对2444位*2444位的乘法1.3秒内,可以完成,得到4888位的积,远没有到达毫秒级,人家据说几万位的都可以达到毫秒级。要想再快只有把更多位当一位了,但要求正弦余弦值精度要高,速度必须快,否则得不偿失。我的算法25位的三角函数值需要0.02秒,没有达到毫秒级,更别说用来做快速傅里叶变换了。

如果此公式够快,那就解决问题,可以大幅提高速度。   谢谢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-25 19:57 | 显示全部楼层
luyuanhong 发表于 2021-3-25 11:16
下面是我过去在《数学中国》发表过的一个帖子,可供参考:


谢谢陆教授!我有空试试该方法,并与相关方法比较一下找到个合适的速度快的方法。
非常感谢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-26 11:00 | 显示全部楼层
本帖最后由 ysr 于 2021-3-26 06:37 编辑

Private Function jszhxian(sa As String, sd As String) As String
Dim s1
s1 = 1 & String(Val(sd), "0")
s2 = mbc2(Trim(jspaizh(sd)), Trim(jspaizh(sd)), Val(sd))
ssa = mbc2(Trim(sa), Trim(sa), Val(sd))
jss = 1 & String(Val(sd), "0")
s2 = zhengchuqy(mcc2(Trim(s1), Trim(s2), Val(sd)))
s4 = mbc2(Trim(ssa), Trim(s2), Val(sd))
s3 = 1
Do While s3 <= 15

s = mpc2(Trim(s1), zhengchuqy(MCC1(mbc2(Trim(ssa), Trim(s2), Val(sd)), Val(s3 ^ 2))))
jss = mbc2(Trim(jss), Trim(s), Val(sd))
s3 = Val(Val(s3) + 1)
s5 = zhengchuqy(MCC1(mbc2(Trim(ssa), Trim(s2), Val(sd)), Val(s3 ^ 2)))

Loop

jszhxian = mbc2(Trim(jss), Trim(sa), Val(sd))
End Function




'程序做出来了,没有运行试验,其中的x^2/ π^2可以看作常数,虽然复杂其实计算不用多少时间,关键是迭代次数要少,就是k的值小就快,就是程序中的s3要小。等会儿实验一下能不能运行暂时发一下代码。(不知道对不对,需要调试)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-26 18:28 | 显示全部楼层
这个公式收敛速度不快?迭代15次就是当k=15时,结果仅仅精确到点后3位,用时2秒(当然我的电脑空间小了,垃圾太多,运行慢了,在运行快的电脑上也是超过了一秒的),结果如下:
500896567096700494694813084679290939614999999146969366298035291816580843533382303384923332235021330562809447941955368022433957148976136730429887056113有150位,用时2.171875秒.(这是30度的正弦值)

需要换个法,用万能公式试试?先求半角的正切值,先弄个正切函数程序吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-26 18:32 | 显示全部楼层
25位数字的倒是快些但结果不精确:5008965670967004946948129有25位,用时0.0703125秒.
准备修改算法,有快速收敛的吗?正切函数的级数展开式好像收敛速度快?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-26 18:40 | 显示全部楼层
50089656709670049469481308467929093961499999914696有50位,用时0.2578125秒.
50位的也不快,基本就是这个数量级了,没有法,继续找资料吧。

迭代次数改为30次的结果:50045554228633489523230223540356109778421449173313有50位,用时0.4453125秒.

迭代100次:50045554228633489523230223540356109778421449173313有50位,用时0.4453125秒(运行时间长了,结果仍然不准)

迭代500次:50013821592267681228007419149764218616197072267261有50位,用时1.195313秒.

迭代1000次:50001388213953369388965824255602256779390984202795有50位,用时11.41406秒(仅仅准确度提高了一位,时间增长了10倍),所以,需要改进。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-26 19:16 | 显示全部楼层
万能公式:sinα=2tan(α/2)/(1+(tan(α/2))^2),cosα=(1-(tan(α/2))^2)/(1+(tan(α/2))^2).

重点,正切函数的级数展开式:tanx=(0.().(). …… .(tn.x^(2n-1)/(2n-1)!)|B2n|其中|x|<π/2.
tn=1,2,16,272,7936,353792,…….

tn 是用伯努利数Bn表示的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-26 19:36 | 显示全部楼层
由于伯努利数没有简单的算术表达式,(资料显示)演算和推导伯努利的公式是很复杂的,我无法用公式给出,所以,可以提前储存这一个数列,用一维数组储存,迭代一次取出一个,如果收敛速度快就可以用有限个就行了,收敛速度慢的话那就只好另寻它法。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|数学中国 ( 京ICP备05040119号 )

GMT+8, 2024-4-17 00:17 , Processed in 0.064453 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表