Advertisement
edward4324

laba5 mo

May 11th, 2022 (edited)
643
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.58 KB | None | 0 0
  1. # численные методы поиска условного эсктремума
  2. # стр. 105
  3. import numpy as np
  4. import math as m
  5.  
  6. import scipy.optimize
  7. from sympy import *
  8. from scipy.optimize import linprog
  9.  
  10. import Lab4
  11.  
  12. x1 = Symbol('x1')
  13. x2 = Symbol('x2')
  14. y1 = Symbol('y1')
  15. y2 = Symbol('y2')
  16. z = Symbol('z')
  17. betha = Symbol('betha')
  18.  
  19.  
  20. def solve_system(g_functions, x_point):
  21.     result = []
  22.     for i in range(0, len(g_functions)):
  23.         g = lambdify((x1, x2), g_functions[i], 'numpy')
  24.         if g(x_point[0], x_point[1]) <= 0:
  25.             result.append(i)
  26.     return result
  27.  
  28.  
  29. def get_alpha_value(g_functions: list[Function], f: Function, x_point: list[float], y_vector: list[float]):
  30.     f_func = lambdify((x1, x2), f, 'numpy')
  31.     f_betha = f_func(x_[0] + y[0] * betha, x_[1] + y[1] * betha)
  32.     f_betha = lambdify(betha, f_betha, 'numpy')
  33.     betha0 = scipy.optimize.fmin(f_betha, 0)
  34.     bethas = [betha0]
  35.     # Значений для betha и g функций с ней
  36.     betha_functions = []
  37.     betha_variables = []
  38.     i = 1
  39.     for g in g_functions:
  40.         # Переменная бета, т.е. бета1 бета2 бета3 и т.д.
  41.         betha_variable = Symbol('betha' + string(i))
  42.         g_func = lambdify((x1, x2), g, 'numpy')
  43.         g_func = g_func(x_point[0] + y_vector[0] * betha_variable, x_point[1] + y_vector[1] * betha_variable)
  44.         betha_functions.append(g_func)
  45.         betha_variables.append(betha_variable)
  46.         i = i + 1
  47.     result = nonlinsolve(betha_functions, betha_variables)
  48.     return min(result)
  49.  
  50.  
  51. def possible_directions_method(f: Function, g_functions, x0, epsilon):
  52.     # Шаг 1
  53.     x_ = np.array(x0)
  54.     k = 0
  55.     while k < 1000:
  56.         # Шаг 2
  57.         f_gradient = Lab4.gradient(f, x1, x2, x_)
  58.         if np.linalg.norm(f_gradient) <= epsilon:
  59.  
  60.             # получение решения #
  61.             return True, x_, None
  62.  
  63.         else:
  64.             # Шаг 3
  65.             i_set = solve_system(g_functions, x_)
  66.             # Шаг 4
  67.             if len(i_set) == 0:
  68.                 yk = -1 * Lab4.gradient(f, x1, x2, x_)
  69.             else:
  70.                 a = []
  71.                 b = [0]
  72.                 c = [0, 0, 1]  # значения коэффициентов функции для y1 y2 z
  73.                 row = Lab4.gradient(f, x1, x2, x_)
  74.                 row.append(-1)  # задание значений для y1, y2 и -z
  75.                 a.append(row)
  76.                 for i in i_set:
  77.                     if i != 0:
  78.                         row = Lab4.gradient(g_functions[i], x1, x2, x_)  # значения для y1 y2
  79.                         row.append(-1)  # значения для -z
  80.                         a.append(row)  # формирования коэффициентов для неравенств с j-ми функциями
  81.                         b.append(0)  # формирование ограничений для j-ых функций
  82.                 y1_bounds = [-1, 1]  # ограничения для y1
  83.                 y2_bounds = [-1, 1]  # ограничения для y2
  84.                 z_bounds = [None, None]
  85.                 bounds = [y1_bounds, y2_bounds, z_bounds]
  86.                 linprog_result = linprog(c, A_ub=a, b_ub=b, bounds=bounds, method='simplex', options={"disp": True})
  87.                 print('Результаты решения симплекс метода:\n', linprog_result)
  88.                 # шаг 5
  89.                 yk = [linprog_result.x[0], linprog_result.x[1]]
  90.                 if yk == [0, 0] or linprog_result.x[2] <= epsilon:
  91.                     # получение решения #
  92.                     return True, x_, yk
  93.                 else:
  94.                     yk = [linprog_result.x[0], linprog_result.x[1]]
  95.                     # получение минимума из всех бета, что = альфа #
  96.                     alpha_k = get_alpha_value(g_functions, f, x_, yk)
  97.  
  98.                     # шаг 6
  99.                     # итерация #
  100.                     x_ = x_ + alpha_k * np.array(yk)
  101.                     k = k + 1
  102.  
  103.  
  104. def main():
  105.     x0 = [0, 0.95]
  106.     epsilon = 0.03
  107.     f = (x1 - 4) ** 2 + (x2 - 5) ** 2
  108.     g = [x1 + x2 - 1, x1, x2]
  109.     solved, x_result, y_result = possible_directions_method(f, g, x0, epsilon)
  110.     if solved:
  111.         print("Задача была решена, точка x = ", x_result)
  112.         if y_result is not None:
  113.             print("Вектор y = ", y_result)
  114.     else:
  115.         print("Задача не была решена")
  116.  
  117.  
  118. if __name__ == "__main__":
  119.     main()
  120.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement