如何用symphy/python求给定根的多项式

如何用symphy/python求给定根的多项式,python,numpy,sympy,Python,Numpy,Sympy,假设我有一个根在-2,1和3的三次多项式,我如何找到它的方程?Symphy可以解决这个问题吗?或者python通常还有其他方法吗 函数可能喜欢,我想解a,b,c,d f=λx:a*x**3+b*x**2+c*x+d 同时,如果多项式是五次的呢 更新: 谢谢你的回答。似乎用维塔的公式简化了这个问题。但有时N次多项式的根数不等于N。例如,第五次多项式可表示为: (x-a)**2*(x-b)**2(x-c) 如果是这样的话,这仍然是可以解决的吗 有关此更新,请参见下面的解决方案使用Symphy从根构

假设我有一个根在-2,1和3的三次多项式,我如何找到它的方程?Symphy可以解决这个问题吗?或者python通常还有其他方法吗

函数可能喜欢,我想解a,b,c,d

f=λx:a*x**3+b*x**2+c*x+d 同时,如果多项式是五次的呢

更新:

谢谢你的回答。似乎用维塔的公式简化了这个问题。但有时N次多项式的根数不等于N。例如,第五次多项式可表示为:

(x-a)**2*(x-b)**2(x-c)
如果是这样的话,这仍然是可以解决的吗

有关此更新,请参见下面的解决方案

使用Symphy从根构建多项式,然后获得系数:

from sympy import Symbol, poly

x = Symbol('x')

roots = [-1, 1]
expr = 1

# polynomial in format (x-a)(x-b)(x-c)...
for i in roots:
  expr *= (x - i)

p = poly(expr, x)
print(p)
print(p.all_coeffs())
输出:

Poly(x**2 - 1, x, domain='ZZ')
[1, 0, -1]
Poly(x**7 - 20*x**6 + 154*x**5 - 560*x**4 + 889*x**3 - 140*x**2 - 1044*x + 720, x, domain='ZZ')
[1, -20, 154, -560, 889, -140, -1044, 720]
请注意,这将适用于任意长的根列表

例如,如果根是[-1,1,2,3,4,5,6]

输出:

Poly(x**2 - 1, x, domain='ZZ')
[1, 0, -1]
Poly(x**7 - 20*x**6 + 154*x**5 - 560*x**4 + 889*x**3 - 140*x**2 - 1044*x + 720, x, domain='ZZ')
[1, -20, 154, -560, 889, -140, -1044, 720]
为了计算x处的多项式,这应该与符号化地将因子相乘一样好。要生成由根定义的多个多项式函数,请使用函数工厂

def poly3(r1, r2, r3):
    def _poly3(x):
        return (x - r1) * (x - r2) * (x - r3)
    return _poly3

f2 = poly3(-2, 1, 2)

for i in range(-10, 11):
    assert f(i) == f2(i)
# no AssertionError means all tests pass
下面将其推广到n个根

def polyn(*roots):
    def _polyn(x):
        val = 1
        for r in roots:
            val *= x - r
        return val
    return _polyn

f3 = polyn(-2, 1, 2)

for i in range(-10, 11):
    assert f(i) == f3(i)
# Above code passed on Win 10, 3.7.2
numpy中有一组基本的多边形函数:

值范围内的值也可以通过以下方式进行评估:

In [53]: np.dot(np.arange(-3,5)[:,None]**np.array([3,2,1,0]), f)
Out[53]: array([-24.,   0.,   8.,   6.,   0.,  -4.,   0.,  18.])

这对多项式的任何程度都适用。星号符号允许任意数量的参数

def c_find(*roots):
    from sympy import Symbol
    x = Symbol('x')
    whole =1
    for root in roots:
        whole *=(x-root)
    print('f(x) =',whole.expand())

调用c_find3,4,5返回fx=x**3-12*x**2+47*x-60

谢谢您的回答。在玩弄你的解决方案之后。对于我的重复根更新,我提出了以下解决方案:

