c++泰勒级数

C++ Taylor series

本文关键字:c++      更新时间:2023-10-16

嗨,我已经使用了这段代码,但是它输出给我的是0.00159265而不是0。问题在哪里?

我已经用泰勒展开法计算了sin:

#include <iostream>
#include <conio.h>
using namespace std;
double sin(double x)
{
       double value = x ;
       value -=(x*x*x)/6.0 ;
       value +=(x*x*x*x*x)/120.0; 
       value -=(x*x*x*x*x*x*x)/5040.0 ;
       value +=(x*x*x*x*x*x*x*x*x)/362880.0;
       value -=(x*x*x*x*x*x*x*x*x*x*x)/39916800.0;
       value +=(x*x*x*x*x*x*x*x*x*x*x*x*x)/6227020800.0;
       value -=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/1307674368000.0;
       value +=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/355687428096000.0;
       value -=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/121645100408832000.0;
       value +=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/51090942171709440000.0;
       value -=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/25852016738884976640000.0;
       value +=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/15511210043330985984000000.0;
       value -=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/10888869450418352160768000000.0;
       value +=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/8841761993739701954543616000000.0;
       return value;
}
int main()
{
 cout<<sin(3.14);
 getche();
 return 0;
}

:

我已经在x和3.1415之间移动了我的点和发散半径,现在更正了:

double sin(double x)
{
       x=x-3.1415;
       double value = x ;
       value -=(x*x*x)/6.0 ;
       value +=(x*x*x*x*x)/120.0; 
       value -=(x*x*x*x*x*x*x)/5040.0 ;
       value +=(x*x*x*x*x*x*x*x*x)/362880.0;
       value -=(x*x*x*x*x*x*x*x*x*x*x)/39916800.0;
       value +=(x*x*x*x*x*x*x*x*x*x*x*x*x)/6227020800.0;
       value -=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/1307674368000.0;
       value +=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/355687428096000.0;
       value -=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/121645100408832000.0;
       value +=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/51090942171709440000.0;
       value -=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/25852016738884976640000.0;
       value +=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/15511210043330985984000000.0;
       value -=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/10888869450418352160768000000.0;
       value +=(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)/8841761993739701954543616000000.0;
       return value;
}

但它是给我一个相反的例子:pi/2 = -1和3*pi/2 = 1

为什么应该是零呢?sin(pi)是0,但这不是你计算的,你计算的是sin(3.14)的近似值

因为sin(3.14) = 0.0015926529164868282,且不为零。

注意pi - 3.14 ~ 0.0015926536...sin(pi - x) ~ x,这与您的结果一致。

Pi不是3.14

关于更新的代码,您的半径调整不正确。需要平移2π弧度的倍数。移动了π弧度。为了更普遍地适用,你的代码应该以2π弧度的倍数移动,直到它在-π到π的范围内。这可以通过一个加法来完成。

你还应该使用一个精确的π值

请注意,对于x的大值,sin(x)的展开收敛性很差。您应该将x移动的倍数,这样x就在π的范围内。这利用了sin是周期的这一事实。

如果你做这样的改变,你将能够在你的扩展中使用更少的术语。

我还建议将您的扩展编写为for循环。这将使您更容易试验,以找出需要多少术语才能获得准确的答案。

相关文章:
  • 没有找到相关文章