2015-01-16 10 views
2

Мне нужно решить уравнение четвертой степени с помощью python. Для этого я использую модуль sympy.Решающий симптом Python, возвращающий плохие корни в уравнение четвертой степени

При запуске скрипта sympy возвращает 4 решения уравнения как комплексные числа (см. Вывод), в то время как на самом деле все они являются реальными.

Что делает sympy возвращением неправильного ответа?

import numpy as np 
import math 
from numpy import linalg as la 
import sympy as sy 

from matplotlib.pyplot import * 

L = np.array([0,1,-20.0]) 
S = np.array([0,0,-10.0]) 

a = np.dot(S,S) 
b = np.dot(S,L) 
c = np.dot(L,L) 

k0 = a - 1 
k1 = 2*(a-b) 
k2 = a + 2*b + c - 4*a*c 
k3 = -4*(a*c - b**2) 
k4 = 4*c*(a*c - b**2) 

y = sy.Symbol('y') 
r = sy.solvers.solve(k4*y**4 + k3*y**3 + k2*y**2 + k1*y + k0, y) 

print r 

y = np.linspace(-1.1, 1.1, 1000) 
x = k4*y**4 + k3*y**3 + k2*y**2 + k1*y + k0 
figure() 
plot(y, x) 
grid(True) 
show() 

Выход:

[-0.994999960838935 + 1.66799419488535e-31*I, 
-0.0255580200028216 - 6.34301512012529e-30*I, 
    0.0243009597954184 + 6.32628752256216e-30*I, 
    0.998750786632373 - 1.50071821925406e-31*I] 

земля (есть 4 нулевых пересечений):

enter image description here

+0

Почему вы решаете уравнение 4-го порядка численно, когда существует известная аналитическая формула? –

+0

Обобщение последнего – Xocoatzin

ответ

2

Обратите внимание, что результат на самом деле реально, до численной точности. e-30 действительно небольшое количество. Сообщаемые решения также согласуются с сюжетом, поэтому не о чем беспокоиться.

+0

Не является ли часть '_.__ * I' мнимой составляющей? Я вижу, что это очень мало и немаловажно, но его не должно быть на первом месте, и это усложняет все, поскольку мне нужно проверить реальные/сложные корни (которые иногда они законно появляются). – Xocoatzin

+1

Да, это так, и он имеет порядок '10^{- 30}'. Вы можете использовать функцию 'numpy'' isclose() ', чтобы решить, можно ли пренебречь мнимой частью. Из числового решателя вы ожидаете некоторую ошибку. В общем случае возвращаемое значение этой функции является сложным, поэтому решатель должен быть «аналитически» умным, чтобы понять, является ли то, что он смотрит, является ошибкой округления или хорошим решением. – gg349

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