2017-11-09 21 views
0

인수를 수학 함수, 인수 및 반복 수 (고정 점 정리가있는 함수의 0을 찾고 있음)로 사용하는 함수를 정의하려고합니다. 0을 찾는 방법을 알고 있지만 수학 방정식을 함수 자체에서 인수로 만드는 방법을 모르겠습니다.파이썬에서 mathematica 함수와 그것의 인수를 입력 받아 적용하는 함수를 정의하는 법.

def f(function,x,iterations) 

나는 예를 들어 같은 기능 뭔가를 호출하려고하면

f(x**2+3,-1,20) 

이미 복용 (I 코드의 또 다른 평화를 위해 definded 것을) X의 변수를 기존 아닌되는 기능 x = -1 여기서 찾고있는. 내가 찾는 결과는 +4

어떻게이 문제를 해결할 수 있습니까? 내 함수에서 다른 함수를 정의하려고 시도했지만 명시 적으로이 세 가지 인수가 내 함수에 대해 요구됩니다.

도움 주셔서 감사합니다.

+0

* 수학적 표현식을 일반 파이썬 함수 'def f (x) : return x ** 2 + 3' 또는 문자열이어야합니까? –

답변

1

파이썬에서 함수는 인수로 전달할 수있는 1 급 객체입니다. 외부에서 기본 함수를 정의 할 수 있습니다.

def my_f(x): 
    return x**2+3 

def my_functor(f, x, iterations): 
    for i in xrange(iterations): 
     x = f(x) 
    return x 

print my_functor(my_f, -1, 20) 

아마도 장식자를 사용하여 동일한 펑터를 정의하는보다 유용한 암시적인 방법을 찾을 수 있습니다. 이 경우

def iterated(fn): 
    """ 
    A decorator to make a function iterate over its outputs. 
    """ 
    def iterated_func(*args, **kwargs): 
     x = args[0] 
     iterations = args[1] 
     for i in xrange(iterations): 
      x = fn(x) 
     return x 
    return iterated_func 

@iterated 
def my_g(x): 
    return x**2+3 

, my_g(3,1)==my_f(3)True로 평가됩니다. 즉, 정의한 함수에 데코레이터 @iterated을 추가하면 해당 함수의 동작을 변경하여 반복 횟수를 인수로 얻을 수 있습니다.

+0

도움을 주셔서 감사합니다. 제가보기에 이것이 필요한 것입니다. –

0

함수를 문자열에 'x ** 2'로 저장하면 함수 내부에서 eval 메서드를 사용하여 함수를 사용할 수 있습니다. eval()

+0

'eval()'을 사용하면 [보안 위험] (https://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html)이 발생할 수 있습니다. – Megabeets

1

sympy을 사용하면 수학적 표현을 안전하게 평가할 수 있습니다.

첫째, sympy 설치 :

pip install sympy 

을 그리고,이 같은 소송을 제기 할 수 있습니다

>>> int(myformula(formula="x**2+3", x=-1, iterations=20)) 
4 

또는 순위 :

import sympy as sy 

def mathfunc(formula, **kwargs): 
    expr = sy.sympify(formula) 
    return expr.evalf(subs=kwargs) 


mathfunc(formula="x**2+3", x=-1, iterations=20) 

당신은이 같은 int로 캐스팅 할 수 있습니다 return 성명 01에 int() 추가.

iterations을 사용하지 않았다는 것을 유의하십시오. 원하는 것을 언급하지 않았으므로, 희망에 따라 mathfunc 안에 사용할 수 있습니다.

+0

도움을 주셔서 감사합니다. 이것은 제가 필요한 것입니다. 나는 sympy에 대해 더 많이 배울 필요가있다. 매우 실용적이다. –