Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdlib.h>
- #include <math.h>
- #include <stdio.h>
- void solve_equation(double precision, double a, double b); //Находит корень уравнения x^2-sin(5x) методом хорд
- void solve_integral(double precision, double a, double b, int n); //Находит интеграл от cos(x)/x
- double f1(double x); //Возвращает значение x^2-sin(5x) для известного x
- double f2(double x); //Возвращает cos(x)/x для известного x
- int main()
- {
- double pi = 4 * atan(1);
- solve_equation(0.001, 0.5, 0.6);
- solve_integral(0.0005, -pi/2, pi, 10);
- return 0;
- }
- void solve_equation(double precision, double a, double b) //Находит корень уравнения x^2-sin(5x) методом хорд
- {
- double x, f_b, f_a, f_x;
- while (1)
- {
- f_a = f1(a);
- f_b = f1(b);
- if (fabs(b - a) < precision) //Проверяем, меньше ли длина отрезка допустимой погрешности
- {
- printf("%lf\\n",a); //Если да - за корень уравнения принимается левая граница отрезка
- return;
- }
- else
- {
- x = (a*f_b - b * f_a) / (f_b - f_a);
- //TODO: обработка ошибок
- }
- f_x = f1(x);
- if ((fabs(fabs(f_x) - precision) <= (precision / 2))||(fabs(f_x) < precision)) //Проверяем, меньше ли значение функции от x допустимой погрешности
- {
- printf("%lf\n", x); //Если да - корень уравнения найден с заданной точностью
- return;
- }
- else //Если решение с заданной точностью не найдено
- {
- if ((f_a*f_x) < 0) //Являются ли знаки функции на границах отрезка [a;x] разными
- {
- b = x; //Если да - то принимаем правую границ интервала [a;b] за x
- }
- else
- {
- a = x; //Если нет - то принимаем левую границ интервала [a;b] за x
- }
- }
- }
- }
- void solve_integral(double precision, double a, double b, int n) //Находит интеграл от cos(x)/x
- {
- double S0 = 0, S1 = 0, h;
- int k = 5, i;
- h = fabs(b - a) / n;
- for (i = 0; i < n; i++)
- {
- S0 += f2(a + h * i + h / 2);
- }
- S0 *= h;
- while (1)
- {
- n += k;
- h = fabs(b - a) / n;
- S1 = 0;
- for (i = 0; i < n; i++)
- {
- S1 += f2(a + h * i + h / 2);
- }
- S1 *= h;
- if ((fabs(S0 - S1) < precision) || (fabs(fabs(S0 - S1) - precision) <= (precision / 2)))
- {
- //TODO: обработка ошибок
- printf("%lf\n", S1);
- return;
- }
- else
- {
- S0 = S1;
- }
- }
- }
- double f1(double x) //Возвращает значение x^2-sin(5x) для известного x
- {
- //TODO: обработка ошибок
- return(x*x-sin(5*x));
- }
- double f2(double x) //Возвращает cos(x)/x для известного x
- {
- //TODO: обработка ошибок
- return (cos(x) / x);
- }
Add Comment
Please, Sign In to add comment