2017-04-06 11 views
0

値の配列の最初の推定値がxの場合、私はxに最も近いシステムのルートを見つけようとしています。 f_if任意の10進精度の方程式系の根を見つける

内にある特定の機能がある

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! 

はしかし、私は、Python内decimalパッケージを使用しています。 decimalは、通常の小数精度よりも多くを提供します。 scipy.optimize.newton_krylovは浮動小数点精度の値を返します。任意の正確な小数精度で私の答えを得る方法はありますか?

答えて

0

私は、mpmath.findrootを含むmpmathモジュールを発見しました。 mpmathは、すべての数値に対して任意の小数点精度を使用します。 mpmath.findrootは、許容範囲内で最も近いルートを見つけます。ここで、より高い精度で、同じ問題のためmpmathの使用例である:

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] 

精度を任意に上昇させることができます。

2

scipy.optimize.newton_krylovでコードをコピーし、浮動小数点値ではなくdecimalの値を使用するように修正してみることができます。もちろん、これは困難で時間がかかるかもしれません。

他の状況でも同じことをしましたが、これは決してありません。

関連する問題