Я хочу найти корень (т. е. значение 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.
Изменить: я добавил функцию в математической нотации
Я пытаюсь найти U (b, c), который заполняет это уравнение
.newton
объект функции, точно так же, как вы передаетеU
вfunc
. Вместо этого вы передаете результат вызоваfunc(U, c, b, a)
, что означает, что.newton
получит число с плавающей запятой для этого аргумента, если вызов будет успешным. Но, конечно, это не удастся, так как эти аргументы не определены во время вызова. - person PM 2Ring   schedule 26.01.2017