Ir para conteúdo
Fórum Script Brasil
  • 0

Ajuda com Briot Ruffini


Victor Santos Silva

Pergunta

Bom, estou precisando criar um programa que use desta ferramenta para calcular uma função de grau 3, inicialmente pretendo grau 3. E usando o método de Newton junto a Briot Ruffini, para conseguir uma precisão melhor com menos tempo, do que usando somente o primeiro. A minha ideia, foi de criar 2 vetores, e zerar um, conforme necessário, para que o outro possa aparecer de novo como uma dependência do primeiro.

No programa abaixo, não apareceu nenhum erro que eu não conseguisse removê-lo, exceto um que ocorreu na primeira linha após: def briot(): (após o, por enquanto, comentário). Outra coisa, eu posso criar uma função que dependa de uma outra função? Como no comentário?

Aí galera, muito obrigado pela ajuda, quem puder me dizer onde está o erro em meu código, ou de alguma forma ajudar, eu agradeço desde já. Assim que conseguir, dou um feedback.

Boa noite.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

v = [] # função inicial
z = [] # função após briot
x = [] # multiplicadores
i = 0
k0 = input('Forneça o limitante inferior do intervalo:')
kf = input('Forneça o limitante superior do intervalo:')
x0 = input('Forneça o valor de x0, multiplicador:')
e = input('Forneça a precisão desejada:')
x.append(x0)
if x0 > kf or x0 < k0:
	print('Forneça um valor dentro do intervalo fornecido!')
	k0 = input('Forneça um novo intervalo inferior:')  
	kf = input('Forneça um novo intervalo superior:')
else:
	a = input('Escolha o primeiro elemento do vetor:')
	b = input('Escolha o segundo elemento do vetor:')
	d = input('Escolha o terceiro elemento do vetor:')
	e = input('Escolha o termo independente da equação:')
	gmax = 3 # o grau maior da equação, quando a equação é de grau menor basta colocar zero como os termos que acompanham x
for i in range(1,2):
	v.append(a)
	v.append(b)
	v.append(d)
	v.append(e)
a1 = v[0] # o valor da equação que desce, mas se mantem sempre o mesmo
def briot():
	#While t > e  
	a2 = a1 * x0 + v[1]
	a3 = a2 * x0 + v[2]
	a4 = a3 * x0 + v[3]
	z.append(a2)
	z.append(a3)
	z.append(a4)
	v = []
	v.append(a1) # v0
	v2 = v[0] * x0 + z[1]
	v3 = v[1] * x0 + z[2]
	x[i+1] = x[i-1] - (a[4]/v[3])
	print (x[i+1])
briot()
#def teste_parada():
 
Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

  • 0

Bom, consegui resolver este problema, no entanto me ocorreu este: File "novo2.py", line 31
for t > e:
^
SyntaxError: invalid syntax
Como eu acredito que o problema seja puramente de formatação, ou de alguma coisa que estou ignorando no python, não me preocupei em explicar o método Briot Ruffini com Newton. Refiz o código, e corrigindo o erro antigo ficou:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

v = [] # função inicial
z = [] # função após briot
x = [] # multiplicadores
i = 0
k0 = input('Forneça o limitante inferior do intervalo:')
kf = input('Forneça o limitante superior do intervalo:')
x0 = input('Forneça o valor de x0, multiplicador:')
e = input('Forneça a precisão desejada:')
x.append(x0)
briot()
if x0 > kf or x0 < k0:
	print('Forneça um valor dentro do intervalo fornecido!')
	k0 = input('Forneça um novo intervalo inferior:')  
	kf = input('Forneça um novo intervalo superior:')
else:
	a = input('Escolha o primeiro elemento do vetor:')
	b = input('Escolha o segundo elemento do vetor:')
	d = input('Escolha o terceiro elemento do vetor:')
	e = input('Escolha o termo independente da equação:')
	gmax = 3 # o grau maior da equação, quando a equação é de grau menor basta colocar zero como os termos que acompanham x
for i in range(1,2):
	v.append(a)
	v.append(b)
	v.append(d)
	v.append(e)
a1 = v[0] # o valor da equação que desce, mas se mantem sempre o mesmo
def briot():
	for t > e:  
		a2 = a1 * x0 + v[1]
		a3 = a2 * x0 + v[2]
		a4 = a3 * x0 + v[3]
		z.append(a2)
		z.append(a3)
		z.append(a4)
		v = []
		v.append(a1) # v0
		v2 = v[0] * x0 + z[1]
		v3 = v[1] * x0 + z[2]
		x[i+1] = x[i-1] - (a[4]/v[3])
		print (x[i+1])
		teste_parada(x[i-1], x[i+1])

def teste_parada(x[i-1], x[i+1]):
	
	t = (x[i+1] - x[i-1]) / x
	if t < 0:
		print(-t)
	else:
		print(t)

Se alguém conseguir me ajudar, serei de imensa gratidão. Valeu.

Falou.

