我需要制作一些执行基本代数运算的函数以及四元数上的其他几个函数(这些函数基本上是复数形式的一个+ 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()
现在,每当我运行模块(然后它执行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,但其他函数/方法似乎都没有正常工作(规范确实给出了一个值,但由于某种原因它不是正确的)
在我忘记之前,让我快速说出每个功能需要做什么:
add(self,q)需要一起添加2个四元数。 mul(self,q)需要乘以2个四元数。 共轭(self)需要将给定的四元数a + x i + y j + z k转换为这种形式:a - x i - y j - z ķ。 规范(自我)和互惠(自我)需要分别返回四元数的范数和倒数
答案 0 :(得分: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
。
答案 1 :(得分:0)
您获得None值,因为您没有指定返回值。添加
return self
在add,mul,conjugate和reciprocal结束时。 (如果打算这些方法改变p的值,并且不要只是计算新的四元数而保持p不变。)