泰勒展开式
先听故事,再编程序。故事是这样的:话说sin和cos是一对夫妇。一天,sin去听相声了,cos在家。过了一会,有人敲门,cos开门一看,是一个不认识的多项式函数。cos问:你是谁啊?他说:我是你的老公sin啊。cos说:你不是去听相声了吗?怎么成这幅摸样了?他说:是啊,太乐了!故事讲完了。不懂吗?好好学高数。否则,挂了不冤。
编程序求出sin(π/2)、sin(56°)、cos(87°)、cos(π/3) 一点说明:数学库(#include)中已经提供了sin和cos函数,一般解题中我们直接调用即可,而本题要求自定义函数实现,为区别起见,分别起名为mysin和mycos。
提示和要求:(1)要求自定义函数要写在main函数之后;(2)自定义函数中求解的效率问题必须考虑(用好迭代方法);(3)关于精度:当最后一项的绝对值小于0.00001时,累加结束(求绝对值的函数也可以自定义实现);(4)为验证求解是否正确,可以调用数学库中相应的函数,输出结果以对比。
#include
#include
using namespace std;
const double pi = 3.1415926;
double mysin(double);
double mycos(double);
double myabs(double); //绝对值
double myDegtoRad(double); //角度转弧度
int main()
{
cout << "sin(π/2)的值为" << mysin(pi / 2) << endl;
cout << "利用库函数得到sin(π/2)的值为" << sin(pi / 2);
cout << endl << endl;
cout << "sin(56°)的值为" << mysin(myDegtoRad(56.0)) << endl;
cout << "利用库函数得到sin(56°)的值为" << sin(myDegtoRad(56.0));
cout << endl << endl;
cout << "cos(87°)的值为" << mycos(myDegtoRad(87.0)) << endl;
cout << "利用库函数得到cos(87°)的值为" << cos(myDegtoRad(87.0));
cout << endl << endl;
cout << "cos(π/3)的值为" << mycos(pi / 3) << endl;
cout << "利用库函数得到cos(87°)的值为" << cos(pi / 3);
cout << endl << endl;
return 0;
}
double mysin(double x)
{
double sum = x, x_pow = x, item;
int n = 1, fact = 1, sign = 1;
do
{
fact = fact * (n + 1) * (n + 2);
x_pow *= x*x;
sign = -sign;
item = x_pow / fact * sign;
sum += item;
n += 2;
}while (myabs(item) > 1e-5);
return sum;
}
double mycos(double x)
{
double sum = 1, x_pow = 1, item;
int n = 0, fact = 1, sign = -1;
do
{
fact = fact * (n + 1) * (n + 2);
x_pow *= x*x;
item = x_pow / fact * sign;
sum += item;
sign = -sign;
n += 2;
}while (myabs(item) > 0.00001);
return sum;
}
double myabs(double x)
{
return ((x >= 0)?x:-x);
}
double myDegtoRad(double x)
{
return (x/180) * pi;
}
【项目6扩展(选做)-编制三角函数表】
要求在main()函数中调用show_sin_table(min_angle, max_angle),显示角度值为min_angle到max_angle之间的所有角度(间隔为1度)的正弦值。要求不能用数学库函数,将项目6中的mysin函数拷贝到这个程序中,用于计算sin值。例如show_sin_table(0, 90)可以显示出所有0到90度的正弦值。为取得更好的效果,可以考虑像英尺到米的转换一样,以速查表格的形式给出结果。
#include
#include
using namespace std;
double mysin(double);
double myabs(double);
void show_sin_table(int, int);
const double pi = 3.1415926;
int main()
{
show_sin_table(0, 90);
return 0;
}
void show_sin_table(int iFromAngle, int iToAngle)
{
int x, count = 0;
cout << "由" << iFromAngle << "°到"
<< iToAngle << "°的三角函数表:" << endl;
cout << setiosflags(ios::fixed) <<
setiosflags(ios::right) << setprecision(4);
for (x = 0; x < 3; x++)
cout << setw(8) << " 角度x" << setw(12) << " sin(x)";
cout << "\n";
for (x = iFromAngle; x <= iToAngle; x++)
{
cout << setw(8) << x << setw(12);
cout << mysin(x*pi/180);
if (count%3 == 2) cout << "\n";
++count;
}
cout << "\n";
return;
}
double mysin(double x)
{
double sum = x, x_pow = x, item;
int n = 1, fact = 1, sign = 1;
do
{
fact = fact * (n + 1) * (n + 2);
x_pow *= x*x;
sign = -sign;
item = x_pow / fact * sign;
sum += item;
n += 2;
}while (myabs(item) > 1e-5);//1e-5 到123°就算不了了
return sum;
}
double myabs(double x)
{
return ((x >= 0)?x:-x);
}
如果觉得《正弦函数泰勒展开c语言 C++ 学习笔记_0012_函数(泰勒展开式 三角函数表)》对你有帮助,请点赞、收藏,并留下你的观点哦!