Link para o comentário
Compartilhar em outros sites

  • 0

Muito obrigado, mas ainda havia um erro no teste de parada. Então bolei outra ideia, e tive de refazer de outra maneira. Apenas a função, que é onde há um erro (for a in range(0,1):

^
SyntaxError: invalid syntax), o qual não imagino a causa.
Por favor, me ajudem a resolver este problema. Segue o código:
def briot():
	z.append(v[0])
	z.append(v[0] * x[0] + v[1])  #z[1] = v[0] * x[0] + v[1]
	z.append(v[1] * x[0] +v[2])   #z[2] = v[1] * x[0] + v[2]
	z.append(v[2] * x[0] + v[3])  #z[3] = v[2] * x[0] + v[3]
	w.append(v[0])   #w[0] = v[0]
	w.append(w[0] * x[0] + z[1])  #w[1] = w[0] * x[0] + z[1]
	w.append(w[1] * x[0] + z[2]) #w[2] = w[1] * x[0] + z[2]
	x.append(x[0] - (z[3]/w[2])  #x[1] = x[0] - (z[3]/w[2])
	for a in range(0,1):
		print(x[a])
	for a in range(0,3):
		print(z[a])
		print(w[a])

Valeu, tenham uma boa noite!

Link para o comentário
Compartilhar em outros sites

  • 0

Muito obrigado, consegui fazer a correção desta parte, mas tive de mudar a função pela minha necessidade.

E agora tenho de repetir a função, usando diferentes elementos dos vetores. Eu gostaria de fazer isto usando um iterador i, porém não estou conseguindo. De outra maneira eu poderia selecionar estes elementos pela sua posição numérica e zerar os vetores em determinada etapa. Acho um trampo desnecessário.

Segue o código:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

v = [] # função inicial
z = [] # função após 1ª briot
w = [] # função após 2ª briot
x = [] # multiplicadores
t = 9
i = 0
def briot(i,t): #rodar a multiplicação com para x0
	z.append(v[0])				#z[0] = v[0]
	z.append((z[0] * x[i]) + v[1])  #z[1] = v[0] * x[0] + v[1]
	z.append((z[1] * x[i]) + v[2])   #z[2] = v[1] * x[0] + v[2]
	z.append((z[2] * x[i]) + v[3])  #z[3] = v[2] * x[0] + v[3]
	w.append(z[0])   			  #w[0] = v[0]
	w.append((w[0] * x[i]) + z[1])  #w[1] = w[0] * x[0] + z[1]
	w.append((w[1] * x[i])+ z[2]) #w[2] = w[1] * x[0] + z[2]
	x.append(x[i] - (z[3]/w[2]))  #x[1] = x[0] - (z[3]/w[2])
	
	t = x[i] -(z[3]/w[2])
	print('O novo valor de x encontrado é:')
	print(x[i+1])
	print('O valor da precisão está em:')
	print(t)
	i = i+1


k0 = input('Forneça o limitante inferior do intervalo:')
kf = input('Forneça o limitante superior do intervalo:')
x0 = input('Forneça o valor de x0, multiplicador:')
e = input('Forneça a precisão desejada:')
x.append(x0)
if x0 > kf or x0 < k0:
	print('Forneça um valor dentro do intervalo fornecido!')
	k0 = input('Forneça um novo intervalo inferior:')  
	kf = input('Forneça um novo intervalo superior:')
else:
	a = input('Escolha o primeiro elemento do vetor:')
	b = input('Escolha o segundo elemento do vetor:')
	d = input('Escolha o terceiro elemento do vetor:')
	e = input('Escolha o termo independente da equação:')
	gmax = 3 # o grau maior da equação, quando a equação é de grau menor basta colocar zero como os termos que acompanham x
for i in range(1,2):
	v.append(a) #v[0]
	v.append(b) #v[1]
	v.append(d) #v[2]
	v.append(e) #v[3]
a1 = v[0] # o valor da equação que desce, mas se mantem sempre o mesmo
while t > e:
	briot(i,t)
print('Obrigado!')

O erro que me retorna é este: Traceback (most recent call last):

File "testefc.py", line 50, in <module>
briot(i,t)
File "testefc.py", line 12, in briot
z.append((z[0] * x) + v[1]) #z[1] = v[0] * x[0] + v[1]
IndexError: list index out of range
Acho que o problema está em como eu devo usar este iterador.
Agradeço a ajuda de todos, tenham uma boa noite.
Link para o comentário
Compartilhar em outros sites

  • 0

Então, muito obrigado por indicar o erro. Mas o que ocorre, é que não faço ideia de como corrigi-lo. Na verdade eu não consigo achar nem mesmo o erro, eu não usei um índice maior que o comprimento da lista, ainda mais nesta linha do erro, ao meu ver, todas as linhas seguintes também acusariam o mesmo problema. Por favor, alguém me ajude a corrigir o problema.

Muito obrigado desde já a ajuda de todos, tenham um bom sábado.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...