-1

我有一个即将到来的考试,很可能会出现以下问题。如果有人可以帮助我,我将不胜感激。谢谢你。

使用 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);
   }
}

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

4

4 回答 4

2

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

于 2012-04-24T17:43:07.460 回答
0

我认为这就是你想要的:

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));
    }
}

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

于 2012-04-24T18:01:56.203 回答
0

我相信当他们说“精度为 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如果您的答案不够接近,您可以随时增加限制。

于 2012-04-24T17:49:01.170 回答
0

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

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

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

于 2012-04-24T17:49:08.440 回答