5

一般に、n 次多項式を作成して numpy で根を見つけるのは簡単な作業です。

import numpy
f = numpy.poly1d([1,2,3])
print numpy.roots(f)
array([-1.+1.41421356j, -1.-1.41421356j])

ただし、次のタイプの多項式が必要だとします。

f(x) = a*(x-x0)**0 + b(x-x0)**1 + ... + n(x-x0)**n

numpy.poly1d タイプの関数を作成してルートを見つける簡単な方法はありますか? 私は scipy.fsolve を試しましたが、私の特定のケースでは開始値の選択に大きく依存するため、非常に不安定です。

よろしくお願いします rrrak

編集:「ポリゴン」(間違った)を「多項式」(正しい)に変更しました

4

2 に答える 2

4

まず、多角形ではなく多項式のことですか?

回答を提供するという点で、すべての用語で同じ値の「x0」を使用していますか? そうであれば、y = x - x0 とし、y について解いて、x = y + x0 を使用して x を取得します。

必要に応じて、ラムダ関数でラップすることもできます。たとえば、あなたが表現したい

f(x) = 1 + 3(x-1) + (x-1)**2

それで、

>>> g = numpy.poly1d([1,3,1])
>>> f = lambda x:g(x-1)
>>> f(0.0)
-1.0

f の根は次の式で与えられます。

f.roots = numpy.roots(g) + 1
于 2011-07-22T15:54:11.827 に答える
3

x0 が次のようにべき乗で異なる場合:

f(x) = 3*(x-0)**0 + 2*(x-2)**1 + 3*(x-1)**2 + 2*(x-2)**3

多項式演算を使用して、最終的に展開された多項式を計算できます。

import numpy as np
import operator

ks = [3,2,3,2]
offsets = [0,2,1,2]

p = reduce(operator.add, [np.poly1d([1, -x0])**i * c for i, (c, x0) in enumerate(zip(ks, offsets))])

print p

結果は次のとおりです。

   3     2
2 x - 9 x + 20 x - 14
于 2011-07-25T00:45:03.907 に答える