2016-01-16 2 views
2

Мне нужно сделать некоторые функции, которые выполняют основные алгебраические операции и пару других вещей на кватернионах (это в основном комплексные числа формы 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) должны соответственно возвращать норму и возвращать значение кватерниона

+2

'add()' не возвращает значение, поэтому оно печатает 'None'. Вместо этого 'p.add (q)' изменяет 'p' на месте. –

ответ

0

Вы получаете значения None, потому что вы не указали возвращаемое значение. Add a

return self 

в конце добавить, mul, сопряжено и взаимно. (Если предполагается, что эти методы изменяют значение p и не просто вычисляют новый Quaternion, оставляя p нетронутым.)

2

Вы правильно выполняете математику в принципе, но вы не возвращаете новый объект, вы должны быть.

Например, давайте посмотрим на add(). Когда вы суммируете два объекта, вы ожидаете, что возвращаемое значение будет третьим объектом того же типа, который вы печатаете. Ваша функция add() ничего не возвращает (в Python это эквивалентно возврату None) и вместо этого неожиданно изменяет объект, на который он вызывается. Вместо этого сделайте следующее:

def add(self, q): 
    return Quaternion(self.a + q.a, 
         self.x + q.x, 
         self.y + q.y, 
         self.z + q.z) 

Сделайте то же самое для других методов. Если вы хотите использовать в своем коде операторы + и *, измените имена методов на __add__ и __mul__. Чтобы сделать добавление и умножение на месте с помощью += и *= операторов, вроде ваших текущих методов, переименуйте текущие методы на __iadd__ и __imul__, но не забудьте вернуть self в конце.

+0

Здравствуйте, спасибо за помощь. Я попробовал реализовать функцию добавления, которую вы предложили, но запуск модуля теперь дает мне следующую ошибку: TypeError: add() не принимает аргументов (2 данных). Любая идея, что может вызвать это? –

+0

Да, извините, я забыл скопировать аргументы функции. Исправлена. –

Смежные вопросы