【问题标题】:Using a Taylor series to find sin(x) in C使用泰勒级数在 C 中找到 sin(x)
【发布时间】:2021-03-19 04:51:06
【问题描述】:

我的教授希望我们使用泰勒级数计算 sin(x)。他希望我们在两个连续分数之间的差小于 10^-6 时停止迭代。

我最终解决了这个问题,例如 x^5/5!与 (x^3/3!) * (x^2/4*5) 相同,并且对于所有分数都是如此。所以我可以保留我计算的前一个分数并在下一次迭代中使用它。问题是我最终得到的数字与它的实际罪恶有点偏离,我不知道为什么。提前谢谢。这是我的代码:

#include <stdio.h>
#include <Math.h>
#define pi 3.14159265358979323846

int main(int argc, int **argv){
    
    int sign = -1, pwr = 3;
    double previous, current, rad,sum, degr;
    printf("Calculating sin using Taylor Series\n\n");
    printf("Give degrees: ");
    scanf("%lf", &degr);
    
    // translate to rads
    rad = degr*(pi/180);
    
    sum = rad;
    previous = rad;
    do{
        current = (previous * pow(rad, 2))/(pwr* pwr-1);
        
        sum += sign*current;
        pwr += 2;
        sign *= -1;
    }
    while(abs(current - previous) > pow(10, -6));
    
    printf("The sin of %lf degrees is ", degr);
    printf("%.6f\n", sum);
    printf("%.6f", sin(rad));
    return 0;   
}

【问题讨论】:

  • 不应该(pwr* pwr-1)(pwr * (pwr-1)) 吗?
  • 在我纠正之后答案确实发生了变化,但仍然有些偏离。我希望至少有 6 个小数与 sin(x) 函数相同,但充其量我得到 2 个。:(
  • 您的意思是在循环中的某处设置previous = current 吗?如果在循环之前将 previous = rad; 更改为 current = rad; 它可以是循环中的第一条指令。
  • @WeatherVane 天哪,你是绝对正确的,我忘了在循环中添加它。但即使在更正之后它仍然关闭,也许我应该以不同的方式进行计算?
  • 很好,但请不要对代码进行“实时”更新。问题应保持原样(除非发布得不够好或为清楚起见进行了编辑)。

标签: c trigonometry taylor-series


【解决方案1】:

您正在使用abs 函数,该函数需要int 并返回int。如果当前项与前项之间的差小于 1,则会导致循环存在,因为它将 diff 设置为 0。

相反,您需要fabs,它期望并返回double

【讨论】:

  • 天哪,非常感谢,这解决了它:D
猜你喜欢
  • 1970-01-01
  • 2018-06-23
  • 2021-08-13
  • 2016-06-04
  • 2020-02-20
  • 1970-01-01
  • 2020-04-01
  • 2016-01-24
  • 2016-02-01
相关资源
最近更新 更多