2012-01-05 3 views
46

파이썬을 사용하여 쌍의 비선형 방정식을 푸는 가장 좋은 방법은 무엇입니까? (NumPy와, Scipy 또는 Sympy)파이썬을 사용하여 한 쌍의 비선형 방정식을 푸는 방법은 무엇입니까?

예 : = 3

코드 조각

  • X + Y^2 = 4
  • E^X + XY 어느 위의 쌍을 해결할 것입니다 위대한 숫자 솔루션에 대한

+1

'sage' 할 수 있습니다. – Blender

+0

yea 나는 그것을 알고있다. 나는 파이썬에서 그것을하고 싶다. 다른 방정식 세트를 반복적으로하고 싶기 때문이다. – AIB

+0

파이썬 스크립트에서'sage'를 가져올 수있다. – Blender

답변

25

.

>>> nsolve([x+y**2-4, exp(x)+x*y-3], [x, y], [1, 1]) 
[0.620344523485226] 
[1.83838393066159] 

첫 번째 인수는 방정식 목록이고 두 번째 인수는 변수 목록이며 세 번째 인수는 초기 추측입니다.

1

openopt 패키지와 해당 NLP 방법을 사용할 수 있습니다. 이것은 비선형 대수 방정식 이루어진 해결하기 위해 여러 동적 프로그래밍 알고리즘을 가지고
goldenSection, scipy_fminbound, scipy_bfgs, scipy_cg, scipy_ncg, amsg2p, scipy_lbfgsb, scipy_tnc, bobyqa, ralg, ipopt, scipy_slsqp, scipy_cobyla, lincher, algencan, 할 수 ~에서 선택하십시오.
후자의 알고리즘 중 일부는 제한된 비선형 프로그래밍 문제를 해결할 수 있습니다. 나는이 결합 된 비선형 방정식 (일반적으로 포함 다항식에 대한 작업 Broyden의 방법을 가지고

lambda x: x[0] + x[1]**2 - 4, np.exp(x[0]) + x[0]*x[1]

0

: 그래서,이 같은 기능을 openopt.NLP()에 방정식의 시스템을 도입 할 수 있습니다 및 IDL의 지수들)은,하지만 난 파이썬에서 그것을 시도하지 않은 :

http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.broyden1.html#scipy.optimize.broyden1

scipy을.

scipy.optimize.broyden1(F, xin, iter=None, alpha=None, reduction_method='restart', max_rank=None, verbose=False, maxiter=None, f_tol=None, f_rtol=None, x_tol=None, x_rtol=None, tol_norm=None, line_search='armijo', callback=None, **kw)[source] 

optimize.broyden1는 Broyden 최초의 코비 근사를 사용하여 함수의 뿌리를 찾을 수 있습니다.

이 방법은 "Broyden 's good method"로도 알려져 있습니다.

+1

왜 이것이 다운 투표입니까? 진행할 합법적 인 방법처럼 보입니다 ... – aquirdturtle

0

이것을 사용해보십시오. 완벽하게 작동합니다.

import scipy.optimize as opt 
    from numpy import exp 
    import timeit 

    st1 = timeit.default_timer() 

    def f(variables) : 
     (x,y) = variables 

     first_eq = x + y**2 -4 
     second_eq = exp(x) + x*y - 3 
     return [first_eq, second_eq] 

    solution = opt.fsolve(f, (0.1,1)) 
    print(solution) 


    st2 = timeit.default_timer() 
    print("RUN TIME : {0}".format(st2-st1)) 

-> 

[ 0.62034452 1.83838393] 
RUN TIME : 0.0009331008900937708 

참고하시기 바랍니다. 위에서 언급 한 바와 같이 'broyden 's approximation'을 'fsolve'를 'broyden1'로 대체하여 사용할 수도 있습니다. 그것은 작동합니다. 나는 그것을했다.

정확하게 Broyden의 근사가 어떻게 작동하는지 모르지만 0이 걸립니다.02 초.

그리고 나는 Sympy의 기능을 사용하지 않는 것이 좋습니다. < - 실제로는 편리하지만 속도면에서 보면 상당히 느립니다. 너 볼거야.

0
from scipy.optimize import fsolve 

def double_solve(f1,f2,x0,y0): 
    func = lambda x: [f1(x[0], x[1]), f2(x[0], x[1])] 
    return fsolve(func,[x0,y0]) 

def n_solve(functions,variables): 
    func = lambda x: [ f(*x) for f in functions] 
    return fsolve(func, variables) 

f1 = lambda x,y : x**2+y**2-1 
f2 = lambda x,y : x-y 

res = double_solve(f1,f2,1,0) 
res = n_solve([f1,f2],[1.0,0.0])