制作一个采用初始猜测和参数的python函数,以产生以单个值终止的猜测

时间:2019-02-17 02:42:41

标签: python algorithm function

试图创建一个需要初始猜测和其他3个参数的函数,以产生会聚为单个值的猜测。

试图制作一个带有4个参数的python函数:

  • 一个python函数,它接受数字作为输入,并返回浮点数作为输出。使用这个:def f(x): return 2 - exp(-x)

  • 定点的初始猜测,浮点数

  • 公差值,正值浮点数

  • 允许算法运行的最大迭代次数

要测量最近的猜测与定点的接近程度,我采用了3个最新值并使用以下等式(zap是这种情况下要访问的列表):caltol = abs(((zap[-1]-zap[-2])**2)/((2*zap[-2])-zap[-3]-zap[-1])) < / p>

这是我已经尝试过的代码,但是似乎在nugget = mega[len(mega)-numms]中出现了超出范围的错误。同样,当对参数使用某些值时,代码无法返回正确的值,一个示例是guess_finder(f, xo=83.30748524231714, tol=0.0013756415772893204, max_it=232)应该返回[83.30748524231714, 2.0, 1.8646647167633872],而应返回[83.30748524231714, 2.0, 1.8646647167633872, 1.8450518473052135, 1.8419828720850022]

另一个示例:运行guess_finder(f, xo=91.0, tol=1e-10, max_it=10)应该输出[91.0, 2.0, 1.8646647167633872, 1.8450518473052135, 1.8419828720850022, 1.8414971765224537, 1.8414201737059899, 1.8414079621425745, 1.8414060254740223, 1.8414057183297619]

from math import exp
from collections import OrderedDict

def f(x):
    return  2 - exp(-x)

def guess_finder(func, xo, tol, max_it):
    legit=[]
    legit.append(xo)
    caltol = 0
    guesses = []

    mega = []    

    for x in range(max_it-1):
        xo = func(xo)
        legit.append(xo)  

    zap = list(OrderedDict.fromkeys(legit))

    if max_it > 3 and len(zap) >= 3:
        mega = zap.copy()

        for i in range(len(zap)):
            print(caltol)
            caltol = abs(((zap[-1]-zap[-2])**2)/((2*zap[-2])-zap[-3]-zap[-1]))

            if caltol < tol:
                zap.pop()

    numms= len(mega)- len(zap)        
    if numms != 0 and numms > 0 :
        nugget = mega[len(mega)-numms]  
        zap.append(nugget)

    return zap

该函数应该产生猜测,直到ϵn小于指定的公差值,或者直到产生的猜测数量(包括初始猜测)匹配/超过最大迭代次数为止。它应该返回所有猜测的列表。在评估公差之前,需要进行三个猜测。

在此方面的任何帮助将不胜感激。 谢谢。

1 个答案:

答案 0 :(得分:0)

代码中有两项修改-

  1. for i in range(len(zap)):中,您需要停下来-在公差值很高的情况下为2,否则它将超出范围-for i in range(len(zap)-2):

  2. 在收敛速度比迭代次数快得多的情况下添加条件-if len(zap)>3: return zap[:3];

此外,由于您正在订购列表,因此仅在x <f(x) or x>f(x) for x in your space下有效。

您的完整代码将如下所示-

from math import exp
from collections import OrderedDict

def f(x):

    return  2 - exp(-x)

def guess_finder(func, xo, tol, max_it):

    legit=[]
    legit.append(xo)
    caltol = 0
    guesses = []

    mega = []    

    for x in range(max_it-1):
        xo = func(xo)
        legit.append(xo)  

    #print(legit)

    zap = list(OrderedDict.fromkeys(legit))
    #print(legit)
    if max_it > 3 and len(zap) >= 3:
        mega = zap.copy()

        for i in range(len(zap)-2):
            print(caltol)
            caltol = abs(((zap[-1]-zap[-2])**2)/((2*zap[-2])-zap[-3]-zap[-1]))

            if caltol < tol:
                zap.pop()
    if len(zap)>3:
        print("test")
        return zap[:3]
    numms= len(mega)- len(zap)        
    if numms != 0 and numms > 0 :
        nugget = mega[len(mega)-numms]  
        zap.append(nugget)

    return zap