Попытка вычислить косинус с использованием рядов Тейлора очень неточна

#python #c #math

#python #c #математика

Вопрос:

Итак, я попытался написать программу на C, которая будет аппроксимировать косинус, используя ряд Тейлора:

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

int main() {
  printf("degreestTaylortcos(degrees)n");
  for (double i=0; i<=90; i  ) {
  double factorial=1;
  double x,xn=1;
  x=i/(180/M_PI);
  double y=1;
  for (int i=1; i<30; i  ) {
    factorial*=i;
    xn*=x;
    y =((i%3==0)?(1):(i%3==1)?(0):(-1))*xn/factorial;
  }
  printf("%lft%lft%lfn",i,y,cos(x));
  }
}
 

Однако ошибка для 90 градусов составляет более 1/3:

Ошибка растет очень быстро

Я думал, что ошибка произошла из-за числовой нестабильности, вызванной double типом C. Однако, когда я переписал свою программу на Python, я получил почти тот же результат:

 import math
print("degreestTaylortcos(degrees)tdeviance")
for degrees in range(0,90 1):
  factorial=1
  x=degrees/(180/math.pi)
  xn=1
  y=1
  for i in range(1,50):
    factorial=factorial*i
    xn=xn*x
    multiplicator=0
    if i % 3 == 0:
      multiplicator=1
    elif i % 3 == 1:
      multiplicator=0
    else:
      multiplicator=-1
    y=y multiplicator*xn/factorial
  print(str(degrees) "t" str(y) "t" str(math.cos(x)) "t" str(abs(y-math.cos(x))))
 

Вы хоть представляете, что здесь происходит? Используя первые 50 членов из ряда Тейлора, он должен быть почти неотличим от реальной функции косинуса. Но это не так.

Комментарии:

1. Внутренняя реализация Python использует то же double , что и C.

2. @Max: это зависит от реализации Python. Python не устанавливает стандарт или требование. И C.

Ответ №1:

Ваша ошибка заключается в i % 3 . Термины для косинуса идут 1, 0, -1, 0, 1, 0, -1, 0….