Programa de Newton Raphson

Bom dia galera GUJ, venho mais uma vez pedir a ajuda de vocês!

Sou iniciante em java, na faculdade o professor pediu um projeto de NEWTON RAPHSON.

Dei uma olhada na net e não encontrei praticamente nada, e os que encontrei não sei nem como utilizar.

Venho pedir a ajuda de vocês, se puder ajudar fico agradecido.

O exercício pede a seguinte condição:

  1. Entrar com o grau do polinômio;
  2. Entrar com o coeficiente em função do grau;
  3. Derivada de F(x);
  4. Atribuir o primeiro valor de Xn;
  5. Rodar o programa
  6. Apresentar o Polinomio;
  7. Apresentar a Raiz;
  8. Apresentar o numero de iterações;
  9. Quer calcular mais raiz?
  10. Quer fazer uma nova função?

Este é o pedido do professor,

Sinceramente, não tenho nem noção do que seja isso, e é pra semana que vem a entrega.

Se alguém puder ajudar, fico muito agradecido,

Eu li antes de postar e não encontrei nada parecido, me desculpa se estou postando em lugar indevido, li antes o artigo e então postei.

Agradeço a todos que puderem me ajudar!

Abraços,

  1. Leia isto primeiro.
  1. Uma vez que você leu isto, você vai perceber que precisa criar quatro coisas :

a) Uma rotina para entrar com os coeficientes de um polinômio a partir de um arquivo ou da entrada de dados do usuário.

b) Uma rotina que calcula o valor de um polinômio qualquer.

c) Uma rotina que acha a derivada de um polinômio.

d) Uma rotina que executa o método de Newton-Raphson usando as duas rotinas citadas acima. Ela provavelmente precisará dos seguintes dados:

  • O polinômio em si
  • A derivada desse polinômio
  • O intervalo onde você vai procurar a raiz
  • A tolerância (ou talvez o número máximo de iterações - leia com atenção como é que se implementa o Newton-Raphson)

Para achar a derivada de um polinômio, você pode ver em:

(procure no item “Derivadas de funções Simples” - é a quarta linha)

Só para você testar seu programa, vou dar um exemplo básico, com o seguinte polinômio, cujas raízes têm de ser determinadas:

1x^5 + 4x^4 - 58x^3 - 40x^2 + 633x - 540 = 0

O grau do polinômio é 5, portanto você tem de entrar com 6 coeficientes:

1, 4, -58. -40, +633, -540

Derivar esse polinômio é fácil, e você deve ter o seguinte polinômio:

5x^4 + 16x^3 - 174x^2 - 80x + 633 = 0

Ou seja, é um vetor com 6 - 1 = 5 coeficientes:

5, 16, -174, -80, 633

Para mostrar como é fácil derivar o polinômio, basta notar o seguinte:

Pegue todos os coeficientes do polinômio original, menos o último:

1, 4, -58, -40, +633

Agora, comece a multiplicar os coeficientes pelo grau do polinômio original (5), e vá decrementando de um, até chegar em 1:

5 * 1, 4 * 4, 3 * -58, 2 * -40, 1 * 633

O resultado para o polinômio derivado ´:

5, 16, -174, -80, 633

Acho que você é esperto suficiente para calcular um polinômio a partir dos coeficientes.

Uma vez feito isso, e se seu programa rodar direitinho, ele deve apresentar as seguintes raízes:

-9
-4
1
3
5

OK?

CUIDADO - Em Java, a exponenciação não é feita com “^” (que serve para uma coisa muito, muito diferente - XOR) e sim com a rotina Math.pow. Entretanto, aconselharia usar uma outra coisa para calcular polinômios, que é o método de Horner:

Bom dia entanglement

Cara, muito boa sua explicação, ainda não recebi nem uma explicação de qualquer tipo de programa dessa forma, agradeço de verdade…

Eu entendi o que você quis dizer, mas…

O meu problema é que nem eu disse, sou iniciante mesmo, não tenho muita lógica de programação e ele pede um programa desses,

Eu não tenho condições de desenvolver esse programa, porque ainda não tenho conhecimento (EU E NINGUÉM DA SALA).

Essa é minha maior dificuldade,

Estou estudando bastante java porque gosto disso, mas não tenho conhecimento para desenvolver este tipo de aplicação, entende? rs

[quote=xelovez]Bom dia entanglement

Cara, muito boa sua explicação, ainda não recebi nem uma explicação de qualquer tipo de programa dessa forma, agradeço de verdade…

Eu entendi o que você quis dizer, mas…

O meu problema é que nem eu disse, sou iniciante mesmo, não tenho muita lógica de programação e ele pede um programa desses,

Eu não tenho condições de desenvolver esse programa, porque ainda não tenho conhecimento (EU E NINGUÉM DA SALA).

Essa é minha maior dificuldade,

Estou estudando bastante java porque gosto disso, mas não tenho conhecimento para desenvolver este tipo de aplicação, entende? rs

[/quote]

Então o que tu quer na realidade é que alguém faça o algoritmo e o disponibilize á você, em outras palavras, é isso ?
Já antecipo que é bem difícil, só se alguém estiver bem humorado e com tempo. O entanglement explicou detalhadamente e deu exemplos, o que tu precisa fazer é ir passo a passo (como foi explicado) e ir montando o seu algoritmo . Faça ele desmembrar o seu polinômio, teste, funcionando, parta para a próxima etapa, é um jeito mais garantido.

Não te preocupe com a orientação a objetos, faça estruturado mesmo. Depois de pronto e funcionando, você se preocupa com isso, se for o caso.

Então, vou tentar fazer o código, mais pra mim que não tenho muitos conhecimentos na linguagem ainda fica difícil sabe, a sintaxe é muito complexa para um iniciante.

Eu sei que é extremamente chato ficar pedindo esses tipos de coisa, e eu entendo, estou estudando mesmo sobre esse programa, mas tenho muita dificuldade, infelizmente.

Agradeço o seu contato Nel, e seu ponto de vista… sempre bom ter várias opiniões,

Abraços;

De brinde, vou dar um método estático que calcular o valor de um polinômio a partir dos coeficientes.
Você precisa de um array a[] com a dimensão correta (por exemplo, para um polinômio de grau n, você precisa de um array de double de tamanho n + 1, e do valor de x. Ele lhe retorna o valor calculado.

public static double horner (double[] a, double x) {
     double result = 0.0;
     int n = a.length - 1;
     for (int i = n; i >= 0; i--) {
         result = x * result + a [i];
     }
     return result;
}

Este é o tipo de problema que não precisa de programação orientada a objeto.

Um teste para o método acima:

class Horner {
public static double horner (double[] a, double x) {
     double result = 0.0;
     int n = a.length - 1;
     for (int i = n; i >= 0; i--) {
         result = x * result + a [i];
     }
     return result;
}
    public static void main (String[] args) {
        double[] a = { -540, +633, -40, -58, +4, +1 }; 
        System.out.println (horner (a, -9));
        System.out.println (horner (a, -4));
        System.out.println (horner (a, 1));
        System.out.println (horner (a, 3));
        System.out.println (horner (a, 5));
        System.out.println (horner (a, 0));
        System.out.println (horner (a, 10));
    }
}

Ele é mais classicamente resolvido com aquelas linguagens bem antiguinhas (tipo Fortran ou C) e devo ter resolvido isso pela primeira vez em 1983 em Basic, pelo que me lembro. )

Dica: o teste do método que lhe passei usa justamente o tal polinômio de grau 5 que usei como exemplo.
Se você rodar o teste, vai ver que, a não ser para o caso x = 0 e x = 10, todas as outras saídas são zero, como esperado.

Outra dica: sempre que for fazer qualquer conta, evite evite evite - vou repetir quadraticamente, até cubicamente - evite evite evite evite usar float.

Use sempre double (e no caso de mexer com dinheiro, use BigDecimal).

Para esse tipo de contas, use sempre double, como o método que lhe dei de graça.

