

python3でプログラムを作っています。  
その過程でmpmathの中のpolyrootsを使っています。  
そのコードで`extraprec`という一文があるのですがこの一文は何をするためのコードか教えて下さい。

[code]

    mpmath.polyroots([a,b,c,d,e,f],maxsteps=3000,cleanup=True, extraprec=400,error=True
    
[/code]


CC BY-SA 4.0
2019-05-27T01:41:26.943
55271
2019-05-29T06:30:29.597
2019-05-29T04:42:08.173
3060
34475
question
python python3
mpmathのextraprecについて


与えられた多項式のすべての根を計算する際の、 **計算精度を拡張するためのパラメータ** でしょう。

以下の記事の回答が関連しそうです。(デフォルト値に整合性の無い記述がありますが)  
訳はgoogleを使っているので正確ではないかもしれません。(コメント指摘のtypo修正済)  
[Finding the roots of a simple polynomial with
mpmath](https://stackoverflow.com/q/31543071/9014308)

> The documentation mentions that increasing extraprec may be necessary to
> achieve convergence. This is the case for your example, due to root
> multiplicity.
[code]

>     >>> mpmath.polyroots(p, maxsteps=100, extraprec=110)
>     [mpf('0.0'), mpf('4.0'), mpf('4.0'), mpf('4.0')]
>  
[/code]

>
> The extraprec parameter means the extra number of digits to be used in the
> process of calculation, compared the number of digits needed in the result
> (which is 15 by default, set globally in mpmath.mp.dps). Its default value
> is 10; increasing it to 110 achieves convergence in 100 steps. This actually
> takes less time than trying (and failing) to find the roots with
> maxsteps=2000 at the default extraprec level.

訳：  
ドキュメンテーションは、収束を達成するためには、extraprecを増やすことが必要かもしれないと述べています。これは根の多重度による、あなたの例の場合です。

**extraprecパラメータは、計算および比較の過程で使用される追加の桁数、結果に必要な桁数の拡張を意味します。**
(デフォルトは15です。mpmath.mp.dpsでグローバルに設定されています)  
デフォルト値は10です。110に増やすと、100ステップで収束します。  
これは実際にはmaxsteps = 2000でデフォルトのextraprecレベルで根を見つけることを試みる（そして失敗する）よりも短い時間で済みます。

* * *

**mpmathのドキュメントに以下のように記述されています**  
同じく訳はgoogleを使っているので正確ではないかもしれません。

[Polynomial roots
(polyroots)](http://mpmath.org/doc/1.1.0/calculus/polynomials.html#polynomial-
roots-polyroots)

>
[code]

>     mpmath.polyroots(coeffs, maxsteps=50, cleanup=True, extraprec=10,
> error=False, roots_init=None)
>  
[/code]

>
> Computes all roots (real or complex) of a given polynomial.
>
> The roots are returned as a sorted list, where real roots appear first
> followed by complex conjugate roots as adjacent elements. The polynomial
> should be given as a list of coefficients, in the format used by polyval().
> The leading coefficient must be nonzero.
>
> With error=True, polyroots() returns a tuple (roots, err) where err is an
> estimate of the maximum error among the computed roots.

訳：  
与えられた多項式のすべての根（実数または複素数）を計算します。

根はソートされたリストとして返されます。実際の根が最初で、その後に隣接要素として複素共役根があらわれます。多項式は、polyval()で使用されるフォーマットで、係数のリストとして与えられるべきです。先行係数はゼロ以外でなければなりません。

error=Trueの場合、polyroots()はタプル(roots, err)を返します。ここで、errは計算された根の中の最大誤差の推定値です。

> Precision and conditioning
>
> The roots are computed to the current working precision accuracy. If this
> accuracy cannot be achieved in maxsteps steps, then a NoConvergence
> exception is raised. The algorithm internally is using the current working
> precision extended by extraprec. If NoConvergence was raised, that is caused
> either by not having enough extra precision to achieve convergence (in which
> case increasing extraprec should fix the problem) or too low maxsteps (in
> which case increasing maxsteps should fix the problem), or a combination of
> both.
>
> The user should always do a convergence study with regards to extraprec to
> ensure accurate results. It is possible to get convergence to a wrong answer
> with too low extraprec.
>
> Provided there are no repeated roots, polyroots() can typically compute all
> roots of an arbitrary polynomial to high precision:

訳：  
精度と条件付け

根は現在の作業精度で計算されます。この精度がmaxstepsステップで達成できない場合は、NoConvergence例外が発生します。アルゴリズムは内部的にextraprecによって拡張された現在の作業精度を使用しています。NoConvergenceが発生した場合は、収束を達成するのに十分な余計な精度がない（この場合、extraprecを増やすと問題が解決する）か、小さすぎるmaxsteps（この場合、maxstepsを増やすと問題が解決する）、または両方の組み合わせが原因です。

ユーザーは正確な結果を確実にするために常にextraprecを考慮して収束の調査(研究?)をするべきです。低すぎるextraprecは間違った答えに収束する可能性があります。

繰り返し根がない場合、polyroots()は通常、任意の多項式のすべての根を高精度に計算できます。


CC BY-SA 4.0
2019-05-29T06:24:15.487
55336
2019-05-29T06:30:29.597
2019-05-29T06:30:29.597
26370
26370
55271
answer