Разложить sin и cos в ряд Тейлора - C (СИ)
Формулировка задачи:
Помогите с задачей. Необходимо разложить sin и cos в ряд Тейлора. Программа работает только для промежутка [-П/4;П/4]. Подскажите как дописать для остальных х(я понимаю, что разница в начальных значениях и знаках, но реализовать не выходит).
#define _USE_MATH_DEFINES #include <conio.h> #include <stdio.h> #include <math.h> void main(){ double x,e; printf("vvedite x,e \n"); scanf("%lf %lf",&x,&e); int n,f=0,s=1;// s-знак, f-функция sin или cos, n-число вхождений периода(в х) //сносим x на промежуток [-Pi/4,Pi/4] //1 if(x<0) {x=-x; s=-s;} //2 if(x>=M_PI*2) {n=x/(2*M_PI); x-=2*M_PI*n; f=0;} //3 if(x>=M_PI) {x=2*M_PI-x; s=-s;f=0;} //4 if(x>=(M_PI/2)) {x=M_PI-x; f=0;} //5 if(x>=M_PI/4) {x=M_PI/2-x; f=!f;} if (f==0){ int i = 1; double sin=x,p=x,q=1,l=x; // начальные условия: p-числитель, q-знаменатель, l-член ряда while(l>=e){ i+=2; s=-s; double x2=x*x; p*=x2; q/=(i-1)*i; l=s*p*q; sin+=l; } printf("sin=%lf",sin); } //else //? getch(); }
Решение задачи: «Разложить sin и cos в ряд Тейлора»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #define PI 3.1415926535897932384626433832795 float myFabs(float x){ return x>0?x:-x; } float mySin(int nx,float e){ float y,y0,a,b,x; int n; x=(nx%360)*PI/180; for(y=0,a=x,b=n=1;;){ if(myFabs(y0=a/b)<e) break; y+=(n&1?1:-1)*y0; a*=x*x; b*=(2*++n-1)*(2*n-2); } return y; } int main(){ float e; int x; printf("vvedite x: \n"); scanf("%d",&x); printf("vvedite e: \n"); scanf("%f",&e); printf("sin(%d)=%f\n",x,mySin(x,e)); system("pause"); return 0; }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы
- Определяем константу PI с помощью математической константы 3.1415926535897932384626433832795
- Объявляем функцию myFabs(float x), которая возвращает абсолютное значение числа x
- В функции mySin(int nx,float e) объявляем переменные y, y0, a, b, x, n
- Вычисляем значение x в радианах, используя формулу (nx%360)*PI/180
- Задаем начальные значения для y, a и b равными x
- Начинаем цикл, который будет выполняться до тех пор, пока абсолютное значение y0 меньше заданной точности e
- В каждой итерации цикла прибавляем к y значение y0, умноженное на (n&1?1:-1)
- Умножаем a на xx и b на (2n-1)(2n-2)
- Увеличиваем значение n на 1
- После завершения цикла возвращаем значение y
- В функции main() запрашиваем у пользователя ввод значения x и e
- Вызываем функцию mySin(x,e) и выводим результат на экран
- Ждем нажатия клавиши пользователем с помощью system(
pause
) - Возвращаем 0, чтобы указать, что программа успешно завершилась
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д