Вычисление корней алгебраического уравнения методом Ньютона-Рафсона - комментарии к коду - C (СИ)

Узнай цену своей работы

Формулировка задачи:

ВЫЧИСЛЕНИЕ КОРНЕЙ АЛГЕБРАИЧЕСКОГО УРАВНЕНИЯ МЕТОДОМ НЬЮТОНА-РАФСОНА
Листинг программы
  1. #include // Для printf
  2. #include
  3. #include // Для комплексной арифметики (crealf, cimagf)
  4. typedef float complexFloat; // Создание собственного имени типа
  5. void Newton_Raphson(int n, Float q[n + 1], Float p[n], float eps);
  6. Float hor(int n, Float a[n + 1], Float x, Float* b)
  7. {
  8. int i; // Рабочая переменная
  9. Float val = a[n];
  10. if (b) {
  11. b[n - 1] = val;
  12. }
  13. for (i = n - 1; i >= 0; --i) {
  14. val *= x;
  15. val += a[i];
  16. if (b && i) {
  17. b[i - 1] = val;
  18. }
  19. }
  20. return val;
  21. }
  22. Float dhor(int n, Float a[n + 1], Float x)
  23. {
  24. int i; // Рабочая переменная
  25. Float val = n * a[n];
  26. for (i = n - 1; i > 0; --i) {
  27. val *= x;
  28. val += i * a[i];
  29. }
  30. return val;
  31. }
  32. void newton(int n, Float a[n + 1], Float* px, Float x0, float eps)
  33. {
  34. Float x = x0, dx, f_val, df_val;
  35. int niter = 1;
  36. do {
  37. f_val = hor(n, a, x, NULL);
  38. df_val = dhor(n, a, x);
  39. if (df_val != 0) {
  40. dx = f_val / df_val;
  41. } else {
  42. break;
  43. }
  44. x -= dx;
  45. } while (++niter <= 100 && cabsf(dx) > eps);
  46. *px = x;
  47. }
  48. void Newton_Raphson(int n, Float q[n + 1], Float p[n], float eps)
  49. {
  50. Float x, x0;
  51. int i; // Рабочая переменная
  52. float err;
  53. while (n) {
  54. x0 = 1.0f; // Нулевая итерация
  55. newton(n, q, &x, x0, eps);
  56. err = cabsf(hor(n, q, x, NULL));
  57. if (err > eps) {
  58. newton(n, q, &x, x0 * I, eps);
  59. err = cabsf(hor(n, q, x, NULL));
  60. }
  61. Float b[n];
  62. hor(n, q, x, b);
  63. p[n - 1] = x;
  64. for (i = 0; i < n; ++i) {
  65. q[i] = b[i];
  66. }
  67. --n;
  68. }
  69. }
  70. int main(int argc, char* argv[])
  71. {
  72. int n; // Степень уравнения
  73. int i; // Рабочая переменная
  74. printf("\nThe degree of the equation = "); // Степень уравнения
  75. scanf("%d", &n);
  76. Float q[n + 1]; // Вектор коэффициентов исходного уравнения
  77. // по возрастанию степеней
  78. Float p[n]; // массив корней уравнения
  79. printf("\nA vector of the coefficients:\n"); // Вектор коэффициентов
  80. for (i = 0; i <= n; i++) {
  81. float x;
  82. scanf("%f", &x);
  83. q[i] = x;
  84. }
  85. Newton_Raphson(n, q, p, 1e-6);
  86. printf("\n The roots of the equation"); // Корни уравнения
  87. printf("\n");
  88. printf("\n Real part\ Imaginary part\n"); // Действительная и мнимая части
  89. for (i = 0; i < n; i++) {
  90. printf("%16f\%16f\n", crealf(p[i]), cimagf(p[i])); // Вывод действительной и мнимой части
  91. }
  92. printf("\n");
  93. return 0;
  94. }

Решение задачи: «Вычисление корней алгебраического уравнения методом Ньютона-Рафсона - комментарии к коду»

textual
Листинг программы
  1. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы