【问题标题】:How to write a program to estimate the sine function as a Taylor series in C?如何编写程序将正弦函数估计为 C 中的泰勒级数?
【发布时间】:2013-10-01 07:47:18
【问题描述】:

我是编程新手,我无法弄清楚我的代码有什么问题。如果有人可以帮助我了解我的程序出了什么问题,我将不胜感激。我已经在这个问题上工作了两个小时,我知道我正在让它变得比需要的更难。这是我的新代码。我的新输出是 0.000000476837158。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main() {
         double x, sinx, z, factorial, term;
         int j, n, i;
         x=0.5;
         n=10;
         i=0;
         z=sin(0.5);
         for(int i=0; i<=n; i++){
                      factorial = 1;
                      for(j=2*i +1; j<=i; j++)
                      {
                               factorial = factorial * j;
                               }
                      term=(pow(-1,i)*pow(x,2*i+1))/(factorial);
                      sinx=term++;
                      i=i++;
                                   }
                      printf("sin(0.5) is approximately %.15lf\n", sinx);
                      printf("sin(0.5) by default function is %.15lf\n", z);
                      system("pause");
                      return 0;
                      }

【问题讨论】:

  • 你实际得到了什么输出?
  • 它不会产生任何输出,只是一个空白屏幕
  • 你计算了factorial(不正确)然后从不使用它。
  • 不要使用泰勒系数来建立一个统一精确的近似值(但你还没有)。 lolengine.net/blog/2011/12/21/better-function-approximations
  • 我必须使用 TAylor 系数来解决问题

标签: c trigonometry taylor-series


【解决方案1】:

这个循环没有意义。

 for(j=0; j<=i; j++){
     factorial=2*j+1;
     }

它与

没有什么不同
factorial = 2*i+1;

如果您想计算阶乘(如 i!),我会执行以下操作

// initialize `factorial`
factorial = 1;
for(j=1; j<=i; j++)
{
    //multiply `factorial` by `j`.  
    factorial = factorial * j;
}

您继续使用sinxterm,但它们从未被初始化。这意味着它们将包含垃圾值。


i++ 自己添加,您不必使用任何额外的赋值运算符。

改变

i=i++;

简单

i++;

或者更好的是,使用for 循环而不是while 循环

for(int i=0; i<=n; i++)

【讨论】:

  • 我像你建议的那样输入了阶乘@Sam 我是我也删除了第一次出现的 sinx=sinx+term。但我仍然没有得到任何输出。
  • 所以我按照建议将 while 循环更改为 for 循环,并更改了包含 j=0 的 j 值的 for 循环,这给了我 1.#INF000000 的输出,然后使 j=1这给了 0.000000000000131
【解决方案2】:

您的第 ith 项是 -1i x2i+1/i,它会快速增长。您应该打印出前几个术语来发现问题。

(还有其他问题,比如i=i++;,但他们可以等待。)

【讨论】:

  • i=i++; 可以等吗?在标记为“C”的问题中?!
  • 这是我在解决了你们纠正我的一些问题后的新源代码:
【解决方案3】:

此语句的第一次出现

     sinx=sinx+term;

将是您的问题之一,因为当您第一次使用它们时,赋值的 rhs 上的变量都没有被初始化。循环内同一行的后续执行将在整个计算过程中传播sinx 的垃圾值。

我预计还有其他问题,但没有仔细检查代码。

【讨论】:

  • 我想我对如何初始化这些变量有点困惑
猜你喜欢
  • 2017-12-02
  • 2021-02-19
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
  • 2017-04-10
  • 2015-06-20
  • 1970-01-01
  • 2020-02-04
相关资源
最近更新 更多