找到根确定区间的数量
finding number of root determined interval
我有n次多项式系统,只是想学习先前确定的区间之间的根数。但我不想找到root.I需要root.I的数量需要写python代码。
例如 :
x^8+2x^6+5x^4+x^2+45x+1=0
我们在 3-5 之间有多少根?
emphasis=我不想找root,只是想知道我有多少root。
您可以使用 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
我有n次多项式系统,只是想学习先前确定的区间之间的根数。但我不想找到root.I需要root.I的数量需要写python代码。 例如 : x^8+2x^6+5x^4+x^2+45x+1=0 我们在 3-5 之间有多少根? emphasis=我不想找root,只是想知道我有多少root。
您可以使用 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