我正在定义一组函数,将地心参考系转换为经典轨道元素。这是我的密码:
import numpy as np
import matplotlib.pyplot as plt
#converting r,v to orbital elements
u = 3.986*10e14 #gravitational parameter for Earth
list_r = [-2413.9, 6083.8, -1136.0]
r = np.array(list_r)
list_v= [-6.5461, -3.1365, -3.6385]
v = np.array(list_v)
def h(r,v):
return np.cross(r,v)
list_k = [0,0,1]
k = np.array(list)
def n(k,h):
return np.cross(k,h)
def e_vec(v,r):
vector = 1/u * (np.dot((np.linalg.norm(v))**2-u/np.linalg.norm(r),r)-np.dot(np.dot(r,v),v))
return vector
def p(h,u):
return (np.linalg.norm(h))**2/u
def a(p,e):
return p/(1-np.linalg.norm(e_vec)**2)
def i(h):
return np.arccos(np.dot(k,h(r,v))/np.linalg.norm(h(r,v)))
list_I = [1,0,0]
I = np.array(list_I)
def ohm(I,n):
nI = np.dot(n(h),I)
ohm = np.acos(nI/n)
return ohm
def w(n,e):
w = np.arccos(np.dot(n,e)/(np.linalg.norm(n)*np.linalg.norm(e)))
return w
def f(e,r):
f = np.arccos(np.dot(e_vec(v,r),r)/(np.linalg.norm(e_vec(v,r))*np.linalg.norm(r)))
return f
print(h(r,v))
print(e_vec(v,r))
print(p(h(r,v),u))
print(i(h(r,v)))
print(ohm(I,n))
print(w)
print(f)
我得到这个错误:TypeError:'numpy.ndarray'对象对于函数I(h)是不可调用的。我不知道该怎么解决这个问题
你的问题是你被范围界定弄糊涂了
h(r, v)
是函数的结果,因此是numpy
数组,而h
是函数本身。您正在将h(r, v)
作为h
传递给i
,但仍希望作用域i
中的h
是一个函数另外
k
不在i
的范围内,因此这也会导致错误。你可能应该定义并传递
i(k, r, v)
,或定义:并通过
i(k, h(r, v))
更好的方法是将所有变量都包装在
class
中,并将所有变量保持在self
范围内,以便更容易跟踪,但面向对象编程的前端工作可能超出了您的需要您有一个名为
def h(r,v)
的函数,并且还将参数命名为h
。这是一场冲突。在函数i
的作用域中,nameh
指的是参数,即numpy.ndarray,而不是函数。你应该避免使用相同的名字虽然局部变量可以是简短、单一的名称,但函数的信息量应该更大。特别地,您已经定义了一个函数
h
,但也使用了h
作为局部变量。这让你(和我们)感到困惑在一些函数中
h
是一个局部变量和一个数组(至少是np.cross
所期望的):同样适用于
但是
i
打破了这种模式:这里
h
仅当它是一个函数时才起作用。但是您没有通过r
、v
或k
与您的其他功能更加一致。它也更符合
相关问题 更多 >
编程相关推荐