三角函数化简求值求值(过程)cos(

扫二维码下载作业帮
1.75亿学生的选择
下载作业帮安装包
扫二维码下载作业帮
1.75亿学生的选择
cos495度的三角函数值(求过程)cos495度的三角函数值,
我是月亮yl6454
扫二维码下载作业帮
1.75亿学生的选择
cos495°=cos135°(360°一循环)cos45°=二分之根号二,cos135°=-cos45°应该是这样吧,可以从cosA=b÷c想想
为您推荐:
其他类似问题
扫描下载二维码27011人阅读
数值计算(38)
数字信号处理(20)
三角函数计算,Cordic&算法入门
三角函数的计算是个复杂的主题,有计算机之前,人们通常通过查找三角函数表来计算任意角度的三角函数的值。这种表格在人们刚刚产生三角函数的概念的时候就已经有了,它们通常是通过从已知值(比如)开始并重复应用半角和和差公式而生成。
现在有了计算机,三角函数表便推出了历史的舞台。但是像我这样的喜欢刨根问底的人,不禁要问计算机又是如何计算三角函数值的呢。最容易想到的办法就是利用级数展开,比如泰勒级数来逼近三角函数,只要项数取得足够多就能以任意的精度来逼近函数值。除了泰勒级数逼近之外,还有其他许多的逼近方法,比如切比雪夫逼近、最佳一致逼近和逼近等。
所有这些逼近方法本质上都是用多项式函数来近似我们要计算的三角函数,计算过程中必然要涉及到大量的浮点运算。在缺乏硬件乘法器的简单设备上(比如没有浮点运算单元的单片机),用这些方法来计算三角函数会非常的费时。为了解决这个问题,J.&Volder于年提出了一种快速算法,称之为CORDIC(COordinate&Rotation&DIgital&Computer)&算法,这个算法只利用移位和加减运算,就能计算常用三角函数值,如,,,等函数。&J.&Walther在年在这种算法的基础上进一步改进,使其可以计算出多种超越函数,更大的扩展了Cordic&算法的应用。因为Cordic&算法只用了移位和加法,很容易用纯硬件来实现,因此我们常能在FPGA运算平台上见到它的身影。不过,大多数的软件程序员们都没有听说过这种算法,也更不会主动的去用这种算法。其实,在嵌入式软件开发,尤其是在没有浮点运算指令的嵌入式平台(比如定点型DSP)上做开发时,还是会遇上可以用到Cordic&算法的情况的,所以掌握基本的算法还是有用的。
从二分查找法说起
先从一个例子说起,知道平面上一点在直角坐标系下的坐标()(,),如何求的在极坐标系下的坐标(ρ,θ)。用计算器计算一下可知答案是(,)。
图&1&直角坐标系到极坐标系的转换
为了突出重点,这里我们只讨论和都为正数的情况。这时θ=atan(y/x)。求θ的过程也就是求atan&函数的过程。Cordic算法采用的想法很直接,将(,)旋转一定的度数,如果旋转完纵坐标变为了,那么旋转的度数就是θ。坐标旋转的公式可能大家都忘了,这里把公式列出了。设(x,y)是原始坐标点,将其以原点为中心,顺时针旋转θ之后的坐标记为(x’,y’),则有如下公式:
也可以写为矩阵形式:
如何旋转呢,可以借鉴二分查找法的思想。我们知道θ的范围是0到90度。那么就先旋转45度试试。
旋转之后纵坐标为70.71,还是大于0,说明旋转的度数不够,接着再旋转22.5度(45度的一半)。
这时总共旋转了45+22.5=67.5度。结果纵坐标变为了负数,说明θ&67.5度,这时就要往回转,还是二分查找法的思想,这次转11.25度。
这时总共旋转了45+22.5-11.25=56.25度。又转过头了,接着旋转,这次顺时针转5.625度。
这时总共旋转了45+22.5-11.25+5.625=61.875度。这时纵坐标已经很接近0了。我们只是说明算法的思想,因此就不接着往下计算了。计算到这里我们给的答案是&61.875±5.625。二分查找法本质上查找的是一个区间,因此我们给出的是θ值的一个范围。同时,坐标到原点的距离ρ也求出来了,ρ=223.52。与标准答案比较一下计算的结果还是可以的。旋转的过程图示如下。
可能有读者会问,计算中用到了&sin&函数和&cos&函数,这些值又是怎么计算呢。很简单,我们只用到很少的几个特殊点的sin&函数和&cos&函数的值,提前计算好存起来,用时查表。
下面给出上面方法的C&语言实现。
#include &stdio.h&
#include &stdlib.h&
double my_atan2(double x, double y);
int main(void)
double z = my_atan2(100.0, 200.0);
printf(&\n z = %f \n&, z);
double my_atan2(double x, double y)
const double sine[] = {0.5,0.1,0.1,0.56,
0.42,0.91,0.72,0.154,0.966
,0.285,7.045e-4,3.956e-4,1.033e-4,
9.735e-5,4.688e-5,2.822e-5
const double cosine[] = {0.5,0.3,0.2,0.2,
0.2,0.2,0.1,0.6,0.6,
0.7,0.9,0.7,0.4,0.1,
int i = 0;
double x_new, y_
double angleSum = 0.0;
double angle = 45.0;
for(i = 0; i & 15; i++)
x_new = x * cosine[i] + y * sine[i];
y_new = y * cosine[i] - x * sine[i];
angleSum +=
x_new = x * cosine[i] - y * sine[i];
y_new = y * cosine[i] + x * sine[i];
angleSum -=
printf(&Debug: i = %d angleSum = %f, angle = %f\n&, i, angleSum, angle);
angle /= 2;
return angleS
程序运行的输出结果如下:
Debug: i = 0 angleSum = 45.000000, angle = 45.000000
Debug: i = 1 angleSum = 67.500000, angle = 22.500000
Debug: i = 2 angleSum = 56.250000, angle = 11.250000
Debug: i = 3 angleSum = 61.875000, angle = 5.625000
Debug: i = 4 angleSum = 64.687500, angle = 2.812500
Debug: i = 5 angleSum = 63.281250, angle = 1.406250
Debug: i = 6 angleSum = 63.984375, angle = 0.703125
Debug: i = 7 angleSum = 63.632813, angle = 0.351563
Debug: i = 8 angleSum = 63.457031, angle = 0.175781
Debug: i = 9 angleSum = 63.369141, angle = 0.087891
Debug: i = 10 angleSum = 63.413086, angle = 0.043945
Debug: i = 11 angleSum = 63.435059, angle = 0.021973
Debug: i = 12 angleSum = 63.424072, angle = 0.010986
Debug: i = 13 angleSum = 63.429565, angle = 0.005493
Debug: i = 14 angleSum = 63.432312, angle = 0.002747
z = 63.432312
减少乘法运算
现在已经有点&Cordic&算法的样子了,但是我们看到没次循环都要计算&4&次浮点数的乘法运算,运算量还是太大了。还需要进一步的改进。改进的切入点当然还是坐标变换的过程。我们将坐标变换公式变一下形。
可以看出&cos(θ)可以从矩阵运算中提出来。我们可以做的再彻底些,直接把&cos(θ)&给省略掉。
省略cos(θ)后发生了什么呢,每次旋转后的新坐标点到原点的距离都变长了,放缩的系数是1/cos(θ)。不过没有关系,我们求的是θ,不关心ρ的改变。这样的变形非常的简单,但是每次循环的运算量一下就从4次乘法降到了2次乘法了。
还是给出&C&语言的实现:
double my_atan3(double x, double y)
const double tangent[] = {1.0,0.1,0.7,0.16,0.47,
0.93,0.57,0.623,0.423,
0.089,7.926e-4,3.41e-4,1.089e-4,
9.303e-5,4.51e-5,2.3e-5
int i = 0;
double x_new, y_
double angleSum = 0.0;
double angle = 45.0;
for(i = 0; i & 15; i++)
x_new = x + y * tangent[i];
y_new = y - x * tangent[i];
angleSum +=
x_new = x - y * tangent[i];
y_new = y + x * tangent[i];
angleSum -=
printf(&Debug: i = %d angleSum = %f, angle = %f, ρ = %f\n&, i, angleSum, angle, hypot(x,y));
angle /= 2;
return angleS
计算的结果是:
Debug: i = 0 angleSum = 45.000000, angle = 45.000000, ρ = 316.227766
Debug: i = 1 angleSum = 67.500000, angle = 22.500000, ρ = 342.282467
Debug: i = 2 angleSum = 56.250000, angle = 11.250000, ρ = 348.988177
Debug: i = 3 angleSum = 61.875000, angle = 5.625000, ρ = 350.676782
Debug: i = 4 angleSum = 64.687500, angle = 2.812500, ρ = 351.099697
Debug: i = 5 angleSum = 63.281250, angle = 1.406250, ρ = 351.205473
Debug: i = 6 angleSum = 63.984375, angle = 0.703125, ρ = 351.231921
Debug: i = 7 angleSum = 63.632813, angle = 0.351563, ρ = 351.238533
Debug: i = 8 angleSum = 63.457031, angle = 0.175781, ρ = 351.240186
Debug: i = 9 angleSum = 63.369141, angle = 0.087891, ρ = 351.240599
Debug: i = 10 angleSum = 63.413086, angle = 0.043945, ρ = 351.240702
Debug: i = 11 angleSum = 63.435059, angle = 0.021973, ρ = 351.240728
Debug: i = 12 angleSum = 63.424072, angle = 0.010986, ρ = 351.240734
Debug: i = 13 angleSum = 63.429565, angle = 0.005493, ρ = 351.240736
Debug: i = 14 angleSum = 63.432312, angle = 0.002747, ρ = 351.240736
z = 63.432312
消除乘法运算
我们已经成功的将乘法的次数减少了一半,还有没有可能进一步降低运算量呢?还要从计算式入手。
第一次循环时,tan(45)=1,所以第一次循环实际上是不需要乘法运算的。第二次运算呢?
Tan(22.5)=0.1,很不幸,第二次循环乘数是个很不整的小数。是否能对其改造一下呢?答案是肯定的。第二次选择22.5度是因为二分查找法的查找效率最高。如果选用个在22.5到45度之间的值,查找的效率会降低一些。如果稍微降低一点查找的效率能让我们有效的减少乘法的次数,使最终的计算速度提高了,那么这种改进就是值得的。
我们发现tan(26.)=0.5,如果我们第二次旋转采用26.度,那么乘数变为0.5,如果我们采用定点数运算的话(没有浮点协处理器时为了加速计算我们会大量的采用定点数算法)乘以0.5就相当于将乘数右移一位。右移运算是很快的,这样第二次循环中的乘法运算也被消除了。
类似的方法,第三次循环中不用11.25度,而采用&14.5&度。
Tan(14.5)=&1/4
乘数右移两位就可以了。剩下的都以此类推。
tan(45)= 1
tan(26.)= 1/2
tan(14.5)= 1/4
tan(7.8)= 1/8
tan(3.35)= 1/16
tan(1.07)= 1/32
tan(0.1)= 1/64
tan(0.6)= 1/128
tan(0.5)= 1/256
还是给出C语言的实现代码,我们采用循序渐进的方法,先给出浮点数的实现(因为用到了浮点数,所以并没有减少乘法运算量,查找的效率也比二分查找法要低,理论上说这个算法实现很低效。不过这个代码的目的在于给出算法实现的示意性说明,还是有意义的)。
double my_atan4(double x, double y)
const double tangent[] = {1.0, 1 / 2.0, 1 / 4.0, 1 / 8.0, 1 / 16.0,
1 / 32.0, 1 / 64.0, 1 / 128.0, 1 / 256.0, 1 / 512.0,
const double angle[] = {45.0, 26., 14.5, 7.8, 3.35,
1.07, 0.1, 0.6, 0.5, 0.2,
0.8, 0., 0.27, 0.353, 0.704
int i = 0;
double x_new, y_
double angleSum = 0.0;
for(i = 0; i & 15; i++)
x_new = x + y * tangent[i];
y_new = y - x * tangent[i];
angleSum += angle[i];
x_new = x - y * tangent[i];
y_new = y + x * tangent[i];
angleSum -= angle[i];
printf(&Debug: i = %d angleSum = %f, angle = %f, ρ = %f\n&, i, angleSum, angle[i], hypot(x, y));
return angleS
}程序运行的输出结果如下:
Debug: i = 0 angleSum = 45.000000, angle = 45.000000, ρ = 316.227766
Debug: i = 1 angleSum = 71.565051, angle = 26.565051, ρ = 353.553391
Debug: i = 2 angleSum = 57.528808, angle = 14.036243, ρ = 364.434493
Debug: i = 3 angleSum = 64.653824, angle = 7.125016, ρ = 367.270602
Debug: i = 4 angleSum = 61.077490, angle = 3.576334, ρ = 367.987229
Debug: i = 5 angleSum = 62.867400, angle = 1.789911, ρ = 368.166866
Debug: i = 6 angleSum = 63.762574, angle = 0.895174, ρ = 368.211805
Debug: i = 7 angleSum = 63.314960, angle = 0.447614, ρ = 368.223042
Debug: i = 8 angleSum = 63.538770, angle = 0.223811, ρ = 368.225852
Debug: i = 9 angleSum = 63.426865, angle = 0.111906, ρ = 368.226554
Debug: i = 10 angleSum = 63.482818, angle = 0.055953, ρ = 368.226729
Debug: i = 11 angleSum = 63.454841, angle = 0.027976, ρ = 368.226773
Debug: i = 12 angleSum = 63.440853, angle = 0.013988, ρ = 368.226784
Debug: i = 13 angleSum = 63.433859, angle = 0.006994, ρ = 368.226787
Debug: i = 14 angleSum = 63.437356, angle = 0.003497, ρ = 368.226788
z = 63.437356
有了上面的准备,我们可以来讨论定点数算法了。所谓定点数运算,其实就是整数运算。我们用256&表示1度。这样的话我们就可以精确到1/256=0.&度了,这对于大多数的情况都是足够精确的了。256&表示1度,那么45度就是&45*256&=&115200。其他的度数以此类推。
C&代码如下:
int my_atan5(int x, int y)
const int angle[] = {1, , 916, 458, 229, 115, 57, 29, 14, 7, 4, 2, 1};
int i = 0;
int x_new, y_
int angleSum = 0;
x *= 1024;// 将 X Y 放大一些,结果会更准确
y *= 1024;
for(i = 0; i & 15; i++)
x_new = x + (y && i);
y_new = y - (x && i);
angleSum += angle[i];
x_new = x - (y && i);
y_new = y + (x && i);
angleSum -= angle[i];
printf(&Debug: i = %d angleSum = %d, angle = %d\n&, i, angleSum, angle[i]);
return angleS
计算结果如下:
Debug: i = 0 angleSum = 11520, angle = 11520
Debug: i = 1 angleSum = 18321, angle = 6801
Debug: i = 2 angleSum = 14728, angle = 3593
Debug: i = 3 angleSum = 16552, angle = 1824
Debug: i = 4 angleSum = 15636, angle = 916
Debug: i = 5 angleSum = 16094, angle = 458
Debug: i = 6 angleSum = 16323, angle = 229
Debug: i = 7 angleSum = 16208, angle = 115
Debug: i = 8 angleSum = 16265, angle = 57
Debug: i = 9 angleSum = 16236, angle = 29
Debug: i = 10 angleSum = 16250, angle = 14
Debug: i = 11 angleSum = 16243, angle = 7
Debug: i = 12 angleSum = 16239, angle = 4
Debug: i = 13 angleSum = 16237, angle = 2
Debug: i = 14 angleSum = 16238, angle = 1
.4296875度,精确的结果是63.4349499度,两个结果的差为0.00526,还是很精确的。
到这里&CORDIC&算法的最核心的思想就介绍完了。当然,这里介绍的只是CORDIC算法最基本的内容,实际上,利用CORDIC&算法不光可以计算&atan&函数,其他的像&Sin,,,&等一系列的函数都可以计算,不过那些都不在本文的讨论范围内了。另外,每次旋转时到原点的距离都会发生变化,而这个变化是确定的,因此可以在循环运算结束后以此补偿回来,这样的话我们就同时将(ρ,θ)都计算出来了。
想进一步深入学习的可以阅读&于年发表在&上的综述性文章“”。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1603239次
积分:18548
积分:18548
排名:第380名
原创:363篇
转载:17篇
译文:15篇
评论:611条
文章:22篇
阅读:27471
文章:32篇
阅读:54290
文章:11篇
阅读:65472
文章:26篇
阅读:121720
文章:31篇
阅读:125922
(2)(8)(5)(4)(7)(2)(7)(7)(9)(15)(9)(22)(21)(5)(7)(4)(6)(3)(5)(4)(5)(6)(4)(2)(1)(9)(4)(4)(7)(6)(2)(3)(4)(9)(8)(2)(3)(8)(2)(6)(2)(3)(3)(4)(8)(4)(4)(14)(1)(10)(6)(2)(6)(13)(17)(11)(19)(24)问:为什么tan度=,sin度=,cos度=?sin°=,cos...为什么tan度=,sin度=,cos度=?sin°=,cos°=-,tan...答:谁说tan°=了,应该是无限大吧,如果你是初中的确实用直角三角形来理解是做不到的,但是到了 就有办解了在直角坐标系中,以原点为圆心,做半径为的...
问:SIN COS TAN的角度值问题它们的度的值分别是多少?答:sin°=cos°=tan°=sin°=/cos°=√/tan°=√/sin°=√/cos°=√/tan°=sin°=√/cos°=/tan°=√sin°...
问:sin(-a)sincos(-a)costan(-a)tan a.sin(_ ...sin(-a)=-sincos(-a)=costan(-a)=-tan a.sin(π-a)=sincos(π-a)=-cos...答:角a与角-a的终边关于x轴对称,角a的终边与单位圆交于点M(cosa,sina),角-a的终边与单位圆交于点M'(cos(-a),sin(-a)),∴cos(-a)=cosa,sin(-a)=-sina.tan(-a)=sin(-...
问:初三cos sin tan需背常用数值答:sin=/,cos=√/,tan=√/sin=√/,cos=/,tan=√sin=cos=√/,tan=sin=,cos=sin=sin=√/,cos=-/,tan=-√...
问:已知tan=求sin乘cos的值已知tan=求sin乘cos的值答:tan=sin/cos=sin/√-sin^=;就求出sin=.再求cos就好求了
问:COS SIN TAN函数数值答:sin°=/,sin°=√/,sin°=√/cos°=√/,cos°=√/,cos°=/tan°=√/,tan°=,tan°=√
问:已知tanθ=求sinθ,cosθ已知tanθ=.求sinθ,cosθ答:因为tanθ=sinθ/cosθ=所以sinθ=cosθ因为sinθ^+cosθ^=所以cosθ^+cosθ^=cosθ^=/cosθ=±/sinθ=cosθ=±√/初中的话,...
问:三角函数sin cos tan常用度数值为多少?答:°°°°°/√/√/←sinA√/√ ←cosA√/√ None←tanA None√√/←cotA
问:cos是多少?tan?sin?cos是多少?tan?sin?答:cos是多少?tan?sin?sin°=/cos°=/tan°=/
问:求,正玄、余玄、正切表。Sin,Cos,Tan,数值表…重谢。...几何知识。答:自己用Excel表中编一个,很简单的。自己动手,是个学过程。
问:tan,cot,sin,cos都是什么意思。怎么计算关于三角函数的问题答:我帮你画个图,说明
问:sin、tan、cos,三角函数数值表咋算的?不用计算器,不是特殊值...答:可以开展成级数来算如:sinx=x/-x^/!x^/!
问:sin cos tan加上度数的全部的公式答:不用写全部了吧,把我记得的一些写给你,对应的cos、tan值很容易求的!sin°=[√(-√)]/,tan°=-√,sin°=[(√)-]/,sin.°=[√(-√)]/,...
问:求,正玄、余玄、正切表。Sin,Cos,Tan,数值表…重谢。答:()特殊角三角函数值sin=sin=.sin=.二分之根号sin=.二分之根号sin=cos=cos=.二分之根号cos=....
09-1609-0108-2709-17
02-2502-1703-1904-14
◇本站云标签Python中计算三角函数之cos()方法的使用简介
投稿:goldensun
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Python中计算三角函数之cos()方法的使用简介,是Python入门的基础知识,需要的朋友可以参考下
&cos()方法返回x弧度的余弦值。
以下是cos()方法的语法:
注意:此函数是无法直接访问的,所以我们需要导入math模块,然后需要用math的静态对象来调用这个函数。
&&& x -- 这必须是一个数值
此方法返回-1 到 1之间的数值,它表示角度的余弦值
下面的例子展示cos()方法的使用
#!/usr/bin/python
import math
print "cos(3) : ", math.cos(3)
print "cos(-3) : ", math.cos(-3)
print "cos(0) : ", math.cos(0)
print "cos(math.pi) : ", math.cos(math.pi)
print "cos(2*math.pi) : ", math.cos(2*math.pi)
当我们运行上面的程序,它会产生以下结果:
cos(3) : -0.
cos(-3) : -0.
cos(0) : 1.0
cos(math.pi) : -1.0
cos(2*math.pi) : 1.0
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 三角函数求值 的文章

 

随机推荐