Форум сайта python.su
Здравствуйте!
Понадобилось написать программу, которая бы находила базисные вектора обратной решётки для этого написал программу на питоне:
#-*- coding: utf-8 -*-
a1={"x": 1, "y": 0, "z": 0 }
a2={"x": 0, "y": 1, "z": 0 }
a3={"x": 0, "y": 0, "z": 1 }
b1={"x": 0, "y": 0, "z": 0 }
b2={"x": 0, "y": 0, "z": 0 }
b3={"x": 0, "y": 0, "z": 0 }
v={"x": 0, "y": 0, "z": 0 }
def scalar(first = None, second = None): #вычисление скалярного произведения координат
return first["x"]*second["x"]+first["y"]*second["y"]+first["z"]*second["z"]
def vector(first = None,second = None): #вычисление векторного произведения
v["x"]=first["y"]*second["z"]-first["z"]*second["y"]
v["y"]=first["z"]*second["x"]-first["x"]*second["z"]
v["z"]=first["x"]*second["y"]-first["y"]*second["x"]
return v
def triple(first = None, second = None, third = None): #вычисление смешанного произведения
return scalar(first,vector(second,third))
def recvect1(first = None, second = None, third = None): #вычисление первого вектора обратной решетки
b1 = vector(second,third)
div = triple(first,second,third)
b1["x"] = b1["x"]/div
b1["y"] = b1["y"]/div
b1["z"] = b1["z"]/div
return b1
def recvect2(first = None, second = None, third = None): #вычисление второго вектора обратной решетки
b2 = vector(third,first)
div = triple(second,third,first)
b2["x"] = b2["x"]/div
b2["y"] = b2["y"]/div
b2["z"] = b2["z"]/div
return b2
def recvect3(first = None, second = None, third = None): #вычисление третьего вектора обратной решетки
b3 = vector(first,second)
div = triple(third,first,second)
b3["x"] = b3["x"]/div
b3["y"] = b3["y"]/div
b3["z"] = b3["z"]/div
return b3
b1 = recvect1(a1,a2,a3)
print b1
b2 = recvect2(a1,a2,a3)
print b2
print "b1 now is ", b1
b3 = recvect3(a1,a2,a3)
print b3
print "b2 now is ", b2
print "b1 now is ", b1
{'y': 0, 'x': 1, 'z': 0}
{'y': 1, 'x': 0, 'z': 0}
b1 now is {'y': 1, 'x': 0, 'z': 0}
{'y': 0, 'x': 0, 'z': 1}
b2 now is {'y': 0, 'x': 0, 'z': 1}
b1 now is {'y': 0, 'x': 0, 'z': 1}
Офлайн
Что бы значение не менялось нужно объявление вектора v перенести из глобальной области в ту функцию где он используется.
А для словарей порядок вывода вроде бы не гарантируется. Напишите вспомогательную функцию для вывода вектора так как вам надо, что-нибудь типа этого:
def print_d(d):
print "{x = %(x)s, y = %(y)s, z = %(z)s}" % d
Офлайн