Приближённое нахождение корней методом Ньютона на C

CBeginner
Практиковаться сейчас

Введение

В этом лабораторном практикуме вы научитесь приближённо находить корни функции с помощью метода Ньютона на языке C. Практикум охватывает следующие шаги:

Во-первых, вы определите функцию f(x) и её производную f'(x). Затем вы реализуете итерационную формулу метода Ньютона для вычисления приближённого корня. Наконец, вы выведете полученный приближённый корень.

Этот практикум предоставляет практический пример применения численных методов для решения математических задач с использованием языка программирования C. К концу практикума вы лучше поймёте, как использовать метод Ньютона для поиска корней функции.

Определение f(x) и f'(x)

На этом шаге мы определим математическую функцию f(x) и её производную f'(x) для реализации метода Ньютона по приближённому нахождению корней.

Сначала создадим новый файл C в каталоге ~/project:

cd ~/project
nano newton_method.c

Теперь напишем начальный код для определения нашей функции и её производной:

#include <stdio.h>
#include <math.h>

// Определение функции f(x)
double f(double x) {
    return x * x - 4;  // Пример функции: f(x) = x^2 - 4
}

// Определение производной f'(x)
double f_derivative(double x) {
    return 2 * x;  // Производная f(x) = 2x
}

int main() {
    printf("Функция f(x) = x^2 - 4\n");
    printf("Производная f'(x) = 2x\n");
    return 0;
}

Пример вывода:

Функция f(x) = x^2 - 4
Производная f'(x) = 2x

Рассмотрим код подробнее:

  • f(x) определена как x^2 - 4, у которой корни при x = 2 и x = -2
  • f_derivative(x) — производная от f(x), которая равна 2x
  • Мы будем использовать эти функции на следующих шагах для реализации метода Ньютона

Скомпилируйте код для проверки:

gcc -o newton_method newton_method.c -lm
./newton_method

Итерация x_{n+1}=x_n - f(x_n)/f'(x_n)

На этом шаге мы реализуем итерационную формулу метода Ньютона для приближённого нахождения корня нашей функции.

Откройте предыдущий файл newton_method.c:

cd ~/project
nano newton_method.c

Обновите код, включив в него итерацию метода Ньютона:

#include <stdio.h>
#include <math.h>

// Предыдущие определения функций остаются без изменений
double f(double x) {
    return x * x - 4;
}

double f_derivative(double x) {
    return 2 * x;
}

// Реализация метода Ньютона
double newton_method(double initial_guess, int max_iterations, double tolerance) {
    double x = initial_guess;

    for (int i = 0; i < max_iterations; i++) {
        double fx = f(x);
        double fpx = f_derivative(x);

        // Проверка на деление на ноль
        if (fabs(fpx) < tolerance) {
            printf("Производная слишком близка к нулю. Невозможно продолжить.\n");
            return x;
        }

        // Итерационная формула метода Ньютона
        double x_next = x - fx / fpx;

        printf("Итерация %d: x = %f\n", i + 1, x_next);

        // Проверка на сходимость
        if (fabs(x_next - x) < tolerance) {
            return x_next;
        }

        x = x_next;
    }

    printf("Достигнуто максимальное количество итераций.\n");
    return x;
}

int main() {
    double initial_guess = 1.0;
    int max_iterations = 10;
    double tolerance = 1e-6;

    double root = newton_method(initial_guess, max_iterations, tolerance);

    printf("\nПриближённый корень: %f\n", root);
    printf("f(корень) = %f\n", f(root));

    return 0;
}

Скомпилируйте и запустите код:

gcc -o newton_method newton_method.c -lm
./newton_method

Пример вывода:

Итерация 1: x = 2.500000
Итерация 2: x = 2.050000
Итерация 3: x = 2.000610
Итерация 4: x = 2.000000
Итерация 5: x = 2.000000

Приближённый корень: 2.000000
f(корень) = 0.000000

Ключевые моменты реализации:

  • newton_method() принимает начальное приближение, максимальное количество итераций и точность
  • Реализует итерационную формулу метода Ньютона: x_{n+1} = x_n - f(x_n) / f'(x_n)
  • Проверяет сходимость и возможные деления на ноль
  • Выводит промежуточные итерации, чтобы показать процесс приближения

Вывод Приближённого Корня

На этом шаге мы улучшим нашу реализацию метода Ньютона, чтобы получить более подробную информацию о приближении корня.

Откройте предыдущий файл newton_method.c:

cd ~/project
nano newton_method.c

Обновите код для улучшения вывода приближения корня:

#include <stdio.h>
#include <math.h>

// Предыдущие определения функций и метода остаются без изменений
double f(double x) {
    return x * x - 4;
}

double f_derivative(double x) {
    return 2 * x;
}

double newton_method(double initial_guess, int max_iterations, double tolerance) {
    double x = initial_guess;

    printf("Приближение корня методом Ньютона\n");
    printf("-----------------------------------\n");
    printf("Начальное приближение: %f\n", x);
    printf("Точность: %e\n", tolerance);
    printf("Максимальное количество итераций: %d\n\n", max_iterations);

    for (int i = 0; i < max_iterations; i++) {
        double fx = f(x);
        double fpx = f_derivative(x);

        if (fabs(fpx) < tolerance) {
            printf("Ошибка: Производная слишком близка к нулю.\n");
            return x;
        }

        double x_next = x - fx / fpx;

        printf("Итерация %d:\n", i + 1);
        printf("  Текущее значение x: %f\n", x_next);
        printf("  f(x): %f\n", f(x_next));
        printf("  |x_next - x|: %e\n\n", fabs(x_next - x));

        if (fabs(x_next - x) < tolerance) {
            printf("Сходимость достигнута!\n");
            return x_next;
        }

        x = x_next;
    }

    printf("Максимальное количество итераций достигнуто.\n");
    return x;
}

int main() {
    double initial_guess = 1.0;
    int max_iterations = 10;
    double tolerance = 1e-6;

    double root = newton_method(initial_guess, max_iterations, tolerance);

    printf("Результаты:\n");
    printf("-------------\n");
    printf("Приближённый корень: %f\n", root);
    printf("f(корень): %f\n", f(root));
    printf("Абсолютная ошибка: %e\n", fabs(f(root)));

    return 0;
}

Скомпилируйте и запустите код:

gcc -o newton_method newton_method.c -lm
./newton_method

Пример вывода:

Приближение корня методом Ньютона
-----------------------------------
Начальное приближение: 1.000000
Точность: 1.000000e-06
Максимальное количество итераций: 10

Итерация 1:
  Текущее значение x: 2.500000
  f(x): 2.250000
  |x_next - x|: 1.500000e+00

Итерация 2:
  Текущее значение x: 2.050000
  f(x): 0.202500
  |x_next - x|: 4.500000e-01

... (более итераций)

Сходимость достигнута!

Результаты:
-------------
Приближённый корень: 2.000000
f(корень): 0.000000
Абсолютная ошибка: 0.000000e+00

Основные улучшения:

  • Добавлена подробная информация об итерациях.
  • Отображены начальные параметры.
  • Показан прогресс сходимости.
  • Выведены окончательные результаты с абсолютной ошибкой.

Резюме

В этом лабораторном практикуме мы сначала определили математическую функцию f(x) и её производную f'(x), чтобы реализовать метод Ньютона для приближённого нахождения корней. Затем мы реализовали итерационную формулу x_{n+1} = x_n - f(x_n)/f'(x_n) для выполнения приближённого нахождения корня. Наконец, мы выведем приближённый корень, полученный в результате этого процесса.

Ключевыми этапами, рассмотренными в этом практикуме, являются определение целевой функции и её производной, а затем итерационное применение формулы метода Ньютона для сходимости к корню. Этот подход позволяет эффективно находить корни различных математических функций с помощью программирования на языке C.