파이썬을 사용하여 쌍의 비선형 방정식을 푸는 가장 좋은 방법은 무엇입니까? (NumPy와, Scipy 또는 Sympy)파이썬을 사용하여 한 쌍의 비선형 방정식을 푸는 방법은 무엇입니까?
예 : = 3
코드 조각
- X + Y^2 = 4
- E^X + XY 어느 위의 쌍을 해결할 것입니다 위대한 숫자 솔루션에 대한
파이썬을 사용하여 쌍의 비선형 방정식을 푸는 가장 좋은 방법은 무엇입니까? (NumPy와, Scipy 또는 Sympy)파이썬을 사용하여 한 쌍의 비선형 방정식을 푸는 방법은 무엇입니까?
예 : = 3
코드 조각
- X + Y^2 = 4
- E^X + XY 어느 위의 쌍을 해결할 것입니다 위대한 숫자 솔루션에 대한
사용 fsolve : 당신이 nsolve을 사용할 수 있습니다 sympy 원하는 경우
http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fsolve.html#scipy.optimize.fsolve
from scipy.optimize import fsolve
import math
def equations(p):
x, y = p
return (x+y**2-4, math.exp(x) + x*y - 3)
x, y = fsolve(equations, (1, 1))
print equations((x, y))
.
>>> nsolve([x+y**2-4, exp(x)+x*y-3], [x, y], [1, 1])
[0.620344523485226]
[1.83838393066159]
첫 번째 인수는 방정식 목록이고 두 번째 인수는 변수 목록이며 세 번째 인수는 초기 추측입니다.
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]
: 그래서,이 같은 기능을 openopt.NLP()에 방정식의 시스템을 도입 할 수 있습니다 및 IDL의 지수들)은,하지만 난 파이썬에서 그것을 시도하지 않은 :
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"로도 알려져 있습니다.
왜 이것이 다운 투표입니까? 진행할 합법적 인 방법처럼 보입니다 ... – aquirdturtle
이것을 사용해보십시오. 완벽하게 작동합니다.
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의 기능을 사용하지 않는 것이 좋습니다. < - 실제로는 편리하지만 속도면에서 보면 상당히 느립니다. 너 볼거야.
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])
'sage' 할 수 있습니다. – Blender
yea 나는 그것을 알고있다. 나는 파이썬에서 그것을하고 싶다. 다른 방정식 세트를 반복적으로하고 싶기 때문이다. – AIB
파이썬 스크립트에서'sage'를 가져올 수있다. – Blender