Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
0
Добавлен:
16.11.2025
Размер:
2.35 Кб
Скачать
#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);
}
Соседние файлы в папке 1 семестр