我正在尝试在python中编写一个涉及(除其他事项)Newton方法的小程序,但我遇到了几个问题,这可能是非常基本的,但由于我是编程的新手,我无法克服..
首先我定义了函数及其派生词:
import math
def f(x,e,m):
return x-e*math.sin(x)-m
def df(x,e):
return 1-e*math.cos(x)
def newtons_method(E0,m,e,q):#q is the error
while abs(f(E0,e,m))>q:
E=E0-f(E0,e,m)/df(E0,e)
E0=E
return (E0)
def trueanomaly(e,E):
ta=2*math.arctan(math.sqrt((1+e)/(1-e))*math.tan(E))
return (ta)
def keplerianfunction(T,P,e,K,y,w):
for t in frange (0,100,0.5):
m=(2*math.pi*((t-T)/P))
E0=m+e*math.sin(m)+((e**2)/2)*math.sin(2*m)
newtons_method(E0,m,e,0.001)
trueanomaly(e,E0)
rv=y+K*(e*math.cos(w)+math.cos(w+ta))
return (ta)","(rv)
def frange(start, stop, step):
i = start
while i < stop:
yield i
i += step
问题是,这一直给我错误,缩进错误和东西,特别是在keplerianfunction ...有人可以帮助我吗?我在这做错了什么?
提前谢谢!
答案 0 :(得分:0)
这段代码有很多问题,我不知道所需的行为是什么,所以不能保证这会有所帮助,但我会尝试帮你调试(虽然看起来你大多数需要重新阅读你的Python课程......)。
首先,在大多数语言中,如果不是全部,则有一个名为scope的东西:变量,函数或任何其他对象,仅存在于特定范围内。特别是,变量仅存在于它们所定义的函数的范围内。这意味着,要使用函数的结果,首先需要return
结果(您正在做的),以及何时您调用该函数需要将该结果存储到变量中,例如ta = trueanomaly(e, E0)
。
然后,即使您想要返回多个值,也不需要在返回值时使用括号。如果您确实想要返回多个值,则只需要用逗号分隔它们,但不能用逗号的字符串字符分隔:写return ta, rv
而不是return ta","rv
最后,您似乎在迭代一系列值,但是您没有返回整个值范围,而是返回第一个值(如果您的return
位于for
循环中)或者是最后一个(如果return
在for
循环下)。相反,您可能希望将所有ta
和rv
值存储到一个/两个列表中,并最终返回那些/那些列表,例如:
def keplerianfunction(T,P,e,K,y,w):
# Initialise two empty lists
tas = []
rvs = []
for t in frange (0,100,0.5):
m = 2*math.pi*((t-T)/P)
E0 = m+e*math.sin(m)+((e**2)/2)*math.sin(2*m)
E0 = newtons_method(E0,m,e,0.001)
ta = trueanomaly(e,E0)
rv = y+K*(e*math.cos(w)+math.cos(w+ta))
# At each step save the value for ta and rv into the appropriate list
tas.append(ta)
rvs.append(rv)
# And finally return the lists
return (tas,rvs)
此外,为什么在frange
具有完全相同的行为且可能更有效时使用新的range
函数?