Reflectz’s Blog

Just another WordPress.com weblog

Método de Newton Raphson Implementado em PHP

leave a comment »

Bom, esse tópico será útil pra quem estuda cálculo numérico. Observei pela internet que o conteúdo é escasso e esta será a primeira classe implementada deste tipo. Existem vários documentos explicando o método, porém nenhum foi verdadeiramente implementado. Este talvez seja o primeiro.

Bom, vamos ao que interessa!

Em Análise numérica, o Método de Newton (ou método Newton-Raphson) tem o objetivo de estimar as raízes de uma função. Para isso, toma-se um ponto qualquer da função, calcula-se a equação da tangente (derivada) da função nesse ponto, calcula-se o intercepto da tangente ao eixo das abcissas, calcula-se o valor da função nesse ponto, e repete-se o processo, que deve tender a uma das raízes da função rapidamente, ou não tender a nada, deixando isso claro logo.

Primeiramente, vamos criar a classe Newton.


<?php

// CLASSE DE IMPLEMENTAÇÃO DO MÉTODO NEWTON RAPHSON
// TRABALHO REALIZADO COMO PRÉ-REQUISITO DA DISCIPLINA CALCULO NUMÉRICO
// PROFESSOR: ANDRÉ TELLES
// AUTOR: BRUNO CONDE PEREZ BRUM - NOVEMBRO - 2008
// www.brunobrum.wordpress.com

Class Newton {

        private $ex;
        private $ey;
        private $ez;
        private $et;
        private $dt;

        //CONSTRUTOR
        public function __construct($ex="", $ey="", $ez="", $et="", $dt="") {

            $this->ex=$ex;
            $this->ey=$ey;
            $this->ez=$ez;
            $this->et=$et;
            $this->dt=$dt;

        } // FIM CONSTRUTOR

        public function getex(){
            return $this->ex;
        }
        public function getey(){
            return $this->ey;
        }
        public function getez(){
            return $this->ez;
        }
        public function getet(){
            $expr = $this->et;
            eval("\$valor = $expr;");
            return $valor;
        }
        public function getdt(){
            $expr = $this->dt;
            eval("\$valor = $expr;");
            return $valor;
        }        

        public function evalnit(){
            $expr = $this->ey;
            eval("\$valor = $expr;");
            return $valor;
        }    

        public function evalerro(){
            $expr = $this->ez;
            eval("\$valor = $expr;");
            return $valor;
        }                    

        public function evalfx(){
            $expr = $this->et;
            eval("\$valor = $expr;");
            return $valor;
        }                        

        public function evaldx(){
            $expr = $this->dt;
            eval("\$valor = $expr;");
            return $valor;
        }                                    

        public function evalex(){
            $expr = $this->ex;
            eval("\$valor = $expr;");
            return $valor;
        }            

        // INICIO CLASSE CALCULA MÉTODO NEWTON RAPHSON
        public function calculaNewton(){

           print '<b>Resultados da Iteração</b>';
           print 'Resolver '.$this->getet().' = 0, usando o método de Newton Raphson.';

           $x = $this->evalex();

            print '
<table border=1 cellpadding=4>
<tr>
<td>Iteradas</td>
</tr>
<tr>
<td><b>x<sub>0</sub><b>= '.$x.'</td>
</tr>
';

            $x0 = $x;
            $nit = $this->evalnit();
            $erro = $this->evalerro();
            $fx = $this->evalfx();
            $dx = $this->evaldx();    

            $x = $x - $fx/$dx;

            print '
<tr>
<td><b>x<sub>1</sub></b>= '.$x.'</td>
</tr>
';

            $n = 1;       
            // valor absoluto
            $er = abs($x - $x0);

                while($n < $nit && $er > $erro){

                    $n++;
                    $x0 = $x;
                    $fx = $this->evalfx();
                    $dx = $this->evaldx();
                    $x = $x - $fx/$dx;

                    print '
<tr>
<td><b>x<sub>'.$n.'</sub>=</b> '.$x.'</td>
</tr>
';

                    $er = abs($x - $x0);    

                } // FIM WHILE

            print '</table>
';

        } // FIM MÉTODO CALCULA NEWTON

    } // FIM CLASSE

?>

Agora, com a classe implementada e salva no arquivo newton.php,vamos agora instanciar a classe junto ao formulário de dados, o arquivo index.php


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>CALCULO NUMÉRICO - PROF. ANDRÉ TELLES</title>
</head>

<body>
<h1>Calculo Numérico - Estudo Dirigido</h1>
<h3>Implementação dos Métodos de Newton Raphson e o Método da Secante
Linguagem de Programação: PHP ORIENTADO A OBJETOS
Aluno: Bruno Conde Perez Brum
Professor: André Telles</h3>
<h3><a href="index.php?metodo=1">O Método de Newton Raphson</a></h3>
<hr>
<?php

    if($_GET&#91;'metodo'&#93; == 1 || $_POST&#91;'metodo'&#93; == 1){

        print '
        <form method="POST" action="index.php">
            <input type="hidden" name="metodo" value=1>
<table>
<tr>
<td colspan=2 align="center">
<h2>Método de Newton Raphson</h2>
</td>
<tr>
<tr>
<td align="right">Iterada Inicial</td>
<td><input type="text" name="ex" value="0.5" size=10></td>
</tr>
<tr>
<td>Nº Máximo de Iteradas</td>
<td><input type="text" name="ey" value="100" size=10></td>
</tr>
<tr>
<td align="right">|x<SUB>n+1</SUB>-x<SUB>n</SUB>| <</td>
<td<input type="text" name="ez" value="0.0001" size=10></td>
</tr>
<tr>
<td align="right"> F(x)=0, onde F(x)=</td>
<td><input type="text" name="et" value="x-cos(x)" size=25></td>
</tr>
<tr>
<td align="right"> F \'(x)=</td>
<td><input type="text" name="dt" value="1+sin(x)" size=25></td>
</tr>
<tr>
<td><input type="submit" value="Calcular"></td>
</tr>
</table>
</form>
        ';

if(isset($_POST['ex']) && isset($_POST['ey']) && isset($_POST['ez']) && isset($_POST['et']) && isset($_POST['dt'])){
   require_once "classes/newton.php";
   // instancio a classe junto ao construtor passando os parâmetros do formulário
   $newton = new Newton($_POST['ex'],$_POST['ey'],$_POST['ez'],$_POST['et'],$_POST['dt']);
   // chamo o método calculaNewton para obter os resultados
   $newton->calculaNewton();
}
} // FIM IF   

?>

</body>
</html>

Esse método é muito bem explicado na internet, porém pouco implementado.
Agora temos uma implementação em php orientado a objetos que calcula o método de newton raphson.
Acho que este tópico será bastante útil para quem estuda Calculo Numérico. Espero ter ajudado.

Written by reflectz

Novembro 8, 2008 às 4:06 pm

Publicado em PHP

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s

%d bloggers like this: