2017-04-06 8 views
0

값 배열 x에 대한 초기 추측을 감안할 때 x에 가장 가까운 시스템의 루트를 찾으려고합니다. f_if임의의 십진수 정밀도에 대한 방정식 시스템의 근간을 찾는다

내에서 하나 개의 특정 기능이

0 = f_1(x) 
0 = f_2(x) 
.... 
0 = f_n(x) 

패키지 내에서있다 : 당신이 시스템의 뿌리를 찾는 데에 익숙하다면, 당신은 방정식의 시스템에 대한 f을 만족 루트를 찾는 것은 이해합니다 scipy 정확히 수행 할 것입니다 : scipy.optimize.newton_krylov. 예를 들면 : 나는 매우 정밀하게 일을하고 있기 때문에

import scipy.optimize as sp 

def f(x): 
    f0 = (x[0]**2) + (3*(x[1]**3)) - 2 
    f1 = x[0] * (x[1]**2) 
    return [f0, f1] 
# Nearest root is [sqrt(2), 0] 
print sp.newton_krylov(f, [2, .01], iter=100, f_tol=Dc('1e-15')) 

>>> [ 1.41421356e+00 3.49544535e-10] # Close enough! 

는 그러나, 나는 파이썬 내 decimal 패키지를 사용하고 있습니다. decimal은 10 진수 이상의 정밀도를 제공합니다. scipy.optimize.newton_krylov은 부동 소수점 정밀도 값을 반환합니다. 임의로 정확한 10 진수 정밀도로 내 대답을 얻을 수있는 방법이 있습니까?

답변

0

나는 mpmath.findroot을 포함하는 mpmath 모듈을 발견했습니다. mpmath은 모든 숫자에 임의의 소수점 이하 자릿수를 사용합니다. mpmath.findroot은 허용 오차 내에서 가장 가까운 루트를 찾습니다.

import scipy.optimize as sp 
import mpmath 
from mpmath import mpf 
mpmath.mp.dps = 15 

def mp_f(x1, x2): 
    f1 = (x1**2) + (3*(x2**3)) - 2 
    f2 = x1 * (x2**2) 
    return f1, f2 

def f(x): 
    f0 = (x[0]**2) + (3*(x[1]**3)) - 2 
    f1 = x[0] * (x[1]**2) 
    return [f0, f1] 

tmp_solution = sp.newton_krylov(f, [2, .01], f_tol=Dc('1e-10')) 
print tmp_solution 

>>> [ 1.41421356e+00 4.87315249e-06] 

for _ in range(8): 
    tmp_solution = mpmath.findroot(mp_f, (tmp_solution[0], tmp_solution[1])) 
    print tmp_solution 
    mpmath.mp.dps += 10 # Increase precision 

>>> [ 1.4142135623731] 
[4.76620313173184e-9] 
>>> [ 1.414213562373095048801689] 
[4.654573673348783724565804e-12] 
>>> [ 1.4142135623730950488016887242096981] 
[4.5454827e-15] 
>>> [ 1.41421356237309504880168872420969807856967188] 
[4.43894795688326535096068850443292395286770757e-18] 
>>> [ 1.414213562373095048801688724209698078569671875376948073] 
[4.334910114213471839327827177504976152074382061299675453e-21] 
>>> [  1.414213562373095048801688724209698078569671875376948073176679738] 
[4.2333106584123451747941381835420647823192649980317402073699554127e-24] 
>>> [ 1.41421356237309504880168872420969807856967187537694807317667973799073247846] 
[4.1340924398558139440207202654766836515453497962889870471467483995909717197e-27] 
>>> [  1.41421356237309504880168872420969807856967187537694807317667973799073247846210703885] 
[4.037199648296693366576484784520203892002447351324378380584214947262318103197216393589e-30] 

정밀도 임의로 상승 될 수있다 : 여기에 높은 정밀도로, 동일한 문제에 대한 mpmath를 사용하는 예이다.

2

코드를 복사하고 scipy.optimize.newton_krylov에 의해 참조 된 다음 부동 소수점 값이 아닌 decimal 값을 사용하도록 수정할 수 있습니다. 물론 이것은 어렵고 시간 소모적 일 수 있습니다.

나는 다른 상황을 위해 동등한 일을했지만, 결코 그렇게하지 않았다.