| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7444 人关注过本帖
标题:利用泰勒级数逼近sin(x)的值,要求用通项,而非递推,各位高手帮帮忙
只看楼主 加入收藏
hhcxx2006
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2011-11-14
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:13 
利用泰勒级数逼近sin(x)的值,要求用通项,而非递推,各位高手帮帮忙
泰勒公式为sin(x)约等于x-x^3/3!+x^5/5!-x^7/7!+x^9/9!……
要求最后一项的绝对值小于10的-6次方,并统计累加了多少项?
  看看我的代码哪里有问题?,请各位看看,帮帮忙改一下
程序代码:
先讲一下我的大概思路,因为要求用通项,而通项中涉及到阶乘和乘方运算,我想利用C语言的函数模块化编程特点,先定义阶乘运算和乘方运算(这个我在 math.h函数库查到了,但还是先看看我的吧)两个函数,然后综合利用将通项表示出来

#include <stdio.h>
#include<math.h>
#define Pi 3.14
int multi(int t) //构建阶乘运算函数
{
    int a=1,b=1;
    while(b<=t)
    {
        a=a*b;
        b=b+1;
    }
    return a;
}
double power(double m,int l) //构建乘方运算函数
{
    double p=m,q;int j=2;
    if(l=1)return m;
    else
    {
        while(j<=l)
        {
            q=p*m;
            p=p*m;
            ++j;
        }
        return q;
    }
}
int main() //主函数
{
    double x,u,sum=0;  //u为通项公式
    int n=1;
    printf("请输入角度:");
    scanf("%lf",&x);
    x=(x/180)*Pi; //将角度数转换成弧度
    u=(power(-1,n+1)*power(x,2n-1))/multi(2n-1);//先求第一项的值
    while (fabs(u)>=1e-6) //再用这个循环应该可以求出来的
    {
        sum+=u;
        n=n+1;
        u=(power(-1,n+1)*power(x,2n-1))/multi(2n-1);
    }
    printf("迭代%d次  sin(%.2f)=%.2f\n",n,x,sum);
}


[ 本帖最后由 hhcxx2006 于 2011-11-14 19:07 编辑 ]
搜索更多相关主题的帖子: 编程 统计 绝对值 C语言 color 
2011-11-14 18:29
luchar
Rank: 9Rank: 9Rank: 9
来 自:南京
等 级:蜘蛛侠
帖 子:279
专家分:1263
注 册:2011-11-3
收藏
得分:5 
程序代码:
#include <math.h>
#define PI 3.1415926
main()
{
    int i,n,m;
    float fz,fm,s,sum,x;
    printf("请输入要计算的角度x:");
    scanf("%f",&x);
    x=PI*(x/180);
    fz=x;
    fm=1;
    s=fz/fm;
    sum=s;
    n=1;m=-1;
    for(i=3;fabs(s)>=1e-6;i=i+2)
    {
        fz=fz*x*x;
        fm=fm*i*(i-1);
        s=fz/fm;
        s=s*m;m=-m;
        sum=sum+s;
        n++;printf("%f\n",s);
    }
    printf("迭代%d次:%f\n",n,sum);    
    
}


[ 本帖最后由 luchar 于 2011-11-14 19:15 编辑 ]
2011-11-14 19:10
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:5 
程序代码:
#include<stdio.h>
#include<math.h>
double my_sin(double x, double d, int * count)
{
    double c, r;
    int i;
    for(r = 0, c = x, i = 1; fabs(c) >= d; i++)
    {
        r += c;
        c *= -x * x;
        c /= i * 2;
        c /= i * 2 + 1;
    }
    return r;
}
int main()
{
    double x, a;
    int count;
    printf("Input x for sin(x): ");
    scanf("%lf", &x);
    a = my_sin(x, 0.000001, &count);
    printf("sin(%f) = %f, and count is %d\n", x, a, count);
    return 0;
}

重剑无锋,大巧不工
2011-11-14 19:13
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
收藏
得分:0 
u=(power(-1,n+1)*power(x,2n-1))/multi(2n-1);//先求第一项的值
2n-1
这样子很有我当年的风范。

冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2011-11-14 19:33
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
收藏
得分:0 
还有楼主注意观察公式,乘方每次都是以-x^2出现的,阶乘每次也只是增加两个数而已,所以没有必要弄个专门的乘方和阶乘的函数出来,这样只会浪费算法的时间而已,像楼上杨大哥的代码就不错,免去了重复计算乘方和阶乘的麻烦,效率提高不少。

冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2011-11-14 19:39
hhcxx2006
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2011-11-14
收藏
得分:0 
回复 4楼 waterstar
见笑了,我才刚刚接触这个,属于菜鸟级的,是要把步骤分开写么?
2011-11-14 19:56
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
收藏
得分:0 
直接定义一个自己的sin函数就可以了,楼上beyondyf大哥的代码就不错,很有参考价值。

冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2011-11-14 20:03
hhcxx2006
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2011-11-14
收藏
得分:0 
回复 3楼 beyondyf
谢谢解答,你的也是用的递推,这个我们书上已经给出代码了,能不能就用通项来求,就是利用通项公式分别计算每个累加项,这样确实很麻烦,但书上就是要求实现第二种算法,并比较这两种算法,它提示求当前项时,可用两个内层循环分别求分子和分母,不知道具体该怎么做,求教
2011-11-14 20:04
hhcxx2006
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2011-11-14
收藏
得分:0 
回复 7楼 waterstar
你们讲的都是用迭代法来求,这个书上已经给解答了,书上要求实现第二种算法,通项法,不晓得具体怎么做哦,为什么我这么写编译器会报错?

[ 本帖最后由 hhcxx2006 于 2011-11-14 20:14 编辑 ]
2011-11-14 20:09
编程的乐趣
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:229
专家分:1027
注 册:2011-4-4
收藏
得分:0 
2011-11-14 20:09
快速回复:利用泰勒级数逼近sin(x)的值,要求用通项,而非递推,各位高手帮帮忙
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025298 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved