2013-04-19 4 views
4

Я очень новичок, поэтому, пожалуйста, будьте осторожны.Математическое выражение как аргумент функции?

Я занимаюсь некоторыми упражнениями на Python, и у меня есть код, похожий на этот.

def newton(x0, Tol): 
    def F(x): 
     return (x**3)+898 
    def dF(x): 
     return 3*x**2 
    x=[x0] 
    for n in range(400): 
     x.append(x[n]-(F(x[n]))/dF(x[n])) 
     if abs((x[n+1])-(x[n]))<Tol: 
      conv='Converge' 
      print n 
      break 
    if abs((x[n+1])-(x[n]))>=Tol: 
     conv='No converge' 
    return x[n+1], conv 

Я определяю функцию F(x) и ее производная dF(x) и добавить значения в список x.

Задача состоит в том, чтобы проверить, сходится ли серия или нет, что, по-моему, я преуспел.

Но вопрос, который у меня есть, касается функций (x**3)+898 и 3*x**2 в качестве аргументов функции Newton.

Я предполагал, что это будет что-то вроде этого

def newton(f, df, x0, Tol): 
    def F(x): 
     return f 
    def dF(x): 
     return df 
    *calculations* 
    return x[n+1], conv 

И вы могли бы назвать его

newton((x**3)+898, 3*x**2, x0=something, Tol=something) 

Так что функции F(x) и dF(x) определяются в процессе.

Однако x не определен, поэтому он не работает.

Обратите внимание на то, что в упражнении требуется наличие f и df в качестве параметров «newton».

Как вы решаете это?

Спасибо.

ответ

3

Использование lambda:

newton(lambda x: (x**3)+898, lambda x: 3*x**2, x0=something, Tol=something) 
6

Вы можете использовать lambdas, которые являются в основном простые функции.

Вы назвали бы это так:

newton(lambda x: (x**3)+898, lambda x: 3*x**2, x0=something, Tol=something) 

Это было бы то же самое, как сделать что-то вроде этого:

def f1(x): 
    return (x**3)+898 
def f2(x): 
    return 3*x**2 
newton(f1, f2, x0=something, Tol=something) 

Единственное отличие состоит в том, что вы не «дают лямбда-а, name ", то есть присвоить его переменной. Это удобно для функций, которые вам нужно использовать только один раз, особенно в качестве ключевых аргументов для таких функций, как sorted и max.

Смежные вопросы