第四章函数--函数初体验项目5太乐(泰勒)了

上机内容:先听故事,再编程序。故事是这样的:话说sin和cos是一对夫妇。一天,sin去听相声了,cos在家。
      过了一会,有人敲门,cos开门一看,是一个不认识的多项式函数。cos问:你是谁啊?
    他说:我是你的老公sin啊。cos说:你不是去听相声了吗?怎么成这幅摸样了?他说:是啊,太乐了!
    编程序求出sin(π/2)、sin(56°)、cos(87°)、cos(π/3)
 一点说明:数学库(#include<Cmath>)中已经提供了sin和cos函数,一般解题中我们直接调用即可,
    而本题要求自定义函数实现,为区别起见,分别起名为mysin和mycos。
    提示和要求:
(1)要求自定义函数要写在main函数之后;
(2)自定义函数中求解的效率问题必须考虑(用好迭代方法);
(3)关于精度:当最后一项的绝对值小于0.00001时,累加结束(求绝对值的函数也可以自定义实现);
(4)为验证求解是否正确,可以调用数学库中相应的函数,输出结果以对比。

                  sin x和cos x的泰勒展开式:

                 
上机目的:利用函数编程
我的程序:
/*
* 程序的版权和版本声明部分:  
* Copyright (c) 2013, 青岛农业大学理信学院  
* All rights reserved.  
* 文件名称:泰勒了.cpp  
* 作    者:幻影行者  
* 完成日期:2013 年 8 月 4 日  
* 版 本 号:v1.0  
* 对任务及求解方法的描述部分: :  
* 问题描述: 先听故事,再编程序。故事是这样的:话说sin和cos是一对夫妇。一天,sin去听相声了,cos在家。
             过了一会,有人敲门,cos开门一看,是一个不认识的多项式函数。cos问:你是谁啊?
             他说:我是你的老公sin啊。cos说:你不是去听相声了吗?怎么成这幅摸样了?他说:是啊,太乐了!
             编程序求出sin(π/2)、sin(56°)、cos(87°)、cos(π/3)
            一点说明:数学库(#include<Cmath>)中已经提供了sin和cos函数,一般解题中我们直接调用即可,
             而本题要求自定义函数实现,为区别起见,分别起名为mysin和mycos。
             提示和要求:
            (1)要求自定义函数要写在main函数之后;
            (2)自定义函数中求解的效率问题必须考虑(用好迭代方法);
            (3)关于精度:当最后一项的绝对值小于0.00001时,累加结束(求绝对值的函数也可以自定义实现);
            (4)为验证求解是否正确,可以调用数学库中相应的函数,输出结果以对比。  
* 问题分析:由sin和cos的泰勒展开式容易看出,式中每一项都是加一项减一项,而sin中的每一项
            的分子是x的奇数次方,分母是奇数的阶乘()cos中的每一项的分子是x的偶数次方,分母
			是偶数的阶乘,此处所说的奇数(偶数)均是指连续的奇数(偶数),即每次加2。
			注意sin展开式第一项是x,而cos展开式第一项是1
* 算法设计:略  
*/

#include<iostream>
#include<cmath>
using namespace std;
const double pi=3.141592653;   //常变量的使用
double myabs(double);    //自定义求绝对值函数,用于判断循环结束条件,设置类型为double,因需要设置精度小于0.00001时结束累加
double mysin(double);    //自定义sin函数
double mycos(double);    //自定义cos函数
double factorial(double); // 自定义求阶乘的函数
int main()
{
    
	cout<<"库函数的sin(π/3):"<<sin(pi/2)<<endl;
    cout<<"自定义的mysin(π/3):"<<mysin(pi/2)<<endl;
	
    cout<<"库函数的sin(56°):"<<sin(56*pi/180)<<endl;
    cout<<"自定义的mysin(56°):"<<mysin(56*pi/180)<<endl;
    
    cout<<"库函数的cos(87°):"<<cos(87*pi/180)<<endl;
    cout<<"自定义的cos(87°):"<<mycos(87*pi/180)<<endl;
	
	cout<<"库函数的cos(π/3):"<<cos(pi/3)<<endl;
    cout<<"自定义的cos(π/3):"<<mycos(pi/3)<<endl;
	
	return 0;
}


//自定义sin函数
double mysin(double x)
{
	int k=1,sign=-1;  // sign用于控制每一项前面的符号,为方便计算,从第二项开始,故sign初值为-1,k=1
	double sum=x,item;     //sum代表函数值,从第二项开始,sum初值为x,item代表每一项的值
	double n=x,d;    // n代表分子(numerator),d代表分母(denominator)
	do
	{
		n*=(x*x);      //每一项的分子中,x的幂都相应地比它前一项多2
		d=factorial(2*k+1);   //调用factorial函数求阶乘,每一项的分母中都是奇数的阶乘
		item=sign*(n/d);   //计算每一项的值,并累加到sum中
		sum+=item;  
		sign=-sign; // 实现加一项减一项
		++k;
		}while(myabs(item)>1e-5);  /*思维误区:易写成myabs(item)<1e-5,正确理解,“当最后一项的绝对值小于0.00001时,累加结束”*/
	
	return sum;
	
}


//自定义cos函数
double mycos(double x)
{
	int k=1,sign=-1;  
	double sum=1,item;     //相比于mysin函数,这里sum初值为1
	double n=1,d;          //这里n=1
	do
	{
		n*=(x*x);      
		d=factorial(2*k);   //每一项的分母中都是偶数的阶乘
		item=sign*(n/d);   
		sum+=item;  
		sign=-sign; 
		++k;
	}while(myabs(item)>1e-5); 
	return sum;
	
}

//自定义求绝对值的函数
double myabs(double a)
{
	//return((a>=0)?a:-a);
	if(a>=0)
		return a;
	else 
		return -a;		
}

//自定义求阶乘的函数
double factorial(double a)
{
	double sum=1;
	for(int i=1;i<=a;++i)
		sum*=i;
	return sum;
}

运行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值