Вычисление корней алгебраического уравнения методом Ньютона-Рафсона - комментарии к коду - 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; // Создание собственного имени типа

Объяснение кода листинга программы

  1. Создание собственного имени типа complexFloat для представления комплексных чисел с плавающей точкой. float complex x = 0.0, z = 1.0; // Начальное приближение для x и z
  2. Инициализация переменных 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 }
  3. Определение функции f(w), которая представляет собой квадрат комплексного числа минус единица. float complex g(float complex w) // Определение функции { return 2.0*w; // Функция g(w) = 2w }
  4. Определение функции 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 }
  5. Определение функции 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 не изменились, то выход из цикла }
  6. Цикл, который выполняет метод Ньютона-Рафсона до достижения 20 итераций или до тех пор, пока значения z не перестанут изменяться. printf(Корни уравнения: x = %f + %fi, x = %f + %fi\n, creal(z), cimag(z), creal(z), cimag(z)); // Вывод результатов
  7. Вывод результатов на экран с помощью функции printf. Значения реального и мнимого компонентов корней уравнения выводятся в формате x = a + bi, где a и b представляют собой действительную и мнимую части соответственно.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.625 из 5
Похожие ответы