Está en la página 1de 2

#Metodo de biseccion para polinomios de grado n.

Programacion Cientifica
#Juan Camilo Garzon Upegui Trabajo 1
#
#PUNTO(1) DEL TALLER
#
def grado(c):
return len(c)-1#utilizo len(c) para obtener el grado del polinomio p(x)
#donde c es la lista con los coeficientes del polinomio p(x)
#
#c es la lista de coeficientes del polinomio
#p(x)=[a0+a1*x+a2*x^2+a3*x^3+...+an*x^n]; c=[a0,a1,a2,a3...,an]; k=[1,x,x^2,...,x^n]
#la funcion polyeval(c,x) da el valor directo del polinomio p(x) en el punto x
#
def polyeval(c,x):
k=list(range(len(c)))
for i in range(0,len(k)):
k[i]=x**i
pa=[a*b for (a,b) in zip(c,k)]#zip(c,k) es una lista de parejas ordenadas
print "p(x)=",sum(pa) #entre c y k, que me permite multiplicar
#la primera componente de c con la primera
#componente de k y asi sucesivamente
#
#PUNTO(2) EVALUACION DEL POLINOMIO p(x) UTILIZANDO EL METODO DE HORN
#
#ITERATIVO:
#
def hornerit(c,x):
c.reverse()
w=c
b=w[0]
for ai in w[1:]:
b=ai+(x*b)
c.reverse()
return b

#
#RECURSIVO:
#en este caso enves de iterar b, la remplazamos por la misma funcion hornerrec(c,x)
def hornerrec(c,x):
a0=c[0]
i=len(c)
if i==1:
return c[0]
else:
c=c[1:]
pr=a0+x*hornerrec(c,x)
return pr
#
#PUNTO(3) FUNCION QUE DEVUELVE LA LISTA DE COEFICIENTES DE P'(X)
#en orden p'(x)=[a0+a1*x+a2*x^2+...+an*x^n]
#
def polyderiv(c):
for i in range(0,len(c)):
c[i]=i*c[i]
pdv=c
return pdv[1:]
#
#PUNTO(4) BISECCION MODIFICADO. con el intervalo [-M,M] y los
#puntos donde p'(x)=0 puedo hacer el metodo de biseccion tramo por tramo
#garantizando el cambio de signo en p(a),p(b) y garantizando la convergencia a
#una raiz
#
def polyceros(c,e):
if c[1]==0:
return [0]
else:
l=c[:]
for i in range(len(l)):
l[i]=abs(l[i])
M=max(((2*sum(l[:-1]))/float(l[-1])),1)
return M
mm=[-M,M]
for i in range(len(c)):
c=polyderiv(c)
d=polyceros(c,e)
kk=sorted(mm+d)
p=(kk[i]+kk[i+1])/2.0
while ((kk[i]-kk[i+1])/2.0)>e or (abs(hornerrec(c,p)))>e:
q=hornerrec(c,p)
if (hornerrec(c,kk[i])*q)<=0:
kk[i+1]=p
else:
kk[i]=p
p=(kk[i]+kk[i+1])/2.0
return c
return d

También podría gustarte