Advertisement
Guest User

Untitled

a guest
Apr 24th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.67 KB | None | 0 0
  1. EPS = 10 ** -9
  2. from random import randint
  3. import numpy as np
  4. from numpy.linalg import svd
  5. import sys
  6.  
  7. def getMatrixFromFile(fileName, flag=False):
  8.   with open(fileName, 'r') as f:
  9.     n = int(f.readline())
  10.     blank = f.readline()
  11.    # b = [float(f.readline()) for i in range(n)]
  12.     lines = f.readlines()
  13.     a = [dict() for i in range(n)]
  14.     for it in lines:
  15.       vals = it.split(',')
  16.       z, x, y = float(vals[0]), int(vals[1]), int(vals[2])
  17.       a[x][y] = a[x].get(y, 0) + z
  18.       if len(a[x]) > 10 and flag:
  19.         print("Matricea contine o linie cu mai mult de 10 elemente!!!")
  20.     checksim(a,n)
  21.     return n, a
  22.  
  23.  
  24. def add(a, b, n):
  25.   ans = [dict() for i in range(n)]
  26.   for i in range(n):
  27.     for it in a[i]:
  28.       ans[i][it] = ans[i].get(it, 0) + a[i][it]
  29.     for it in b[i]:
  30.       ans[i][it] = ans[i].get(it, 0) + b[i][it]
  31.   return ans
  32.  
  33.  
  34. def mul(a, b, n):
  35.   ans = [dict() for i in range(n)]
  36.   for i in range(n):
  37.     for j in range(n):
  38.       for k in a[i]:
  39.         if j in b[k]:
  40.           ans[i][j] = ans[i].get(j, 0) + a[i][k] * b[k][j]
  41.   return ans
  42.  
  43.  
  44. def mulVector(a, b, n):
  45.   ans = [0 for i in range(n)]
  46.   for i in range(n):
  47.     for k in a[i]:
  48.       ans[i] += a[i][k] * b[k]
  49.   return ans
  50.  
  51.  
  52. def compareMatrix(a, b, n):
  53.   for i in range(n):
  54.     if len(a[i]) != len(b[i]):
  55.       return False
  56.     for j in a[i]:
  57.       if j not in b[i]:
  58.         return False
  59.       if abs(a[i][j] - b[i][j]) > EPS:
  60.         print(a[i][j], b[i][j])
  61.         return False
  62.   return True
  63.  
  64.  
  65.  
  66. def dotprod(w,v):
  67.   s=0
  68.   for i in range(len(w)):
  69.     s+=w[i]*v[i]
  70.   return
  71.  
  72. def vecnorm(v):
  73.   norm=0
  74.   for i in range(len(v)):
  75.     norm+=v[i]**2
  76.   norm=norm**0.5
  77.   return norm
  78.  
  79. def checksim(a,n):
  80.     c=1
  81.     for i in range(len(a)):
  82.       for j in a[i].keys():
  83.         if i not in a[j].keys() or abs(a[i][j]-a[j][i]) > EPS and i!=j:
  84.           #print("Avem lipsa de simetrie!!!")
  85.           if(c==1):
  86.             print(i,j)
  87.           c=0
  88.     if c==0:
  89.       print("Avem lipsa de simetrie!!!")
  90.     else:
  91.       print("Matrice simetrica")   
  92.  
  93. def powermethod(a,n):
  94.   #get vector
  95.   v=list()
  96.   vv=list()
  97.   k=0
  98.   for i in range(n):
  99.     v.append(randint(0,10000))
  100.     vv.append(0)
  101.   norm=vecnorm(v)
  102.   for i in range(n):
  103.     v[i]=v[i]/norm
  104.   w=mulVector(a,v,n)
  105.   lamb=dotprod(w,v)
  106.   lamv=[lamb*i for i in v]
  107.   test=[w[i]-lamv[i] for i in range(n)]
  108.   #print(test)
  109.   #print(w)
  110.   #print(v)
  111.   #print(len(v))
  112.   while vecnorm(test)>n*EPS and k<=1000000:
  113.     norm=vecnorm(w)
  114.     for i in range(n):
  115.       vv[i]=w[i]/norm
  116.     w=mulVector(a,vv,n)
  117.     lamb1=dotprod(w,vv)
  118.     lamv=[lamb*i for i in v]
  119.     test=[w[i]-lamv[i] for i in range(n)]
  120.     k+=1
  121.     lamb=lamb1
  122.     v=[j for j in vv]
  123.   print(k)
  124.   print(lamb)
  125.   print(vecnorm(test))
  126.  
  127. def getMatrixFromFile2(fileName):
  128.   with open(fileName, 'r') as f:
  129.     a = [list(map(float, it.split())) for it in f.readlines()]
  130.     return a, len(a), len(a[0])
  131.    
  132. def genrandomvector(size):
  133.   b=list()
  134.   for i in range(size):
  135.     b.append(randint(0,10000))
  136.   return b
  137.  
  138. def Ainf(a, n, m):
  139.   aux = [0.0 for i in range(n)]
  140.   for i in range(n):
  141.     for j in range(m):
  142.       aux[i] += a[i,j]
  143.   max=aux[0]
  144.   for i in range(len(aux)):
  145.     if aux[i]>max:
  146.       max=aux[i]
  147.   #print(aux)
  148.   return max
  149.  
  150. if __name__ == '__main__':
  151.   #print("Matrice proprie")
  152.   #n1, a1 = getMatrixFromFile('a6.txt')
  153.   #print("Matrice laborator")
  154.   #n1, a1 = getMatrixFromFile('m_rar_sim_2018.txt')
  155.   #print(n2, a2)
  156.   #powermethod(a1,n1)
  157.   a,n,m=getMatrixFromFile2('a62.txt')
  158.   u,s,vstar=svd(np.asmatrix(a), full_matrices=True)
  159.   #print("Singular values:")
  160.   #print(s)
  161.   #print(len(s))
  162.   rk=0
  163.   min=s[0]
  164.   max=s[0]
  165.   #print("Rank:")
  166.   sinv=np.zeros((n,m))
  167.   for i in range(len(s)):
  168.     if s[i]!=0:
  169.       rk+=1
  170.       if max<s[i]:
  171.         max=s[i]
  172.       if min>s[i]:
  173.         min=s[i]
  174.       sinv[i][i]+=1/s[i]
  175.   #print(rk)
  176.   #print("Nr conditionare:")
  177.   #print(max/min)
  178.   print("Pseudoinversa:")
  179.   ainv=np.matmul(np.matmul(np.transpose(vstar), np.transpose(np.asmatrix(sinv))),np.transpose(u))
  180.   print(ainv)
  181.  # print(np.linalg.pinv(np.asmatrix(a)))
  182.   b=genrandomvector(n)
  183.   #x, res, rank, ss=np.linalg.lstsq(a, b)
  184.   xx=np.matmul(ainv, b)
  185.   print("Solutie:")
  186.   print(xx)
  187.   #print(xx)
  188.   #print(len(x))
  189.   print("Dati val:")
  190.   k=int(input())
  191.   #print(k)
  192.   while k>rk:
  193.     print("Valoare invalida")
  194.     k=int(input())
  195.   As=np.zeros((n,m))
  196.   for i in range(k):
  197.     cu=u[:,i]
  198.     cv=np.transpose(vstar)[:,i]
  199.     mataux=np.multiply(s[i],np.matmul(cu, np.transpose(cv)))
  200.     As=np.add(As, mataux)
  201.   dif=np.subtract(np.asmatrix(a), As)
  202.   print("Norma")
  203.   #print(np.asmatrix(dif)[1][0])
  204.   print(Ainf(np.asmatrix(dif), n, m))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement