2016-11-17 6 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

какой символ() делать? –

+1

Вы строите многочлен с определенными корнями. Если вы умножаете коэффициенты на любое число, корни останутся неизменными. – mingaleg

ответ

1

В то время как 10x**5 + ... является правильным, то есть 10 * p(x), что на самом деле не является необходимым. Ответ, который вы получаете, сейчас хорошо, и вы можете проверить это как на каждый r в roots, p(r) - 0.

+0

Я тестировал каждый корень. Поскольку книга предупреждает меня, из-за ошибок округления с плавающей запятой, я получаю очень маленькие числа, близкие к нулю. Если возможно, у вас есть предпочтительная методика, чтобы исправить это? – Johnathan

+1

@Johnathan Вы обычно получаете ошибки с плавающей запятой. Обычно я устанавливаю допустимость «1е-12» и «абс (р (г)) <1е-12', все должно быть хорошо. Узнайте больше об этом [здесь] (http://stackoverflow.com/questions/588004/is-floating-point-math-broken?rq=1). –

+0

спасибо! – Johnathan

0

x**5 Правильно.

Как вы можете видеть в формуле, для этого нет коэффициента.

+0

Большое спасибо за вашу помощь! – Johnathan

Смежные вопросы