2016-07-28 3 views
0

私はn次多項式系を持っています。私は以前に決定された間隔の間にルートの数を学びたいだけです。しかし、私はルートを見つけたくありません。ルートの数が必要です。 。 例: x^8 + 2x^6 + 5x^4 + x^2 + 45x + 1 = 0 3〜5の間のルートはいくつありますか? emphasize =私​​はルートを見つけたくありません。ルートがどれくらいあるかを知りたいだけです。ルートの決定数を見つける

+0

あなたは何を試しましたか?あなたのインターバル内で関数が何回サインを変えたかを見てください。 – Julien

+0

まず、百万度の多項式の問題を見つけて、Pythonコードを書いてみたいと思います。第二に、tuple-rootを持っていれば、記号は変わらないので、いくつかの根が失われます。そして、それが簡単ならば、例 –

+0

を解決してください。あなたの例は次数8の多項式なので、最大8つのルーツを持つことができます。簡単に解決。百万度の多項式はどこから得られますか?どのようにタプルルートを持つことができますか?それは多変量多項式ですか?実際の問題がより困難な場合は、問題の難しさを反映した例を挙げてください。 – Julien

答えて

0

あなたが見ることができるように、この1つはゼロ本当のルーツを持って、このようにnumpy

import numpy as np 
coeff = [1,0,2,0,5,0,1,45,1] #for the polynomial x^8+2x^6+5x^4+x^2+45x+1=0 
np.roots(coeff) 
# array([ 1.37234708+0.91495949j, 1.37234708-0.91495949j, 
# 0.43013459+1.75225934j, 0.43013459-1.75225934j, 
# -1.06175643+1.53395567j, -1.06175643-1.53395567j, 
# -1.45921726+0.j  , -0.02223323+0.j  ]) 

でこれを行うことができます。

編集:明示的にルーツを見つけずに、ある区間の間のルーツの数を確認する場合は、sturm's theoremを使用できます。 sympyを使用して、

from sympy import Sturm,Symbol 
from sympy.abc import x 
sturm_seq = sturm(x**6-3*x**5+2*x**4) 
limits = [2,4]; x = Symbol('x') 
values_at_start = [polynomial.subs(x,limits[0]).evalf() for polynomial in sturm_seq] 
values_at_end = [polynomial.subs(x,limits[1]).evalf() for polynomial in sturm_seq] 
import itertools 
# Count number of sign changes in values_at_start 
count_start = len(list(itertools.groupby(values_at_start, lambda values_at_start: values_at_start > 0))) 
count_end = len(list(itertools.groupby(values_at_end, lambda values_at_end: values_at_end > 0))) 
ans = count_start - count_end 
print ans # ans = 1 
関連する問題