def find_all_度,根: '查找具有给定阶数和根的多项式的所有格式 Args: 次数int:多项式的次数 根列表:该列表包含所有给定根 返回: 给定次数的多项式的所有简化格式 笔记: 1.多项式的次数决定了它的最大次数 所有可能的真正根源。 2.给定次多项式的根的每个组合 确定多项式的简化格式,即 最高阶项的系数为1 3.n阶的所有可能格式的数目 具有m根的多项式定义为: Hm,n-m=Cm,n-m+m-1 因为给定的根总是包含在根中 组合时,格式变化的数量取决于 重复根的组合,可以视为 与上述重复问题的组合。 ' 从数学导入阶乘 从sympy导入符号 计算所有可能的根组合的数目 nHr=lambda n,r:factorialn+r-1/factorialr*factorialn-1 n_all_根=nHrlenroots,度根 获取所有根组合 如果lennp.uniqueroots==lenroot: n_dups=度根 根\u全部\u重复=[] 尽管如此: 从给定的根中随机选择 根\u dups=np.random.choiceroots,n\u dups.tolist 根类 测试组合是否已经存在 如果根\u DUP不在根\u所有\u DUP中: 根全部重复。附加根重复 其他: 如果lenroots\u all\u dups==n\u all\u roots: 打破 将重复根添加到所有给定根列表 对于根\u所有\u DUP中的DUP: 双伸肌 所有根梳=根梳所有重复 寻找多项式的所有可能格式 对于计数器,枚举所有根梳中的根梳: x=符号“x”;术语=1 对于所有_根_梳中的根[计数器]: 项*=x根 printf'fx={term.expand}' 其他: raise VALUERROR“根列表不应包含重复的根” 例如:

根=[-2,1,3] 查找所有度=6,根=根 将返回:

f(x) = x**6 - 4*x**5 - 6*x**4 + 32*x**3 + x**2 - 60*x + 36
f(x) = x**6 - 6*x**5 + 50*x**3 - 45*x**2 - 108*x + 108
f(x) = x**6 - 9*x**5 + 24*x**4 + 2*x**3 - 99*x**2 + 135*x - 54
f(x) = x**6 - x**5 - 15*x**4 + 5*x**3 + 70*x**2 + 12*x - 72
f(x) = x**6 + 4*x**5 - 5*x**4 - 40*x**3 - 40*x**2 + 32*x + 48
f(x) = x**6 + x**5 - 11*x**4 - 13*x**3 + 26*x**2 + 20*x - 24
f(x) = x**6 - 2*x**5 - 8*x**4 + 14*x**3 + 11*x**2 - 28*x + 12
f(x) = x**6 - 11*x**5 + 40*x**4 - 30*x**3 - 135*x**2 + 297*x - 162
f(x) = x**6 - 5*x**5 + 4*x**4 + 14*x**3 - 31*x**2 + 23*x - 6
f(x) = x**6 - 7*x**5 + 12*x**4 + 14*x**3 - 59*x**2 + 57*x - 18

我会用数学的方法,用vieta的公式。如果N次多项式有根a、b、c、d…,那么多项式可以表示为Cx-ax-bx-Cx-d…,其中c是未知常数。C之所以存在,是因为你可以将一个多项式乘以任何东西,而根将保持不变,所以你不知道它被乘以了什么。@Primusa谢谢,我会尝试,我正在看这个now@Primusa对不起,我不太明白。我读了你的解,但是一个包含7个根的列表确实返回了7次多项式。例如,如果我有一个根-4,2,5的列表,我怎么能得到一个5次多项式呢?我错过什么了吗?顺便说一句,我仍然在阅读所有的答案并尝试它们。你需要知道每个根有多少,否则你无法知道多项式的确切组成。假设你有一个5次多项式,
你知道在4有一个双根,在2有一个双根,在5有一个根。您可以传入[4,4,2,2,5]以得到结果多项式。如果你只知道[4,2,5],这是一个5度,那就没有足够的信息来构造多项式。它可以是[4,4,4,2,5]或[4,2,2,5,5]。。。等等。谢谢你的解决方案,但是如果你有一个五次多项式,但是只有三个根呢?如果你想要一个五次多项式,但是只有三个根,那么加两个零!对于根数为x的n次多项式,在传递给函数的根上加n-x个零。好问题,这样我想你就增加了0的根是的,哎呀,你说得对。如果你的根是3,4,5,你需要两个,在传递给函数的参数中再加两个数字,这两个数字需要来自你已经知道的三个根。如果我必须在你的函数中传递一个列表作为参数。我应该补充什么?我得到了TypeError:-:“Symbol”和“list”的不支持的操作数类型。