考研论坛 » 数学 » 考计算机的一起来放松一下。。。

2008-7-22 19:43 seth1984
您所查看的帖子来源于考研论坛(bbs.kaoyan.com) 考计算机的一起来放松一下。。。

呵呵 看数学看的好累,所以写了个求sin(X)值的函数。。。原理自然是求泰勒公式展开项之和9p7df;RHG
不过很奇怪计算60°角的时候 =0.86625 和我用windows自带的计算器算出的值0.86602540378443864676372317075294一样;g PUJW7s mx P8e Xq
算120°角就开始偏离正确值了 =0.866113 这个误差似乎还可以接受v/f4I C;u+N*q t
可是算240°角的时候就=-0.74123这个值和正确值-0.86602540378443864676372317075294就差太远了'v]g#Y:WDa
我开始计算的项数之合为3项,后来改为6项误差有所减少,可是为7项以上误差又变大了。。如果大家有兴趣一起研究一下,是不是我没有搞清楚泰勒公式应用还有什么条件?是不是拉格朗日余项很关键?其中的那个[0,1]之间的值我随便取了个0.5这个余项好像非常××小
V'UoZA2OTH j J 如果大家有兴趣帮我改改代码 提高一下精度[qq:13] 纯属娱乐哈不要拍砖)g{6RcX2zl8p
#include"stdio.h"!I;W:t&q+[L
#include "math.h"CP Sir9z+Zz

)Lszp(pl"YN a;b //一个求阶乘的函数
*B&l+uAg2B0ubc8W#C int Sub_Item(int k)'s Y5R,B]g X M
{
|&v%n2`A Fo         int KJC = 1;/h wKw t
        for(int i = k ; i > 0 ; i-- )
S)[2w _WUU'Z         {9P:~1@zk%X
                KJC*=i;DB+T l0b kA
        }Bws^}`/U8X|K
^S0?t?*\!v%iCV
        return KJC;
&[5\c'^|t } Hw:P1_3~9j3JI$L*o
-rBC2r~F-J#qOm7d5L
int _tmain(int argc, _TCHAR* argv[])qUC3KH.d%p
{k`w0\4W^~
        //计算到第几项
\ }"F5TV?y9j         int n = 6;{+H*s1Q3Y%~)e+Z9i
        //定义角度转化后的弧度值变量
y~ b Y:WR'Ye         double X = 0.0;
:` ~-s}(_         //定义最终结果
_l6_Y{no         double FinalResult = 0.0;
:J A*|2@Q5p LY         -Xk0l1D_M-M-c;D)D
        //定义角度值9DJ)a&e)cd
        int iDegree = 0;
g o `K2RO         printf("输入一个角度");w8\kx,}8wp~0dNT
        //获得输入的角度值
;F3Q/?@rGo |O         scanf("%d",&iDegree);
o"~yA+}D         //换算为相应的弧度值
?+hd @XUeQ5p         X = (double)iDegree/180.0*3.14159;
5}:h$wb@ xu
PP.kC5wQ         //循环累计各项之和
*z%b{~:q-`Ci4n         for(int k = 1 ; k < n ; k++))]*lzZt#V
        {                                                                //(-1)^(k-1)*X^(2*k-1)/(2*k-1)!
Tj b m{6fh                 FinalResult = FinalResult + (long)pow( (double)-1 , (int)( k - 1 ) ) * pow((double)X , (int)( 2 * k - 1 )) / Sub_Item( 2 * k - 1 );4]s.h\ }G"i:|
        }s6f,S3q g+E-Z7H
       
L }a yj%z G m         //求出拉格朗日余项N^x1@a G O
        double R2nX = (long)pow( (double)-1 , (int)( n) )*cos(0.5*X)* pow((double)X , (int)( 2 * n + 1 ))/Sub_Item(2*n+1);
$J(d*ym/StwS         //求出最终结果'c%G!on0Uy
        FinalResult = FinalResult + R2nX;
7EsF/unY0E1Wy         3gDU0a#HY+Bw
        printf("sin%d = %f",iDegree,FinalResult);YQ4^.cv^bvnY
        getchar();
f3d4Hd{Co         return 0;
~Lz$kk+C(q }

转载请注明出自bbs.kaoyan.com,本贴地址:http://bbs.kaoyan.com/viewthread.php?tid=2319250

2008-7-23 15:26 1982yang
用ANSI C做的啊。。。math.h库里有sin函数

页: [1]

Google
热门搜索: 在职研究生 | 出国留学 | MBA | 英语口语 | 职业培训 | 英语培训 | 笔记本 | 求职

Powered by Discuz! Archiver 5.5.0  © 1999-2007 考研加油站