涉及牛顿方法的小python程序

时间:2017-12-09 16:49:34

标签: python newtons-method

我正在尝试在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 ...有人可以帮助我吗?我在这做错了什么?

提前谢谢!

1 个答案:

答案 0 :(得分:0)

这段代码有很多问题,我不知道所需的行为是什么,所以不能保证这会有所帮助,但我会尝试帮你调试(虽然看起来你大多数需要重新阅读你的Python课程......)。

首先,在大多数语言中,如果不是全部,则有一个名为scope的东西:变量,函数或任何其他对象,仅存在于特定范围内。特别是,变量仅存在于它们所定义的函数的范围内。这意味着,要使用函数的结果,首先需要return结果(您正在做的),以及何时您调用该函数需要将该结果存储到变量中,例如ta = trueanomaly(e, E0)

然后,即使您想要返回多个值,也不需要在返回值时使用括号。如果您确实想要返回多个值,则只需要用逗号分隔它们,但不能用逗号的字符串字符分隔:写return ta, rv而不是return ta","rv

最后,您似乎在迭代一系列值,但是您没有返回整个值范围,而是返回第一个值(如果您的return位于for循环中)或者是最后一个(如果returnfor循环下)。相反,您可能希望将所有tarv值存储到一个/两个列表中,并最终返回那些/那些列表,例如:

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函数?