Python
17 Jul 2010
 

Решение алгебраического уравнения любой степени методом Лобаческого

 
 
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#-*- coding: utf-8 -*-
# *********************************************** #
# Решение алгебраического уравнения любой степени #
# методом Лобаческого #
# (действительные корни только) #
# *********************************************** #
import decimal
#Проверка на верность
def real_cof(cofs, x, eps):
result = 0 #В идеале должен быть нулем
for i in range(len(cofs)):
result += cofs[-1-i]*(x**i)
if result<eps:
return True
else:
return False
#8204.035*x^2+44*x-234.553 = 0
#cof_float = [0., 8204.035, 44., -234.553]
#72*x^4+3672*x^3-952*x^2-71*x+369 = 0
#cof_float = [72.,3672.,-951.,-71.,369.]
#-87*x^13+7*x^11-55*x^10+76*x^9-4807*x^8-7*x^7+29*x^6-8737*x^5+3*x^4+47467*x^3-314*x^2+87*x-11431 = 0
cof_float = [-87., 0., 7., -55., 76., -4807., -7., 29., -8737., 3., 47467., -314., 87., -11431]
EPS = 0.0000001 #Точность при сравнение
xv = [] #Вектор вероятных X
cv = [] #Для индексов комплесных
L = len(cof_float) #Количество коэффициентов
K = 10 #Количество квадрирований (влияет на точность)
s = 1.0/2**K
if L<2:
print "Too small"
raw_input("Press any key...")
exit()
#Упрощаем коэффициенты
for n in range(1, L):
cof_float[n] /= cof_float[0]
cof_float[0] = 1.0
cof = [decimal.Decimal(str(k)) for k in cof_float]
s = decimal.Decimal(str(s))
try:
#Квадрируем
for n in range(K):
tmp = cof[:]
for i in range(1, L):
cof[i] **= 2
#if (tmp[i]<0) and (not tmp[i] in cv):
# cv.append(i)
for j in range(1, i+1):
if j+i>L-1: break
cof[i] += 2*(-1)**j*tmp[i-j]*tmp[i+j]
#При float
except OverflowError:
print "Overflow"
raw_input("Press any key...")
exit() #os._exit()
#Вычисляем корни
for n in range(1, L):
#Вещ. корень, наверно
if cof[n]/cof[n-1]>0:
#if not n in cv:
xv.append((cof[n]/cof[n-1])**s)
#Иначе комплексный
else:
xv.append(None)
if not xv[-1]:
pass
elif real_cof(cof_float, float(xv[-1]), EPS):
print xv[-1]
elif real_cof(cof_float, -float(xv[-1]), EPS):
print -xv[-1]
raw_input("Press any key...")