Advertisement
shadeyourself

integral equation

May 16th, 2020
1,178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.95 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. // ищем интеграл: dt / (t * sqrt(1 + t^4))
  5. // делаем замену: t = tan(u), dt = du / cos^2 u
  6. // заменяем интервалы: x-> arctan(x), inf -> pi/2
  7. // du / (tan(u) * sqrt(1 + tan^4(u)) * cos^2 (u)) = du / sin(x) / cos(x) / sqrt(1 + tan(u)^4)
  8. double f1(double u) {
  9.     return 1.0 / (sin(u) * cos(u) * sqrt(1 + pow(tan(u), 4)));
  10. }
  11.  
  12. // вторая функция
  13. double f2(double t) {
  14.     return 1.0 / sqrt(1 + t*t*t*t);
  15. }
  16.  
  17. // интегрирование с заданной точностью
  18. double integrate(double (*f)(double), double a, double b, long n) {
  19.     double h = (b - a) / n; // шаг интегрирования
  20.     double sum = 0, sum1;
  21.    
  22.     // вычисляем значение интеграла для n = 2
  23.     for (int i = 1; i <= n / 2; i++)
  24.         sum += 4 * f(a + (2 * i - 1) * h);
  25.  
  26.     for (int i = 1; i < n / 2; i++)
  27.         sum += 2 * f(a + 2 * i * h);
  28.  
  29.     return (f(a) + sum + f(b)) * h / 3;
  30. }
  31.  
  32. double getIntegral(double (*f)(double), double a, double b, long n, double eps) {
  33.    double x = integrate(f, a, b, n);
  34.     double y = integrate(f, a, b, 2 * n);
  35.  
  36.     if (fabs(x - y) < eps)
  37.         return y;
  38.  
  39.     return getIntegral(f, a, (a + b) / 2, n, eps) + getIntegral(f, (a + b) / 2, b, n, eps);
  40. }
  41.  
  42. // функция для поиска корня
  43. double f(double x, double alpha, double eps) {
  44.     return alpha * getIntegral(f1, atan(x), M_PI / 2, 2, eps) - getIntegral(f2, 0, x, 2, eps);
  45. }
  46.  
  47. // производная функции для поиска корня
  48. double df(double x, double alpha) {
  49.     return -(alpha / x + 1) / sqrt(1 + x*x*x*x) - 1;
  50. }
  51.  
  52. // метод Ньютона
  53. double newtone_method(double x0, double alpha, double eps) {
  54.     double x;
  55.  
  56.     do {
  57.         x = x0; // сохраняем предыдущую точку
  58.         x0 -= f(x0, alpha, eps) / df(x0, alpha); // делаем шаг метода
  59.     } while (fabs(x - x0) > eps); // повторяем, пока не достигнем нужной точности
  60.  
  61.     return x0; // возвращаем найденный корень
  62. }
  63.  
  64. int main(void) {
  65.     double alpha; // параметр уравнения
  66.     double eps; // точность
  67.     double x; // корень
  68.  
  69.     printf("Enter alpha: ");
  70.     scanf("%lf", &alpha); // считываем параметр
  71.  
  72.     // проверяем параметр на корректность
  73.     if (alpha <= 0) {
  74.         printf("Invalid alpha value\n");
  75.         return -1;
  76.     }
  77.  
  78.     printf("Enter eps: ");
  79.     scanf("%lf", &eps); // считываем точность
  80.  
  81.     // проверяем точность на корректность
  82.     if (eps < 1e-13 || eps > 1) {
  83.         printf("Invalid eps value\n");
  84.         return -1;
  85.     }
  86.  
  87.     x = newtone_method(1, alpha, eps); // ищем корень
  88.     printf("x: %.15lf\nf(x): %lf", x, f(x, alpha, eps));
  89.     return 0;
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement