Python 在分配任务方面有困难吗 我需要做一些函数,这些函数在四元数上执行基本代数运算和其他一些事情(这些基本上是复数形式的a+席+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()

Python 在分配任务方面有困难吗 我需要做一些函数,这些函数在四元数上执行基本代数运算和其他一些事情(这些基本上是复数形式的a+席+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(),python,Python,现在,每当我运行模块时(因此它会执行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,但其他函数/方法似乎都没有正常工作(标准确实给出了一个值,但由于某些原因它不是正确的) 在我忘记之前,让我快速说明每个函

现在,每当我运行模块时(因此它会执行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个四元数。 共轭(自)需要将给定的四元数A+XI+YJ+ZK变换成这种形式:A席席-YJ-ZK。
norm(self)和倒数(self)需要分别返回四元数的norm和倒数

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

return self

在加法、mul、共轭和倒数的末尾。(如果这些方法的目的是更改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)

对其他方法也执行同样的操作。如果要在代码中使用
+
*
运算符,请将方法名称更改为
\uuuuuuu添加\uuuuuuu
\uuuuu mul\uuuu
。要使用
+=
*=
运算符执行就地加法和乘法,就像您当前的方法一样,请将当前方法重命名为
\uuu iadd\uuuu
\uu imul\uuuu
,但不要忘记在末尾返回
self

add()
不返回值,这就是它打印
None
的原因。相反,
p.add(q)
修改
p
in-place.Hello,谢谢您的帮助。我尝试实现您建议的add函数,但运行该模块现在会出现以下错误:TypeError:add()不接受任何参数(给定2个)。知道是什么原因吗?是的,对不起,我忘了复制函数参数。固定的。