计算收敛系列,C#

本文关键字:系列 计算 | 更新日期: 2023-09-27 18:32:04

我即将参加考试,以下问题很可能会出现。如果有人能帮助我,我将不胜感激。谢谢。

使用 C# 编写一个过程来计算以下收敛序列,精度为 10^-10。

x^(2n-1)/(2n-1)!

我试过了:

class Program 
{ 
    static void Main(string[] args) 
    {
        double x, y, numerator, denominator, answer,  e = Math.Pow(10,-10);
        x = int.Parse(Console.ReadLine());
        int n = 0;
        do
        {
            numerator = Math.Pow(x, (2 * n - 1));
            denominator = (2 * n - 1);
            answer = (numerator / denominator);
            n++;
        }
        while (answer < e);
   }
}

我认为我最大的问题是试图调用阶乘函数。

计算收敛系列,C#

请注意,x^(2n+1) = x^(2n-1) * x^2(2n+1)! = (2n-1)! * 2n * (2n + 1) 。使用此公式,您可以在循环的每次迭代中分别从前一个分子和分母轻松重新计算分子和分母。其余的留给读者。

我相信当他们说"精度为 10^-10"时,这意味着答案的变化小于一次传递到另一次传递的变化。 您的循环看起来不错,但您正在检查答案本身,而不是通过之间的变化。 请尝试此更改:

double lastAnswer = 0.0, delta;   // couple more vars
do
{
    // ... keep current code in loop, add these two lines below
    delta = abs(answer - lastAnswer);   // the change between passes is what's important
    lastAnswer = answer;                // and save last answer for next delta
}
while (delta < e);    // change condition to check difference

您也可以对 n 进行"健全性检查"测试:

while ((delta < e) && (n < 10000000));

如果您的答案不够接近,您可以随时增加n的限制。

如果您唯一的问题是如何进行阶乘,本文可能会有所帮助:

http://guyellisrocks.com/algorithms/factorial-function-in-c/

他提出了一个很好的观点,即不需要每次都重新计算这些值。

我认为这就是你想要的:

class Program
{
    static void Main(string[] args)
    {
        const double tol=1e-10;
        double x = 1;
        if(args.Length>0)
        {
            double.TryParse(args[0], out x);
        }
        int n=1;
        const int n_max=100;
        double y=x;
        while(n<n_max && y>tol)
        {
            y=y*x*x/(2*n*(2*n+1));
            n++;
        }
        Debug.WriteLine(string.Format( "x={0:R}, y={1:R}, n={2}", x, y, n));
    }
}

为什么?好吧,这是您可以自己弄清楚的部分。