Добавил:
okley
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:1 семестр / sr6
.c#include <stdlib.h>
#include <math.h>
int sgn(double x){ // Вспомогательная функция sign
if (x>0){
return(1);
}
else if(x<0){
return(-1);
}
else{
return(0);
}
}
int fact(int x) // Вспомогательная функция факториала
{
int m, S=1;
for(m=1; m<=x; m+=1){
S*=m;
}
return(S);
}
double rpow(double k, int l){ // Вспомогательная функция возведения в степень
int j;
double P=1.0;
for(j=1; j<=l; j+=1){
P*=k;
}
return(P);
}
double ryad(double z) // Вспомогательная функция нахождения суммы ряда
{
int n=0;
double sum=0.0;
while(fabs(sum+0.2)>0.00001){
sum+=pow(-1, n)*rpow(z, 2*n+1)/((double)(fact(2*n+1)));
n++;
}
printf("%.5f\n", sum);
printf("%d\n", n);
}
int main(void){
double x01, x02, a=5.0, b=8.0, x1, e1; // Делим общую область на две части ввиду наличия двух корней: sgn(f(a))=-sgn(f(b))
int n1=0, n2=0; // Счётчик итераций
e1=fabs(a-b); // Погрешность по y
while(fabs(a-b)>0.000001){ // Цикл биссекции для первого корня
n1++;
if ((sin((a+b)/2.0))+0.2>0){
b=(a+b)/2.0;
}
else{
a=(a+b)/2.0;
}
}
x1=(a+b)/2.0; // Корень 1
e1/=pow(2, n1);
double x2, e2;
a=8.0;
b=10.0;
e2=fabs(a-b);
while(fabs(a-b)>0.000001){ // Второй цикл биссекции
n2++;
if ((sin((a+b)/2.0)+0.2)<0){
b=(a+b)/2.0;
}
else{
a=(a+b)/2.0;
}
}
x2=(a+b)/2.0; // Корень 2
e2/=pow(2, n2);
if(x1>x2){ // Проверка того, больше ли корень 2 корня 1.
x01=x1;
x1=x2;
x2=x01;
x01=e1;
e1=e2;
e2=e1;
}
x01=x1;
x02=x2;
while(x01-2*M_PI>-1){ // Нормализация корня 1 для избежания расхождения ряда
x01-=2*M_PI;
}
if(x01>1){
x01=sgn(sin(x1))*fabs(x01-M_PI);
}
while(x02-2*M_PI>-1){ // Нормализация корня 2 для избежания расхождения ряда
x02-=2*M_PI;
}
if(x02>1){
x02=sgn(sin(x2))*fabs(x02-M_PI);
}
printf("%.6f\n", x1);
printf("%.8f\n", e1);
ryad(x01);
printf("%.6f\n", x2);
printf("%.8f\n", e2);
ryad(x02);
}
