【发布时间】: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