Численный поиск корня с помощью Ньютона

Я хочу найти корень (т. е. значение x, чтобы f (x) = 0) для функции «func», используя метод Ньютона, импортированный из scipy.optimize. Я написал следующий код:

import numpy

from scipy import optimize


def A(b, c, e=70):
    d = 1 - c
    b_prime = ((1 + b) ** 3)
    wurzel = numpy.sqrt(c * b_prime + d)

    return e * wurzel

def U(b, c, e=70):
    return A(b, c, e=70)/e

def func(U, c, b, a):
    return U(b, c, e=70)**2 - (U(b, c, e=70)**a * (1-c)) - (c * (1+b)**3)

def func_prime(U, c, a):
    return 2*U(b, c, e=70) - (a*(U(b, c, e=70)**(a-1)))*(1-c)

def U_0(b, c):
    numpy.sqrt((c * (1+b)**3) + 1 - c )

res = optimize.newton(func(U, c, b, a), U_0(b, c), fprime=func_prime(U, c, a), args=(c, b, a))

Я вычислил U_0 аналитически, приняв a=0 в func и решив U. Я получаю следующую ошибку:

Traceback (most recent call last):
  File "root_finding_stack.py", line 25, in <module>
    res = optimize.newton(func(U, c, b, a), U_0(b, c), fprime=func_prime(U, c, a), args=(c, b, a))
NameError: name 'c' is not defined

Ошибка говорит, что c не определено, но в том-то и дело, что я не хочу определять a, b и c, а найти U (a, b, c), чтобы укоренить мою функцию. Я использую неправильный метод или что я делаю неправильно здесь? Также я не уверен, правильно ли я передаю 3 аргумента в функцииOptimize.newton.

Изменить: я добавил функцию в математической нотации

Это моя функция f(U,b,c), где U также является функцией b и c

Я пытаюсь найти U (b, c), который заполняет это уравнение


person user7248647    schedule 26.01.2017    source источник
comment
Я не знаю scipy, но вам наверняка нужно передать .newton объект функции, точно так же, как вы передаете U в func. Вместо этого вы передаете результат вызова func(U, c, b, a), что означает, что .newton получит число с плавающей запятой для этого аргумента, если вызов будет успешным. Но, конечно, это не удастся, так как эти аргументы не определены во время вызова.   -  person PM 2Ring    schedule 26.01.2017
comment
Можете ли вы дать нам функцию, для которой вы пытаетесь получить корень в обычной математической записи? Вы можете опубликовать это в своем вопросе в виде изображения. Если вы это сделаете, дайте мне знать.   -  person Bill Bell    schedule 26.01.2017
comment
Я добавил математическую запись   -  person user7248647    schedule 30.01.2017


Ответы (1)


func — это функция, которую нужно решить. Но вы определили функцию, у которой в качестве первого аргумента есть другая функция U, которая является функцией A, b, ce, но это константа), а A также является функцией.

Ньютон-Рафсон является одномерным решателем и поэтому может найти только корни f(x), а не f(g(b,c),a,b,c), где все a, b, c неизвестны.

Также кажется, что вы объединяете определения и использование функций Python с определением и использованием математических функций.

person dodell    schedule 26.01.2017