簡體   English   中英

用泰勒級數計算 sin(x)

[英]Calculating sin(x) with Taylor series

任務:根據泰勒級數 sin(x) 計算,使用名為mysin的雙精度 function 將其傳遞給雙精度變量。 從用戶處獲取 ax 值並使用 mysin function 計算 sin(x)。

Sin()x 泰勒級數公式

問題是程序給了我錯誤的 sin(x) 值。 我一直試圖解決這個問題大約 4 個小時,但找不到。 是因為 sin(x) function 還是我錯過了代碼中的某些內容?

我的代碼:

#include <stdio.h>

double mysin(double x)
{
    double value = x;
    double sum = x;
    int neg_pos = 1;
    int fac = 1;
    
    int counter = 0;
    
    while(1)
    {
        neg_pos *= -1;
        fac += 2;
        
        value = value/(fac*(fac-1));
        value = value*x*x*neg_pos;

        sum += value;
        
        //printf("Hello");
        counter++;
        if (counter == 100) break;
    }
    return sum;
}

int main()
{
    double number;
    scanf("%lf",&number);
    printf("%g",mysin(number));
    //printf("%g",number);
}

問題是你每一步都乘以neg_pos ,它在 +1 和 -1 之間切換。 這意味着術語只有一半的時間改變符號,而它們每次都應該改變符號。

解決方法是每次只乘以 -1 而不是neg_pos

這是你的程序的一個工作的、稍微簡化的形式,它計算從 0 到 3 的數字范圍的 sin,顯示要比較的 stdlib 計算。

#include <math.h>
#include <stdio.h>

double mysin(double x) {
    double value = x;
    double sum = x;
    int fac = 1;
    
    for (int counter = 0; counter < 100; counter++) {
        fac += 2;
        value = -value*x*x/fac/(fac-1);
        sum += value;
    }
    return sum;
}

int main() {
    for (double x = 0.0; x < 3.0; x += 0.1) {
       printf("%g: %g %g\n", x, mysin(x), sin(x));
    }
}

您還可以避免使用單獨的faccounter變量,可能像這樣:

double mysin(double x) {
    double term=x, sum=x;
    for (int f = 0; f < 100; f++) {
        term = -term*x*x/(2*f+2)/(2*f+3);
        sum += term;
    }
    return sum;
}

據我了解,您沒有正確計算功率首先使用這個:

#include <math.h>

然后創建一個階乘 function:

int factorial(int x){
   int result = 1;
   for(int i = 1; i < x; i++){
      result += result * i;
   }
   return result;
}

最后:

while(1)
 {
    neg_pos *= -1;
    fac += 2;
    
    power = pow(x,fac);
    fac = factorial(fac);

    sum += power/fac;
    
    //printf("Hello");
    counter++;
    if (counter == 100) break;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM