Проблема с деривацией - как исправить «TypeError:« Добавить »объект не вызывается» - PullRequest
0 голосов
/ 13 февраля 2019

Программирование на python с numpy и sympy, и мои попытки использовать производные в моем коде терпят неудачу.Я часто получаю либо

«Ошибка типа:« объект »не вызывается»

и

«Ошибка ValueE: Первая переменная не можетбыть числом: 1 ".

Это программа, предназначенная для определения метода Ньютона для решения задачи поиска корней.Пример уравнения, который я использовал, составляет 1 / x + log (x) -2.Я упоминаю об этом, потому что у меня было несколько проблем с функцией журнала numpy.Я думаю, что моя проблема связана с разницей, которую я использую, поскольку я не совсем уверен, как использовать ее для возврата фактического значения, и литература, которую я прочитал, не невероятно полезна.

def newton(p0, f, n, t):
    global p
    p = 0
    for i in range(1, n+1):
        p = p0 - f(p0)/diff(f(x),p0)
        if abs(p-p0) < t:
            return p
        p0 = p
        i = i + 1
    return f"The method failed after {n} iterations. The procedure was unsuccessful."

print(newton(p0=1, f=1/x+log(x)-2, n=10, t=5e-324))

Я хотя бы ожидаю число, но я получаю ошибки, которые я описал выше.

1 Ответ

0 голосов
/ 13 февраля 2019

в вашем коде есть две проблемы,

во-первых, параметр f в вашей функции должен иметь вход 'function', что означает f=lambda x: 1/x+log(x)-2,

, втораяэто p = p0 - f(p0)/diff(f(x),p0).Если я правильно понимаю, вы ожидаете, что функция diff будет выполнять функцию деривации, однако это не так.Может быть, вы можете определить свою собственную функцию деривации:

def df(f, x):
    h = 1e-5
    return (f(x+h)-f(x))/h

, тогда вы можете написать p = p0 - f(p0)/df(f, p0)

, поэтому весь код можно записать так:

def newton(p0, f, n, t):
    global p
    p = 0
    for i in range(1, n+1):
        def df(f, x):
            h = 1e-5
            return (f(x+h)-f(x))/h
        p = p0 - f(p0)/df(f, p0)
        if abs(p-p0) < t:
            return p
        p0 = p
        i = i + 1
    return f"The method failed after {n} iterations. The procedure was unsuccessful."

print(newton(p0=1, f=lambda x: 1/x+log(x)-2, n=10, t=5e-324))
...