fork download
  1. program NewtonMethod;
  2. uses Math;
  3.  
  4. function Func(x: Real): Real;
  5. begin
  6. Func := Cos(x) - x*x*x;
  7. end;
  8.  
  9. function Derivative(x: Real): Real;
  10. begin
  11. Derivative := -Sin(x) - 3*x*x;
  12. end;
  13.  
  14. function NewtonRaphson(x0, epsilon: Real; maxIter: Integer; var iterations: Integer; var converged: Boolean): Real;
  15. var
  16. x, xNew: Real;
  17. iter: Integer;
  18. begin
  19. x := x0;
  20. iter := 0;
  21. converged := false;
  22.  
  23. WriteLn('Итерация 0: x = ', x:0:6, ', f(x) = ', Func(x):0:6);
  24.  
  25. while iter < maxIter do
  26. begin
  27. // Проверяем, что производная не слишком мала
  28. if Abs(Derivative(x)) < 1e-10 then
  29. begin
  30. WriteLn('Производная близка к нулю в точке x = ', x:0:6);
  31. Exit;
  32. end;
  33.  
  34. // Вычисляем новое приближение
  35. xNew := x - Func(x) / Derivative(x);
  36.  
  37. // Проверяем, что не вышли за пределы интервала
  38. if (xNew < 0.5) or (xNew > 1.0) then
  39. begin
  40. WriteLn('Приближение вышло за пределы интервала [0.5; 1.0]');
  41. end;
  42.  
  43. // Выводим информацию о текущей итерации
  44. WriteLn('Итерация ', iter+1, ': x = ', xNew:0:6, ', f(x) = ', Func(xNew):0:6);
  45.  
  46. // Проверяем условие сходимости
  47. if Abs(xNew - x) < epsilon then
  48. begin
  49. iterations := iter + 1;
  50. converged := true;
  51. NewtonRaphson := xNew;
  52. Exit;
  53. end;
  54.  
  55. x := xNew;
  56. iter := iter + 1;
  57. end;
  58.  
  59. WriteLn('Достигнуто максимальное количество итераций (', maxIter, ')');
  60. iterations := maxIter;
  61. NewtonRaphson := x;
  62. end;
  63.  
  64. procedure CheckInterval(a, b: Real);
  65. var
  66. i: Integer;
  67. step: Real;
  68. begin
  69. WriteLn('Проверка функции на интервале [', a:0:1, '; ', b:0:1, ']:');
  70. WriteLn('x':8, 'f(x)':12);
  71.  
  72. step := (b - a) / 10;
  73. for i := 0 to 10 do
  74. begin
  75. WriteLn((a + i*step):8:4, Func(a + i*step):12:6);
  76. end;
  77. WriteLn;
  78. end;
  79.  
  80. var
  81. root: Real;
  82. iterations: Integer;
  83. converged: Boolean;
  84. begin
  85. WriteLn('Решение уравнения cos(x) - x^3 = 0 методом Ньютона');
  86. WriteLn('Корень в интервале [0.5; 1.0]');
  87. WriteLn;
  88.  
  89. // Проверяем функцию на интервале
  90. CheckInterval(0.5, 1.0);
  91.  
  92. // Решаем уравнение с начальным приближением из середины интервала
  93. WriteLn('Начальное приближение: x_0 = 0.75 (середина интервала)');
  94. WriteLn;
  95.  
  96. root := NewtonRaphson(0.75, 1e-6, 100, iterations, converged);
  97.  
  98. WriteLn;
  99. if converged then
  100. begin
  101. WriteLn('Результат:');
  102. WriteLn('x = ', root:0:6);
  103. WriteLn('Количество итераций: ', iterations);
  104. WriteLn('Проверка: cos(', root:0:6, ') - (', root:0:6, ')^3 = ', Func(root):0:10);
  105.  
  106. // Проверяем, что корень действительно в заданном интервале
  107. if (root >= 0.5) and (root <= 1.0) then
  108. WriteLn('Корень в заданном интервале [0.5; 1.0]')
  109. else
  110. WriteLn('Корень вне заданного интервала');
  111. end
  112. else
  113. begin
  114. WriteLn('Не сошлось за указанное число итераций.');
  115. WriteLn('Последнее приближение: x = ', root:0:6);
  116. end;
  117. end.
Success #stdin #stdout 0s 5256KB
stdin
Standard input is empty
stdout
Решение уравнения cos(x) - x^3 = 0 методом Ньютона
Корень в интервале [0.5; 1.0]

Проверка функции на интервале [0.5; 1.0]:
       x        f(x)
  0.5000    0.752583
  0.5500    0.686150
  0.6000    0.609336
  0.6500    0.521459
  0.7000    0.421842
  0.7500    0.309814
  0.8000    0.184707
  0.8500    0.045858
  0.9000   -0.107390
  0.9500   -0.275692
  1.0000   -0.459698

Начальное приближение: x_0 = 0.75 (середина интервала)

Итерация 0: x = 0.750000, f(x) = 0.309814
Итерация 1: x = 0.880771, f(x) = -0.046707
Итерация 2: x = 0.865697, f(x) = -0.000670
Итерация 3: x = 0.865474, f(x) = -0.000000
Итерация 4: x = 0.865474, f(x) = -0.000000

Результат:
x = 0.865474
Количество итераций: 4
Проверка: cos(0.865474) - (0.865474)^3 = -0.0000000000
Корень в заданном интервале [0.5; 1.0]