float tem uma precisão muito baixa (de 6 algarismos, que é mais baixa que qualquer calculadora vagabunda, que tem pelo menos 8 ou 10 dígitos de precisão). então o seu uso introduz erros difíceis de serem dominados por quem está começando a programar.
Como você deve ter visto na API do Java, parãmetros float são normalmente encontrados apenas em alguns casos restritos, como APIs para gráficos 2D.
A precisão de um double é de 15 dígitos, então é mais que suficiente para você ter bons resultados com Newton-Raphson.

Cara, você ta ajudando muito, rs…

Estou entendendo o que você quer dizer, vou tentar estruturar tudo o que você disse ai, e ver se eu consigo fazer.

Tenho uma dúvida, porque você usou o metodo Honror e não o Math?

Eu sempre utilizo o double, acho melhor rs

Eu consigo entender o que você está dizendo, o dificil é eu montar uma logica e estruturar tudo, kkk

vei, vlw mesmo,

abraço;

Ah, porque é mais rápido fazer N multiplicações e N adições (para calcular um polinômio usando Horner) que N exponenciações, N multiplicações e N adições.

A exponenciação é uma operação lenta em qualquer linguagem.

Mas isso é um hábito do tempo em que a exponenciação realmente levava muito tempo (aqui na minha mochila, casualmente, estou com uma calculadora Basic que comprei em 1985 e que pode ser programada para executar esse programa de Newton-Raphson que comentei.

Eu sempre usava esse método de Horner em vez de usar a exponenciação, senão as contas levavam tanto tempo para executar que eu poderia acabar tomando bomba na prova (a calculadora tinha um processador maravilhoso de 1,3 megahertz - não é 1,5 gigahertz como os tablets quadcore de hoje em dia - e ela tinha memória RAM de 10 kilobytes = 10000 bytes - não 16 gigabytes = 16000000000 como hoje em dia) .

Vê se isso ajuda…

import java.util.*;
public class A {
	public static void main (String[] args) 
	{
		Scanner keyboard = new Scanner(System.in);
		double N;
		double ai=0; 
		double xk;
		
		System.out.println("Type the integer whose square root you would like to compute: ");
		N = keyboard.nextDouble();
		xk = N;
		do{
				ai = ((xk + N / xk) / 2.0);
				xk = ai;
			  
		System.out.println(ai);		
		}while(Math.abs(ai - xk) < 0.0000001);
		   
	
	}
}

O programa que o Bruno apresentou usa o Newton-Raphson, mas para um caso extremamente específico (resolver a equação x^2 - N = 0), e não conta as iterações, em vez disso usa o conceito de tolerância. Mas realmente, se você entender o que é o algoritmo de Newton-Raphson, vai achar que isso ajude um pouco.

Outra coisinha - espero que vocês tenham reparado.

Quando eu falei:

1x^5 + 4x^4 - 58x^3 - 40x^2 + 633x - 540 = 0

eu queria dizer usar um array a com dimensão 6, cujos coeficientes são:
a[5] = 1
a[4] = 4
a[3] = -58
a[2] = -40
a[1] = 633
a[0] = -540

Note a ordem dos coeficientes. Como fiquei com preguiça, naquele programa de exemplo, eu inicializei diretamente um array como

double[] a = { -540, 633, -40, -58, 4, 1 };

que é equivalente a:

double[] a = new double [5+1];
a[0] = -540;
a[1] = 633;
a[2] = -40;
a[3] = -58;
a[4] = 4;
a[5] = 1;

Espero que vocês não se confundam com a ordem dos coeficientes.

Então Bruno,

Quando cheguei em casa dei um olhada em seu código,

No meu caso ta pedindo a seguinte aplicação:
Entrar com o grau do polinomio
Entar com coeficiente
atribuir o valor de Xn
Apresentar o Polinomio
Apresentar a Raiz
Apresentar numero de iteração

Conversei com alguns colegas da sala, poucos fizeram o programa,

E eu pra variar não estou conseguindo fazer nada, kkk

Não consigo ver a logica pra desenvolver a aplicação,

Pelo que vi, não é dificil, mais não to conseguindo de jeito nem um! rs