Разложение cosec в ряд Тейлора C++?

Помогите пожалуйста решить проблему. Нужно написать программу, которая вычисляет значение cosec с некоторой погрешность (epsilon) с помощью разложения в ряд Тейлора.

Мой вариант
double cosec_func(double X, double epsilon)
{double n=0,sum=0;
 
 while(abs(f(n,sum)-f(n+1,sum))<epsilon)
  {
     sum=f(n,sum);
     n++;
     
  }
 
    return (1/X)+f(n,sum);
}
 
double fact(double x)
{
    if (x<=1) return 1;
    else return x*fact(x-1);
}
 
double f(double n, double sum)
{      
            sum += ( 2*(pow(2,2*n+1)-1) ) /( fact(2*n+2));
            return sum;
 
        
 }


Но получаемые значения далеки до идеала.

8938264423f84fe3bd6f3dfd68de61a3.png
  • Вопрос задан
  • 6386 просмотров
Решения вопроса 1
ManWithBear
@ManWithBear
Swift Adept, Prague
Советую почти полностью переписать код, хорошенько его оптимизировав. Например бессмысленно находить каждый раз 2^(2n+1), зная значение 2^(2n-1). Тоже самое для факториала.
В итоге нахождение косинуса поместится в 1 цикл и для определения достижения необходимой точности не понадобится 2жды вызывать две довольно затратные функции.

UPD. И в этом условии:
abs(f(n,sum)-f(n+1,sum))<epsilon
должен стоять знак больше

UPD2. для double и float лучше использовать функцию
double fabs (double x);
float fabs (float x);
long double fabs (long double x);


UPD3. По поводу оптимизации, я имел в виду нечто такое:
double sin(double x, double EPS) {
    double result = x;
    double delta = x;
    for (int n=1; fabs(delta)>EPS; n++) {
        delta *= x/(2*n)*x/(2*n+1);
        delta *= -1;
        result+=delta;
    }
    return result;
}
double cosec(double x, double EPS) {
    return 1.0f/sin(x, EPS);
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@parkito Автор вопроса
@ManWithBear
Вот что получилось:
double func(double X, double epsilon)
{
    double r = 0, r1=0;
	r+=pow(X,1)/fact(1);
			r1=r + pow(-1,2.0)*pow(X,3)/fact(3);

    for(double n=0;fabs(r-r1)>epsilon;n++) 
        {
			r+=pow(-1,n)*pow(X,2*n+1)/fact(2*n+1);
			r1=r + pow(-1,n+1)*pow(X,2*n+1+1)/fact(2*n+1+1);
			
        }
	return 1/r;
}
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы