def obter_alpha(grau, coeficientes, erro_min = 10 ** -16 , limite = 20, x = 0.0):
  
  x_antigo = localizacao_raizes.obter_melhor_alpha(grau, coeficientes)
  
  for i in range(limite):
    fx_derivada = divisao.obter_resto(grau, coeficientes, x_antigo, 2)
    fator = fx_derivada[0] / fx_derivada[1]
    x_novo = x_antigo - fator
    
    erro = grau * math.fabs(fator)
    
    print 'Iteracao ', (i + 1), ' X = ', x_novo, ', erro = ', erro
    
    if(erro < erro_min):
      return x_novo
    
    x_antigo = x_novo
    
  print 'Resultado com a precisao desejada nao foi encontrado '
  return x_antigo
    
    
import localizacao_raizes
import newton_polinomial
import newton_kinkeid_pol

grau = 4
coeficientes = [2.0, 0.0, 0.0, 3.0, -2.0]
coeficientes_multi = [1.0, -1.0, -5.0, 1.0, 8.0, 0.0]
coeficientes_loc = [2.0, 0.0, 0.0, 0.0, -8.0, 3.0]
coeficientes_newton = [2.0, 0.0, 0.0, 3.0, -5.0]
x = 2.0

print 'Testando solver uma polinomial simples usando horner'
print horner.obter_resto(grau, coeficientes, x); print ''

print 'Testando solver uma polinomial simples e obter derivadas usando divisao'
print divisao.obter_resto(grau, coeficientes, x); print ''

print 'Testando obter multiplicidade de uma raiz'
print multiplicidade.verifica_multiplicidade(5, coeficientes_multi, -1.0); print ''

print 'Testando obter localizacao das raizes'
print localizacao_raizes.obter_localizacao_raizes(5, coeficientes_loc); print ''

print 'Testando obter localizacao refinada das raizes bom Beta = 0'
print localizacao_raizes.obter_localizacao_ref_raizes(5, coeficientes_loc); print ''

print 'Testando obter pn(x) = 0 com newton geral polinomial'
print newton_polinomial.obter_alpha(4, coeficientes_newton)

print 'Testando obter pn(x) = 0 com newton kinkeid polinomial'
print newton_kinkeid_pol.obter_alpha(4, coeficientes_newton)
def obter_localizacao_ref_raizes(grau, coeficientes, x = 0.0):
  resultados = divisao.obter_resto(grau, coeficientes, x, 2)
  refinado = grau * math.fabs(resultados[0] / resultados[1])
  return refinado