当前位置:  开发笔记 > 编程语言 > 正文

三角函数如何工作?

如何解决《三角函数如何工作?》经验,为你挑选了4个好方法。

因此,在高中数学,也可能是大学,我们学习如何使用三角函数,他们做什么,以及他们解决了什么样的问题.但它们总是作为一个黑盒子呈现给我.如果你需要某些东西的正弦或余弦,你可以点击计算器上的sin或cos按钮然后进行设置.哪个好.

我想知道的是三角函数通常是如何实现的.



1> John D. Cook..:

首先,你必须做一些范围缩小.Trig函数是周期性的,因此您需要将参数减少到标准间隔.对于初学者,您可以将角度减小到0到360度之间.但是通过使用一些身份,你意识到你可以少花钱.如果计算0到45度之间角度的正弦和余弦,您可以自行计算所有角度的所有三角函数.

一旦你减少了论证,大多数芯片都使用CORDIC算法来计算正弦和余弦.你可能会听到人们说计算机使用泰勒系列.这听起来很合理,但事实并非如此.CORDIC算法更适合高效的硬件实现.(软件库可能使用Taylor系列,比如说不支持trig函数的硬件.)可能还有一些额外的处理,使用CORDIC算法得到相当好的答案,然后做其他事情以提高准确性.

上面有一些改进.例如,对于非常小的角度theta(以弧度表示),sin(theta)= theta到你拥有的所有精度,因此简单地返回theta比使用其他算法更有效.因此在实践中有很多特殊情况逻辑可以挤出所有可能的性能和准确性.市场较小的芯片可能无法进行尽可能多的优化工作.


很好的答案 - 虽然CORDIC本身并不需要减少范围(实际上它本身就是一个范围缩减算法); 它适用于-pi/2和+ pi/2之间的角度,所以你只需对该范围之外的角度进行180度矢量旋转.
使用多项式近似的实现可能**经常**使用泰勒级数,但它们通常**应该**使用已经用Remez算法确定的系数.http://lolengine.net/blog/2011/12/21/better-function-approximations
似乎这个答案与这个类似问题的高评价接受的答案相矛盾:http://stackoverflow.com/questions/2284860/how-does-c-compute-sin-and-other-math-functions.这个答案说sin()函数主要在硬件级别实现,而另一个在C语言中表示.

2> Jason S..:

编辑:Jack Ganssle在其关于嵌入式系统的书"固件手册"中进行了不错的讨论.

仅供参考:如果您有准确性和性能限制,泰勒系列应用于近似函数以用于数字目的.(将它们保存为微积分课程.)它们在单个点使用函数的解析性,例如,在该点存在所有其衍生物的事实.它们不一定会在感兴趣的区间内收敛.他们经常在分配函数近似值的准确性方面做得很糟糕,以便在评估点附近"完美"; 当你离开它时,错误通常会向上放大.如果你有一个具有任何非连续导数的函数(例如方波,三角波及其积分),泰勒级数将给你错误的答案.

当使用最大次数N的多项式在x0

编辑:维基百科有一篇关于近似理论的半篇文章.他们引用的其中一个来源(哈特,"计算机近似")已经绝版(使用的副本往往很昂贵),但对这类内容进行了大量细节处理.(Jack Ganssle在他的时事通讯The Embedded Muse第39期中提到了这一点.)

编辑2:这是泰勒与切比雪夫对罪(x)的一些有形误差指标(见下文).需要注意的一些要点:

    在给定范围内泰勒级数近似的最大误差远大于相同程度的切比雪夫近似的最大误差.(对于大约相同的错误,你可以用Chebyshev减少一个术语,这意味着更快的性能)

    减少范围是一个巨大的胜利.这是因为当近似的间隔较小时,高阶多项式的贡献会缩小.

    如果无法减少范围,则需要更精确地存储系数.

不要误会我的意思:泰勒系列适用于正弦/余弦(在-pi/2到+ pi/2范围内具有合理的精度;从技术上讲,有足够的项,你可以达到所有实际输入所需的精度,但尝试使用泰勒级数来计算cos(100),除非使用任意精度算术,否则不能这样做.如果我被困在荒岛上的非科学计算器,我需要计算正弦和余弦,我可能会使用泰勒系列,因为系数很容易记住.但是,必须编写自己的sin()或cos()函数的真实世界应用程序是非常罕见的,您最好使用有效的实现来达到所需的精度 - 泰勒系列不是这样.

范围= -pi/2到+ pi/2,度数5(3个术语)

泰勒:最大误差周围4.5E-3,F(X)= XX 3 /6 + X 5 /120

Chebyshev:最大误差在7e-5附近,f(x)= 0.9996949x-0.1656700x 3 + 0.0075134x 5

范围= -pi/2到+ pi/2,度数7(4个术语)

泰勒:最大误差周围1.5E-4,F(X)= XX 3 /6 + X 5 /120-X 7 /5040

Chebyshev:最大误差在6e-7附近,f(x)= 0.99999660x-0.16664824x 3 + 0.00830629x 5 -0.00018363x 7

范围= -pi/4到+ pi/4,3度(2个术语)

泰勒:最大误差周围2.5E-3,F(X)= XX 3 /6

Chebyshev:最大误差约为1.5e-4,f(x)= 0.999x-0.1603x 3

范围= -pi/4到+ pi/4,5度(3个术语)

泰勒:最大误差周围3.5E-5,F(X)= XX 3 /6 + X 5

Chebyshev:最大误差在6e-7附近,f(x)= 0.999995x-0.1666016x 3 + 0.0081215x 5

范围= -pi/4到+ pi/4,7度(4个术语)

泰勒:围绕3E-7最大误差,F(X)= XX 3 /6 + X 5 /120-X 7 /5040

Chebyshev:最大误差在1.2e-9附近,f(x)= 0.999999986x-0.166666367x 3 + 0.008331584x 5 -0.000194621x 7


:耸耸肩:我不了解你,但我从来没有兴趣在一个小区附近评估一个功能.即使在一个区间内快速最小二乘拟合也非常容易.任何使用泰勒系列的人都错过了这一点.
??? 怎么会有什么不同?计算sin(x)从-2pi到+ 2pi的泰勒级数可能会被Chebyshev用7或9次多项式击败.我在发表声明时没有任何问题,"如果你在砍伐树木时有时间限制,就不应该使用手锯.请使用电锯." 也许我应该从"不应该"改为"我不建议使用泰勒系列".当然,在某些情况下你可以使用泰勒系列,但你的准确性和性能会有问题.按性能我的意思是CPU执行时间.
这个评论是错误的.每个近似都有一个时间和地点.如果您不知道足够的分析来确定任何系列近似的收敛区域,则不应使用它.这适用于Taylor,Chebyshev,Padé等系列.泰勒系列通常很好.
Upvoting因为响应者知道Hart存在.:微笑:哈特是这里的经典参考,即使25年前我买了一本(印刷版)时很难找到.值得全力投资.尽可能减少范围,再加上适当的近似值,无论是Pade,Chebychev,甚至泰勒系列,都是一种很好的方法.Pade或Chebychev近似值通常是比Taylor系列更好的选择.

3> Jon Galloway..:

我相信他们是用泰勒系列或CORDIC计算的.一些大量使用trig函数(游戏,图形)的应用程序在启动时构造了trig表,因此它们可以只查找值而不是一遍又一遍地重新计算它们.



4> Parappa..:

查看关于trig函数的Wikipedia文章.关于在代码中实际实现它们的一个好地方是Numerical Recipes.

我不是一个数学家,但是我对sin,cos和tan"来自"的理解是,从某种意义上说,当你使用直角三角形时,它们就会被观察到.如果你测量一堆不同的直角三角形的边长,并在图上绘制点,你可以得到sin,cos和tan.正如Harper Shelby指出的那样,函数被简单地定义为直角三角形的属性.

通过理解这些比率如何与圆的几何形状相关联来实现更复杂的理解,这导致弧度和所有这些优点.这就是维基百科条目中的所有内容.

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有