Advertisement
EgorYankovsky

Untitled

Apr 15th, 2023
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.01 KB | None | 0 0
  1. import numpy as np
  2. import math as mt
  3.  
  4. H = 1e-15
  5.  
  6. def Norma(_x : np.array) -> float:
  7. return mt.sqrt(_x[0] ** 2 + _x[1] ** 2)
  8.  
  9. def Grad(_f, _x : np.array) -> np.array:
  10. return ((_f((_x[0] + H, _x[1])) - _f((_x[0], _x[1]))) / H, (_f((_x[0], _x[1] + H)) - _f((_x[0], _x[1]))) / H)
  11.  
  12. def FindMinimum(_f, _x : np.array, _s : np.array, _lamb0 = 0.0):
  13. h = 0
  14. lamb = _lamb0
  15. delt = 1e-8
  16. if _f(_x + _lamb0 * _s) > _f(_x + (_lamb0 + delt) * _s):
  17. lamb = _lamb0 + delt
  18. h = delt
  19. elif _f(_x + _lamb0 * _s) < _f(_x + (_lamb0 + delt) * _s):
  20. lamb = _lamb0 + delt
  21. h = -delt
  22. else:
  23. print ("Govno kakoe-to")
  24. exit
  25. while True:
  26. h *= 2
  27. lamb += h
  28. if _f(_x + (lamb - h) * _s) <= _f(_x + lamb * _s):
  29. return np.array([min(_lamb0, lamb), max(_lamb0, lamb)])
  30.  
  31.  
  32. def DichotomyMethod(_f, _interval, _x, _s, eps = 1e-7):
  33. _a = _interval[0]
  34. _b = _interval[1]
  35. _x1 = (_a + _b - 0.5 * eps) / 2
  36. _x2 = (_a + _b + 0.5 * eps) / 2
  37. while abs(_b - _a) > eps:
  38. if _f(_x + _x1 * _s) <= _f(_x + _x2 * _s):
  39. _b = _x2
  40. else:
  41. _a = _x1
  42. _x1 = (_a + _b - 0.5 * eps) / 2
  43. _x2 = (_a + _b + 0.5 * eps) / 2
  44. return 0.5 * (_x1 + _x2)
  45.  
  46.  
  47. def FindMinLambd(_f, _x0, _s):
  48. return DichotomyMethod(_f, FindMinimum(_f, _x0, _s), _x0, _s)
  49.  
  50.  
  51. def Method(_f, _x0 : np.array, eps = 1e-3):
  52.  
  53. k = 0
  54. x_curr = np.array(_x0)
  55. while True:
  56. if k % 3 == 0:
  57. _s = -1 * np.array(Grad(_f, x_curr))
  58. lambd = FindMinLambd(_f, x_curr, _s)
  59. x_next = x_curr + lambd * _s
  60. w = (Norma(Grad(_f, x_next))) ** 2 / (Norma(Grad(_f, x_curr))) ** 2
  61. _s = -1 * np.array(Grad(_f, x_next)) + w * _s
  62. print (x_curr, Norma(_s))
  63. x_curr = x_next
  64. k += 1
  65. if Norma(_s) <= eps:
  66. print ("MCG answer: ({:5e}; {:5e})".format(x_curr[0], x_curr[1]))
  67. break
  68. print()
  69.  
  70.  
  71.  
  72. #Method(fp.F3, x0, 1e-07)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement