【问题标题】:TypeError: bad operand type for abs(): 'vpython.cyvector.vector'TypeError:abs()的错误操作数类型:'vpython.cyvector.vector'
【发布时间】:2021-12-31 11:48:43
【问题描述】:

我正在尝试使用此代码实现两个物体之间的引力:

def force(pos1, pos2, m1, m2):
"""
Returns the gravitational force exerted by object 2 on object 1.
Input:
  - pos1 = position vector of first object
  - pos2 = position vector of second object
  - m1   = mass of first object
  - m2   = mass of second object
Depends on:
  - G    = gravitational constant (global variable)
"""
f12 = - G * (m1*m2)/(abs(-pos2+pos1))**2
return(f12

def test_force(pos1, pos2, m1, m2, expected_force):
epsilon = 1e-10
f = force(pos1, pos2, m1, m2)
if not isinstance(f,vector):
    print(f"ERROR: function should return a vector but returns {f}.")
    return
args_as_string = f"({pos1}, {pos2}, {m1}, {m2})"
error = mag(f-expected_force)
if error<epsilon:
    print(f"OK: correct results for input {args_as_string}")
else:
    print(f"ERROR: wrong results for input {args_as_string}")
    print(f"  expected: {expected_force}")
    print(f"  got:      {f}")
test_force(vector(0,0,0),vector(1,0,0),1,1,vector(1,0,0))    # distance = 1 in x direction
test_force(vector(1,0,0),vector(0,0,0),1,1,vector(-1,0,0))   # swap objects
test_force(vector(0,0,0),vector(2,0,0),1,1,vector(0.25,0,0)) # distance = 2
test_force(vector(0,0,0),vector(0,1,0),1,1,vector(0,1,0))    # distance = 1 in y direction
test_force(vector(10,0,0),vector(10,1,0),1,1,vector(0,1,0))  # displaced from origin
test_force(vector(0,0,0),vector(1,0,0),2,1,vector(2,0,0))    # non-unit mass 1
test_force(vector(0,0,0),vector(1,0,0),1,2,vector(2,0,0))    # non-unit mass 

然后我得到了这个错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-fc2e944ca785> in <module>
     22         print(f"  got:      {f}")
     23 
---> 24 test_force(vector(0,0,0),vector(1,0,0),1,1,vector(1,0,0))    # distance = 1 in x direction
     25 test_force(vector(1,0,0),vector(0,0,0),1,1,vector(-1,0,0))   # swap objects
     26 test_force(vector(0,0,0),vector(2,0,0),1,1,vector(0.25,0,0)) # distance = 2

<ipython-input-7-fc2e944ca785> in test_force(pos1, pos2, m1, m2, expected_force)
      9 def test_force(pos1, pos2, m1, m2, expected_force):
     10     epsilon = 1e-10
---> 11     f = force(pos1, pos2, m1, m2)
     12     if not isinstance(f,vector):
     13         print(f"ERROR: function should return a vector but returns {f}.")

<ipython-input-6-a94ae125c120> in force(pos1, pos2, m1, m2)
     10       - G    = gravitational constant (global variable)
     11     """
---> 12     f12 = - G * (m1*m2)/(abs(-pos2+pos1))**2
     13     return(f12)

TypeError: bad operand type for abs(): 'vpython.cyvector.vector'

【问题讨论】:

    标签: python-3.x


    【解决方案1】:

    TypeError 出现是因为abs 函数的类型无效,在以下行:

    f12 = - G * (m1*m2)/(abs(-pos2+pos1))**2
    

    内置 abs 仅适用于标量(int、float、复数),但这里将 vpython.cyvector.vector 作为参数给出。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 2017-05-27
    • 2014-01-02
    • 2019-12-03
    相关资源
    最近更新 更多