Мне нужно сделать некоторые функции, которые выполняют основные алгебраические операции и пару других вещей на кватернионах (это в основном комплексные числа формы a + x i + y j + z * k) , Сначала я создал класс, который содержит некоторые атрибуты, и всякий раз, когда я создаю экземпляр с ним, я получаю кватернион. Однако, когда я пытался реализовать функции, о которых я упоминал, я продолжаю получать сообщения об ошибках. Во всяком случае, вот мой код в его полном объеме:Имея некоторые проблемы с назначением
from math import *
class Quaternion(object):
def __init__(self, re, xc, yc, zc):
self.a = re
self.x = xc
self.y = yc
self.z = zc
def __str__(self):
return str(self.a) + "+" + str(self.x) + "i" + "+" + str(self.y) + "j" + "+" + str(self.z) + "k"
def add(self, q):
self.a = self.a + q.a
self.x = self.x + q.x
self.y = self.y + q.y
self.z = self.z + q.z
def mul(self, q):
self.a = self.a*q.a - self.x*q.x - self.y*q.y - self.z*q.z
self.x = self.a*q.x + self.x*q.a + self.y*q.z - self.z*q.y
self.y = self.a*q.y + self.y*q.a + self.z*q.x - self.x*q.z
self.z = self.a*q.z + self.z*q.a + self.x*q.y - self.y*q.x
def conjugate(self):
self.a = self.a
self.x = -1 * self.x
self.y = -1 * self.y
self.z = -1 * self.z
def norm(self):
return sqrt((self.a)**2+(self.x)**2+(self.y)**2+(self.z)**2)
def reciprocal(self):
p1 = self.conjugate()
self.a = p1.a * (1/(self.norm())**2)
self.x = p1.x * (1/(self.norm())**2)
self.y = p1.y * (1/(self.norm())**2)
self.z = p1.z * (1/(self.norm())**2)
def main():
p = Quaternion(2, 0, -3, 0)
q = Quaternion(0, 1, 1, -2)
print "p =", p
print "q =", q
print "p + q =", p.add(q)
print "p * q =", p.mul(q)
print "conjugate of p is", p.conjugate()
print "norm of p is", p.norm()
print "reciprocal of p is", p.reciprocal()
print "p x reciprocal(p) =", p.mul(p.reciprocal)
if __name__ == '__main__':
main()
Теперь, когда я запустить модуль (так он затем выполняет команды под основной функции), я получаю это:
p = 2+0i+-3j+0k
q = 0+1i+1j+-2k
p + q = None
p * q = None
conjugate of p is None
norm of p is 9.11043357914
reciprocal of p is
Единственные вещь, которую он делает правильно, печатает два кватерниона p и q, но ни одна из других функций/методов, кажется, не работает должным образом (норма дает значение, но по какой-то причине она не является подходящей).
Прежде чем я забыл, позвольте мне быстро сказать, что каждая из функций нужно сделать:
добавить (я, д) необходимо добавить 2 кватернионов вместе. mul (self, q) необходимо умножить 2 кватерниона. конъюгата (сами) должен преобразовать заданные кватернионы а + х я + у J + Z K в эту форму: а - х я - у J - г к. норма (self) и обратная (self) должны соответственно возвращать норму и возвращать значение кватерниона
'add()' не возвращает значение, поэтому оно печатает 'None'. Вместо этого 'p.add (q)' изменяет 'p' на месте. –