在c ++中使用泰勒级数计算Pi的函数

所以我对为什么我的代码不工作而感到茫然,实际上我正在写的函数使用泰勒系列计算Pi的估计值,只要我尝试运行程序就会崩溃。

这是我的代码

#include <iostream>
#include <math.h>
#include <stdlib.h>
using namespace std;

double get_pi(double accuracy)
{
double estimate_of_pi, latest_term, estimated_error;
int sign = -1;
int n;

estimate_of_pi = 0;
n = 0;

do
{
    sign = -sign;
    estimated_error = 4 * abs(1.0 / (2*n + 1.0));  //equation for error
    latest_term = 4 * (1.0 *(2.0 * n + 1.0));      //calculation for latest term in series
    estimate_of_pi = estimate_of_pi + latest_term; //adding latest term to estimate of pi
    n = n + 1;                                     //changing value of n for next run of the loop
}
while(abs(latest_term)< estimated_error);

return get_pi(accuracy);

}

int main()
 {
    cout << get_pi(100);
 }

代码背后的逻辑如下:

  • 定义所有变量
  • 设定pi的估计值为0
  • 根据泰勒级数计算一个术语并计算此术语中的误差
  • 然后它将最新的术语添加到pi的估计中
  • 然后程序应该计算出系列中的下一个单词和它中的错误,并将其添加到pi的估计中,直到while语句中的条件满足
  • 感谢您的帮助,我可能会得到


    你的功能有几个错误。 以“// NOTE:”开始,看到我的评论。

    double get_pi(double accuracy)
    {
       double estimate_of_pi, latest_term, estimated_error;
       int sign = -1;
       int n;
    
       estimate_of_pi = 0;
       n = 0;
    
       do
       {
          sign = -sign;
    
          //NOTE: This is an unnecessary line.
          estimated_error = 4 * abs(1.0 / (2*n + 1.0));  //equation for error
    
          //NOTE: You have encoded the formula incorrectly.
          // The RHS needs to be  "sign*4 * (1.0 /(2.0 * n + 1.0))"
          //                       ^^^^          ^
          latest_term = 4 * (1.0 *(2.0 * n + 1.0));      //calculation for latest term in series
          estimate_of_pi = estimate_of_pi + latest_term; //adding latest term to estimate of pi
          n = n + 1;                                     //changing value of n for next run of the loop
       }
    
       //NOTE: The comparison is wrong.
       // The conditional needs to be "fabs(latest_term) > estimated_error"
       //                              ^^^^             ^^^
       while(abs(latest_term)< estimated_error);
    
       //NOTE: You are calling the function again.
       // This leads to infinite recursion.
       // It needs to be  "return estimate_of_pi;"
       return get_pi(accuracy);    
    }
    

    另外, main的函数调用是错误的。 它需要是:

    get_pi(0.001) 
    

    以表明如果该项的绝对值小于0.001,该函数可以返回。

    以下是适用于我的功能的更新版本。

    double get_pi(double accuracy)
    {
       double estimate_of_pi, latest_term;
       int sign = -1;
       int n;
    
       estimate_of_pi = 0;
       n = 0;
    
       do
       {
          sign = -sign;
          latest_term = sign * 4 * (1.0 /(2.0 * n + 1.0));  //calculation for latest term in series
          estimate_of_pi += latest_term;                    //adding latest term to estimate of pi
          ++n;                                              //changing value of n for next run of the loop
       }
       while(fabs(latest_term) > accuracy);
    
       return estimate_of_pi;
    }
    

    您的退货声明可能是原因。

    尝试返回“estimate_of_pi”而不是get_pi(准确性)。


    您的休息条件可以重写为

    2*n + 1 < 1/(2*n + 1)     =>   (2*n + 1)^2 < 1
    

    对于任何肯定的n ,这都不会true 。 因此你的循环永远不会结束。 解决此问题后,您应该将return语句更改为

    return estimated_error;
    

    您目前正在递归调用函数而没有结束(假设您修复了停止条件)。

    无论如何,你有一个sign和参数的accuracy ,你完全不用在计算中。

    我对这样的迭代的建议是总会在最大迭代次数上打破。 在这种情况下,你知道它会收敛(假设你修复了数学),但是总的来说,你永远无法确定你的迭代收敛了。

    链接地址: http://www.djcxy.com/p/12245.html

    上一篇: Function for calculating Pi using taylor series in c++

    下一篇: Finding Laurent Series Of a function using Python