和男人有点麻烦

2024-04-19 16:01:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要做一些函数来执行基本的代数运算和其他一些关于四元数的事情(这些基本上是复数形式的a+xI+yj+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)需要将两个四元数相加。 mul(self,q)需要乘以2个四元数。 共轭(self)需要将给定的四元数a+xi+yj+zk转换成以下形式:a-xi-yj-zk。 范数(self)和倒数(self)需要分别返回四元数的范数和倒数


Tags: of函数selfnormismaindefprint
2条回答

因为没有指定返回值,所以得到了None值。添加

return self

在加法、乘法、共轭和倒数的末尾。(如果这些方法的目的是改变p的值,不要只计算一个新的四元数,而保持p不变。)

您在原则上正确地执行了数学运算,但没有返回应该返回的新对象。你知道吗

例如,让我们看看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。你知道吗

相关问题 更多 >