Advertisement
SenyaSych

Решение нелинейных скалярных уравнений

Mar 23rd, 2018
1,247
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.33 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2.  
  3. import math
  4. import pylab
  5. import matplotlib.pyplot as plt
  6. from matplotlib import mlab
  7.  
  8. #Определение функции f(x), φ(x), f'(x), f''(x)
  9. function_f = lambda x:  math.e**(0.2 * x) - 5 * x
  10. function_phi = lambda x: math.e**(0.2 * x) / 5
  11. derivative = lambda x: 0.2 * math.e**(0.2 * x) - 5
  12. second_derivative = lambda x: 0.04 * math.e**(0.2 * x)
  13.  
  14. #Метод половинного деления
  15. def Half_Division_Method (x_min, x_max, eps):
  16.     iteration = 0
  17.     while (((x_max - x_min) / 2) > eps):
  18.         iteration += 1
  19.         middle_point = (x_min + x_max) / 2
  20.         if ((function_f(x_min) * function_f(middle_point)) > 0):
  21.             x_min = middle_point
  22.         else:
  23.             x_max = middle_point
  24.     print ("Количество итераций метода половинного деления:", iteration)
  25.     return middle_point
  26.  
  27. #Метод итераций
  28. def Iterative_Method (x_min, eps):
  29.     last_result = 0
  30.     iteration = 0
  31.     while (abs(last_result - x_min) > eps):
  32.         iteration += 1
  33.         last_result = x_min
  34.         x_min = function_phi(x_min)
  35.     print ("\nКоличество итераций метода итераций:", iteration)
  36.     return x_min
  37.  
  38. #Метод Ньютона
  39. def Newton_Method (x_min, x_max, eps):
  40.     last_result = 0
  41.     iteration = 0
  42.     if ((function_f(x_min) * second_derivative(x_min)) > 0):
  43.         while (abs(last_result - x_min) > eps):
  44.             iteration += 1
  45.             last_result = x_min
  46.             x_min = x_min - function_f(x_min) / derivative(x_min)
  47.         print ("\nКоличество итераций методом Ньютона:", iteration)
  48.         return x_min
  49.     else:
  50.         while (abs(last_result - x_max) > eps):
  51.             iteration += 1
  52.             last_result = x_max
  53.             x_max = x_max - function_f(x_max) / derivative(x_max)
  54.         print ("\nКоличество итераций методом Ньютона:", iteration)
  55.         return x_max
  56.  
  57. x_min = float(input("Введите начальное значение интервала x_min: "))
  58. x_max = float(input("Введите конечное значение интервала x_max: "))
  59.  
  60. if (function_f(x_min) * function_f(x_max) > 0):
  61.     print ("На данном интервале корней у функции нет!")
  62.    
  63. else:
  64.     print ("\nРезультаты:")
  65.     print ("Mетодом половинного деления с точностью до 0.01 =", "%.2f" % Half_Division_Method(x_min, x_max, 0.01))
  66.     print ("Mетодом итераций с точностью до 0.001 =", "%.3f" % Iterative_Method(x_min, 0.001))
  67.     print ("Методом Ньютона с точностью до 0.000001 =", "%.6f" % Newton_Method(x_min, x_max, 0.000001))
  68.    
  69. # Шаг между точками
  70. increment = 0.1
  71.  
  72. # Создадим список координат по оси X на отрезке [-x_min; x_max], включая концы
  73. xlist = mlab.frange (x_min, x_max, increment)
  74.  
  75. # Вычислим значение функции в заданных точках
  76. ylist = [function_f(x) for x in xlist]
  77.  
  78. # Нарисуем одномерный график
  79. pylab.plot (xlist, ylist)
  80. plt.grid(True)
  81.  
  82. # Покажем окно с нарисованным графиком
  83. pylab.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement