Создайте функцию python, которая принимает начальное предположение и параметры для создания догадок, которые заканчиваются одним значением - PullRequest
0 голосов
/ 17 февраля 2019

Попытка создать функцию, которая принимает начальное предположение и 3 других параметра, чтобы получить догадки, которые сходятся к одному значению.

Попытка создать функцию python, которая принимает 4 аргумента:

  • функция python, которая принимает число в качестве ввода и возвращает число с плавающей точкой в ​​качестве вывода.Используя это: def f(x): return 2 - exp(-x)

  • начальное предположение для фиксированной точки, число с плавающей точкой

  • значение допуска, aположительное число с плавающей запятой

  • максимальное число итераций, которые разрешено выполнять алгоритму

Чтобы измерить, насколько близка последняя догадкас фиксированной точкой, я беру 3 самых последних значения и использую это уравнение (zap - это список, к которому в этом случае осуществляется доступ): caltol = abs(((zap[-1]-zap[-2])**2)/((2*zap[-2])-zap[-3]-zap[-1]))

Это код, который я уже пробовал, но кажетсячтобы получить ошибки вне диапазона в 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 голосов
/ 19 февраля 2019

Две модификации в вашем коде -

  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...