2016-11-17 31 views
-2

我正在用python學習科學計算。在演習中,我應該用它的根用這個公式來生成多項式:Python:我的多項式係數偏差10倍

enter image description here

這是我實現:

def poly(x,roots):   #Pass real and/or complex roots 

    x = symbols(x) 
    f = 1    
    for r in roots: 
     f = f*(x - r) 

    return expand(f) 

當我測試一下:

from sympy import expand 
poly('x',[(-1/2), 5, (21/5), (-7/2) + (1/2)*sqrt(73), (-7/2) - (1/2)*sqrt(73)]) 

我收到:

x**5 - 1.7*x**4 - 50.5*x**3 + 177.5*x**2 - 24.8999999999999*x - 63.0 

但我應該得到:

10*x**5 - 17.0*x**4 - 505.0*x**3 + 1775.0*x**2 - 248.999999999999*x - 630.0 

因此,一切都關閉的10倍。如果我設置f = 10,它的工作原理,但我不明白爲什麼我應該這樣做。我是否犯了一個明顯的錯誤?謝謝!

+2

該公式沒有顯示出來。你能解決這個問題嗎? –

+0

symbols()是做什麼的? –

+1

您正在構造具有特定根的多項式。如果你將它的係數乘以任何數字,根將保持不變。 – mingaleg

回答

1

雖然10x**5 + ...是正確的,那就是10 * p(x),這並不是真正需要的。你現在得到的答案也是好的,你可以測試roots中的每個r,p(r)0

+0

我測試了每個根。正如本書警告我的,由於浮點舍入誤差,我得到的接近於零的非常小的數字。如果可能的話,你有一個首選的技術來糾正這個問題嗎? – Johnathan

+1

@Johnathan你通常會得到浮點錯誤。我通常設定'1e-12'和'abs(p(r))<1e-12'的公差,你應該沒問題。閱讀更多關於它[這裏](http://stackoverflow.com/questions/588004/is-floating-point-math-broken?rq=1)。 –

+0

非常感謝! – Johnathan

0

x**5是正確的。

正如你在公式中看到的那樣,它沒有係數。

+0

非常感謝您的幫助! – Johnathan