Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2017
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.68 KB | None | 0 0
  1. # Returns the radius of an (n-1)-sphere defined by n+1 points in R^n
  2. # L = set of n+1 points, each an n-dimensional vector
  3. def sphere_radius(L):
  4.     n = len(L)-1
  5.     matL = [[0]*(n+2)]
  6.     for pt in L:
  7.         tempL = [vector(pt)*vector(pt)]
  8.         for pos in range(n):
  9.             tempL.append(pt[pos])
  10.         tempL.append(1)
  11.         matL.append(tempL)
  12.     M = matrix(CDF,n+2,n+2,matL)
  13.     return sqrt(reduce(lambda x,y: x+y, map(lambda z: minor(M,0,z-1)**2/(4*minor(M,0,0)**2),range(1,n+2)))+(-1)**n*minor(M,0,n+1)/minor(M,0,0))
  14.  
  15. # Returns the radius of a (k-1)-sphere defined by k+1 points in R^n
  16. # L = set of k+1 points, each an n-dimensional vector
  17. def sphere_radius_general(L):
  18.     k = len(L)-1
  19.     n = len(L[0])
  20.    
  21.     # Shift vectors so one is at origin
  22.     L1 = []
  23.     for vec in L[1:]:
  24.         L1.append(vec-L[0])
  25.        
  26.     # Complete basis of R^n
  27.     L2 = []
  28.     for ind in range(n-k):
  29.         L2.append([0]*ind+[1]+[0]*(n-ind-1))
  30.     M = matrix(CDF,n,n,L1+L2)
  31.     Q,R = M.transpose().QR()
  32.    
  33.     # Make vectors for passing to other function
  34.     L3 = [vector(CDF,[0]*k)]
  35.     Qinv = Q.inverse()
  36.     for vec in L1:
  37.         L3.append((Qinv*vec)[:k-n])
  38.     return sphere_radius(L3)
  39.  
  40. # Returns the (i,j)-minor (determinant when ith row, jth col removed) of input matrix mat
  41. def minor(mat,i,j):
  42.     return mat.delete_rows([i]).delete_columns([j]).det()
  43.  
  44. # Test
  45. v1 = vector(CDF,[3,2,1])
  46. v2 = vector(CDF,[0,-1,3.3])
  47. v3 = vector(CDF,[5,6.8,-9.1])
  48. A = matrix(CDF,3,3,[v2-v1,v3-v1,[1,0,0]])
  49. Q,R=A.transpose().QR()
  50. a1 = (Q.inverse()*(v2-v1))[:-1]
  51. a2 = (Q.inverse()*(v3-v1))[:-1]
  52. print sphere_radius([vector(CDF,[0,0]),a1,a2])
  53. print sphere_radius_general([v1,v2,v3])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement