Вычисление корней алгебраического уравнения методом Ньютона-Рафсона - комментарии к коду - C (СИ)
Формулировка задачи:
ВЫЧИСЛЕНИЕ КОРНЕЙ АЛГЕБРАИЧЕСКОГО УРАВНЕНИЯ МЕТОДОМ НЬЮТОНА-РАФСОНА
Листинг программы
- #include // Для printf
- #include
- #include // Для комплексной арифметики (crealf, cimagf)
- typedef float complexFloat; // Создание собственного имени типа
- void Newton_Raphson(int n, Float q[n + 1], Float p[n], float eps);
- Float hor(int n, Float a[n + 1], Float x, Float* b)
- {
- int i; // Рабочая переменная
- Float val = a[n];
- if (b) {
- b[n - 1] = val;
- }
- for (i = n - 1; i >= 0; --i) {
- val *= x;
- val += a[i];
- if (b && i) {
- b[i - 1] = val;
- }
- }
- return val;
- }
- Float dhor(int n, Float a[n + 1], Float x)
- {
- int i; // Рабочая переменная
- Float val = n * a[n];
- for (i = n - 1; i > 0; --i) {
- val *= x;
- val += i * a[i];
- }
- return val;
- }
- void newton(int n, Float a[n + 1], Float* px, Float x0, float eps)
- {
- Float x = x0, dx, f_val, df_val;
- int niter = 1;
- do {
- f_val = hor(n, a, x, NULL);
- df_val = dhor(n, a, x);
- if (df_val != 0) {
- dx = f_val / df_val;
- } else {
- break;
- }
- x -= dx;
- } while (++niter <= 100 && cabsf(dx) > eps);
- *px = x;
- }
- void Newton_Raphson(int n, Float q[n + 1], Float p[n], float eps)
- {
- Float x, x0;
- int i; // Рабочая переменная
- float err;
- while (n) {
- x0 = 1.0f; // Нулевая итерация
- newton(n, q, &x, x0, eps);
- err = cabsf(hor(n, q, x, NULL));
- if (err > eps) {
- newton(n, q, &x, x0 * I, eps);
- err = cabsf(hor(n, q, x, NULL));
- }
- Float b[n];
- hor(n, q, x, b);
- p[n - 1] = x;
- for (i = 0; i < n; ++i) {
- q[i] = b[i];
- }
- --n;
- }
- }
- int main(int argc, char* argv[])
- {
- int n; // Степень уравнения
- int i; // Рабочая переменная
- printf("\nThe degree of the equation = "); // Степень уравнения
- scanf("%d", &n);
- Float q[n + 1]; // Вектор коэффициентов исходного уравнения
- // по возрастанию степеней
- Float p[n]; // массив корней уравнения
- printf("\nA vector of the coefficients:\n"); // Вектор коэффициентов
- for (i = 0; i <= n; i++) {
- float x;
- scanf("%f", &x);
- q[i] = x;
- }
- Newton_Raphson(n, q, p, 1e-6);
- printf("\n The roots of the equation"); // Корни уравнения
- printf("\n");
- printf("\n Real part\ Imaginary part\n"); // Действительная и мнимая части
- for (i = 0; i < n; i++) {
- printf("%16f\%16f\n", crealf(p[i]), cimagf(p[i])); // Вывод действительной и мнимой части
- }
- printf("\n");
- return 0;
- }
Решение задачи: «Вычисление корней алгебраического уравнения методом Ньютона-Рафсона - комментарии к коду»
textual
Листинг программы
- typedef float complexFloat; // Создание собственного имени типа
Объяснение кода листинга программы
- Создание собственного имени типа
complexFloat
для представления комплексных чисел с плавающей точкой. float complex x = 0.0, z = 1.0; // Начальное приближение для x и z - Инициализация переменных
x
иz
начальными приближениями для метода Ньютона-Рафсона. Значениеx
установлено равным 0.0, аz
равно 1.0. float complex f(float complex w) // Определение функции { return w*w - 1.0; // Функция f(w) = w^2 - 1.0 } - Определение функции
f(w)
, которая представляет собой квадрат комплексного числа минус единица. float complex g(float complex w) // Определение функции { return 2.0*w; // Функция g(w) = 2w } - Определение функции
g(w)
, которая представляет собой удвоенное значение комплексного числаw
. float complex newtonRaphson(float complex z) // Определение метода Ньютона-Рафсона { float complex fz = f(z); // Вычисление значения функции f(z) float complex gz = g(z); // Вычисление значения функции g(z) float complex newz = z - fz/gz; // Вычисление нового значения z return newz; // Возврат нового значения z } - Определение функции
newtonRaphson(z)
, которая реализует метод Ньютона-Рафсона для нахождения корней уравнения. for (int i = 0; i < 20; i++) // Цикл для выполнения метода Ньютона-Рафсона до достижения 20 итераций { float complex temp = z; // Создание временной переменной для хранения текущего значения z z = newtonRaphson(z); // Вычисление нового значения z с помощью метода newtonRaphson if (temp == z) // Проверка на сходимость break; // Если значения z не изменились, то выход из цикла } - Цикл, который выполняет метод Ньютона-Рафсона до достижения 20 итераций или до тех пор, пока значения
z
не перестанут изменяться. printf(Корни уравнения: x = %f + %fi, x = %f + %fi\n
, creal(z), cimag(z), creal(z), cimag(z)); // Вывод результатов - Вывод результатов на экран с помощью функции
printf
. Значения реального и мнимого компонентов корней уравнения выводятся в форматеx = a + bi
, гдеa
иb
представляют собой действительную и мнимую части соответственно.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д