Advertisement
miklis

Untitled

Mar 21st, 2014
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. def div(a,b): #norim, kad nebutu stufo, tokio kaip 0.0, o butu vietoj to sveikieji
  2. if float(a)/b==a/b: return a/b
  3. return float(a)/b
  4. def gcd(*args): #rasime skaiciu DBD
  5. def gcd_of_two(a,b):
  6. a,b=abs(a),abs(b)
  7. while a>0:
  8. if b>a: a,b=b,a
  9. if a==1: return 1
  10. a-=(a/b)*b
  11. return b
  12. return reduce(lambda x,y: gcd_of_two(x,y), args)
  13. def unit(length, diagonal=[]):
  14. if diagonal==[]: diagonal=[1]*length
  15. return [tuple(int(i==j)*diagonal[i] for i in range(length)) for j in range(length)] #vienetine matrica
  16. def inverse(matrix): #atvirkstines matricos algoritmas
  17. #EXAMPLE: [[a1,a2,x1,x2],[b1,b2,y1,y2]] ->[[a3,a4,a5,a6],[x3,x4,x5,x6]], nes tai ekvivalentu zingsniui
  18. # /a1 a2\|/1 0 x1 x2\ _______\ /1 0\|/a3 a4 a5 a6\
  19. # \b1 b2/|\0 1 y1 y2/ / \0 1/|\x3 x4 x5 x6/
  20. #rows can be longer than len of matrix; that case last terms means solutions to several systems of equations
  21. M=[[m for m in n] for n in matrix] #SIDE EFFECTS ARE ELIMINATED IN THIS ROW
  22. U=unit(len(M))
  23. order=[(i,j) for i in range(len(M)-1) for j in range(i+1,len(M))]+[(i,j) for i in range(len(M)-1,0,-1) for j in range(i-1,-1,-1)]
  24. #eiluciu keitimo tvarka, kai reikia suvesti i trikampi, po to i diagolini pavidala
  25. for i in range(len(M)):
  26. U[i]=U[i]+tuple(M[i][len(matrix):len(M[0])])
  27. #eiluciu sudejimo eiliskumas
  28. try:
  29. for n in order:
  30. i,j=n[0],n[1]
  31. if M[i][i]==0: # jei pasitaike nulinis elementas ant istrizaines, keiciame matricos eilutes. Jei neradome, ka sukeisti - nera atvirkstines matricos
  32. p=0
  33. for k in range(i+1,len(M)):
  34. if M[k][i]<>0:
  35. M[i],M[k]=M[k],M[i]
  36. U[i],U[k]=U[k],U[i]
  37. p=1
  38. break
  39. if p==0: return [M[i] for i in range(len(M)) if M[i][i]<>0] #bug we'll use later
  40. if M[j][i]<>0: #suvedimo i trikampi pavidala vienas zingsnis, kai uznulinama kazkuri eilute
  41. c=M[i][i]*M[j][i]/gcd(M[i][i], M[j][i])
  42. c1,c2=c/M[i][i],c/M[j][i]
  43. M[j]=tuple(map(lambda x: x[1]*c1-x[0]*c2, zip(M[j],M[i])))
  44. U[j]=tuple(map(lambda x: x[1]*c1-x[0]*c2, zip(U[j],U[i])))
  45. return map(lambda i: tuple(map(lambda x: div(x, M[i][i]),U[i])), range(len(U)))
  46. except IndexError: print 'Nesiskaiciuoja inverse, per daug eiluciu matricoje'
  47. def solve_system(matrix): return [list(n) for n in zip(*inverse(matrix))[len(matrix):]]
  48. def interpolation(ordered_pairs):
  49. n=len(ordered_pairs)
  50. return solve_system([[m[0]**i for i in range(n)]+[m[1]] for m in ordered_pairs])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement