Advertisement
Misipuk

Lab3_MO

Apr 26th, 2020
393
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.15 KB | None | 0 0
  1. import numpy as np
  2. import math
  3. import pandas as pd
  4.  
  5. eps=0.000001
  6. h=0.0001
  7.  
  8. def f(x,y,z):
  9.     return x**2+3*y**2+2*z**2
  10.  
  11. def hiper():
  12.     return (np.array([2,1,3]),1)
  13.  
  14. def dFx(ar):
  15.     x = ar[0]
  16.     y = ar[1]
  17.     z = ar[2]
  18.     return (f(x+h,y,z)-f(x-h,y,z))/(2*h)
  19.  
  20. def dFy(ar):
  21.     x = ar[0]
  22.     y = ar[1]
  23.     z = ar[2]
  24.     return (f(x,y+h,z)-f(x,y-h,z))/(2*h)
  25.  
  26. def dFz(ar):
  27.     x = ar[0]
  28.     y = ar[1]
  29.     z = ar[2]
  30.     return (f(x,y,z+h)-f(x,y,z-h))/(2*h)
  31.  
  32. def gradF(ar):
  33.     return np.array([dFx(ar), dFy(ar),dFz(ar)], float)
  34.  
  35. def prc(ar):
  36.     p, b = hiper()
  37.     return ar + (1./np.linalg.norm( (p)**2)*(b-p.dot(ar))*p
  38.  
  39. def gradPrc(x,y,z):
  40.     xyz = np.array([x,y,z], float)
  41.     alpha = 1.0
  42.     i=1
  43.     while True:  
  44.         xyzk = prc(xyz - alpha*gradF(xyz))
  45.         gr = gradF(xyz)
  46.         if np.linalg.norm(xyz-xyzk)<eps
  47.                  break
  48.         elif f(xyzk) <= f(xyz) :
  49.             xyz = np.copy(xyzk)
  50.             alpha = 1.0
  51.         else:            
  52.             while(f(xyzk) > f(xyz)):              
  53.                 alpha = alpha*0.5
  54.                 xyzk = prc(xyz - alpha*gradF(xyz))
  55.     return  xyk
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement