Guest User

Untitled

a guest
May 21st, 2013
33
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.05 KB | None | 0 0
  1. import numpy as np
  2. import math
  3.  
  4. def grad(func,point,eps):
  5.         ret = np.zeros(len(point))
  6.         for i in range(0,len(point)):
  7.                 tmp = np.array(point)
  8.                 tmp[i] += eps/2.0
  9.                 ret[i] = func(tmp)
  10.                 tmp[i] -= eps
  11.                 ret[i] -= func(tmp)
  12.                 ret[i] /= eps
  13.         return ret/np.linalg.norm(ret)
  14.  
  15. def sign(number):
  16.         if number<0.0000000001:
  17.                 return -1
  18.         elif number>0.0000000001:
  19.                 return 1
  20.         else:
  21.                 return 0
  22.  
  23.  
  24. def metrika(main_func,one_func,transform_func,point,h,eps):
  25.         dimn = len(point)
  26.         x0 = np.array(point)
  27.         g0 = grad(main_func,point,eps*0.1)
  28.         d = -1 * g0
  29.         H = np.eye(dimn)
  30.         while True:
  31.                 z=np.zeros(dimn)
  32.                 tmp_func = lambda x: main_func(x0+x*d)
  33.                 z = one_func(tmp_func,h,eps)
  34.                 if abs(z)<eps:
  35.                         break
  36.                 x1 = x0 + z*d
  37.                 v = z * d
  38.                 x0 = x1
  39.                 g1 = grad(main_func,x1,eps*0.1)
  40.                 u = g1-g0
  41.                 g0 = g1
  42.                 H = H + transform_func(v,u,H)
  43.                 d = np.array((-H * np.matrix(g1).transpose()).transpose())[0]
  44.                 d = d/np.linalg.norm(d)
  45.                 if np.linalg.norm(v)+np.linalg.norm(g1)<eps:
  46.                         break
  47.         return x1
  48.  
  49. def transform_green(v,u,H):
  50.         H = np.matrix(H)
  51.         v = np.matrix(v).transpose()
  52.         u = np.matrix(u).transpose()
  53.         v_vt = v * v.transpose()
  54.         vt_u = v.transpose() * u
  55.         A = v_vt/vt_u
  56.         H_u = H*u
  57.         ut_H = u.transpose()*H
  58.         ut_H_u = ut_H*u
  59.         H_u_ut_H = H_u*ut_H
  60.         A -= H_u_ut_H/ut_H_u
  61.         return A
  62.  
  63. def one_mp2(func,h,eps):
  64.         x1,x2,x3 = -h,0,h
  65.         y1,y2,y3 = func(x1),func(x2),func(x3)
  66.         while True:
  67.                 z1 = x1 - x3
  68.                 z2 = x2 - x3
  69.                 p = ((y1-y3)*z2-(y2-y3)*z1)/(z1*z2*(z1-z2))
  70.                 q = ((y1-y3)*z2*z2-(y2-y3)*z1*z1)/(z1*z2*(z2-z1))
  71.                 zm = -q/(2*p)
  72.                 x1,x2 = x2,x3
  73.                 y1,y2 = y2,y3
  74.                 x3 = x3 + zm
  75.                 y3 = func(x3)
  76.                 if abs(zm) < eps:
  77.                         break
  78.         return x3+zm
  79.  
  80. def shtraf(g,point):
  81.         a=0.5
  82.         temp_point=point
  83.         while 1:
  84.                 temp_x=metrika(g,one_mp2,transform_green,temp_point,0.1,0.01)
  85.                 if abs(temp_point-temp_x)<=[0.0001,0.0001]:
  86.                         a=f(temp_x)
  87.                         print(temp_x,a)
  88.                         break
  89.  
  90.                 if f(temp_x)<f(temp_point):
  91.                         temp_point=temp_x
  92.                 else:
  93.                         a=f(temp_x)
  94.                         print(temp_x,a)
  95.                         break
  96.  
  97. def f(x):
  98.         return (x[1]-1)**2+x[2]
  99.  
  100.  
  101. def g(x):
  102.         return (x[1]-1)**2+x[2]+0.5*(((x[1]+x[2]**2)/5)**2)*(1+sign(x[1])*(1+sign(x[2]))
  103.  
  104. shtraf(g,[3,3])
Advertisement
Add Comment
Please, Sign In to add comment