algunos cambios pseint tambien soporta asignacion con "="
cambie en parte la subrutina para mostrar paso a paso ciertas partes y según código de wikipedia, pero aun sigue teniendo problemas
http://es.wikipedia.org/wiki/M%C3%A9todo_de_Newton// http://es.wikipedia.org/wiki/M%C3%A9todo_de_Newton
// funcion auxiliar
// ejempo 1*x^3+6*x^2+11*x+6*x^0 polinomio de grado 3, tiene 4 coeficientes visto en forma vectorial o de arreglo como [ 1, 6, 11, 6 ]
// raices {1,2,3}
funcion valor_retorno = evalPolinomio( copia_Pol, orden_Pol, val_x ) // Esta función como su nombre lo indica evalúa un polinomio de orden n en el valor x
Definir k,acumSum Como Enteros;
acumSum = 0 // valor inicial de la expresion a evaluar
Escribir " ";
Para k = 0 Hasta orden_Pol Con Paso 1 Hacer // segun el ejemplo si 1*x^3+6*x^2+11*x+6*x^0 entonces inicia ciclo entre 0 y 3
acumSum = acumSum + copia_Pol[k+1]*( (val_x)^(orden_Pol-k) );
Imprimir "para k =" k, " Acumulado = ", acumSum;
// para k = 0 extrae el coeficente de la posicion 1 y lo multiplica por el valor de x^(3-0) => x^3 y le suma el valor acumulado anterior
// para k = 1 extrae el coeficente de la posicion 2 y lo multiplica por el valor de x^(3-1) => x^2 y le suma el valor acumulado anterior
// para k = 2 extrae el coeficente de la posicion 3 y lo multiplica por el valor de x^(3-2) => x^1 y le suma el valor acumulado anterior
// para k = 3 extrae el coeficente de la posicion 4 y lo multiplica por el valor de x^(3-3) => x^0 y le suma el valor acumulado anterior
FinPara
valor_retorno = acumSum; // valor_retorno es la variable que contiene el valor de retorno cuando se invoca desde otra funcion o proceso
FinFuncion
// funcion principal
Proceso Newton_Raphson//()
Dimension Pol[10]; // Se crean un arreglo para almacenar los coeficientes del polinomio (maximo 10 coeficientes)
Dimension derPol[9]; // Se crean un arreglo uno para almacenar los coeficientes de la derivada. (maximo 9 coeficientes)
Definir Pol, derPol Como Entero // tipo de coeficientes enteros para el polinomio y derivada
Definir n Como Entero; // variable para el grado del poninomio
Definir i, ci, cont Como Entero; // variables contadores
Definir dx, x0, t2, px1, dpx1 Como Reales;
Escribir "Bienvenido!, esta aplicación le ayudará a localizar la raices de un polinomio usando el algoritmo de Newton-Raphson";
Escribir Sin Saltar "Escriba el grado del polinomio";
Leer n;
Escribir "Escriba los coeficientes del polinomio ordenado de forma canónica descendente";
// Ciclo Para: sirve para leer los coeficientes del polinoio y hallar su derivada.
Para ci = 1 Hasta n+1 Hacer // un polinomio de grado n, tiene n+1 coeficientes
Escribir Sin Saltar "ingrese coeficiente: ", ci;
Leer Pol[ci]; // asignar por lectura de teclado cada coeficiente del polinomio
Si ci < n+1 Entonces // la derivada del x^0 es cero por eso no se incluye
derPol[ci] = Pol[ci]*( (n-ci)+1); // asigna el valor de la derivada en la formacion o arreglo delPol
FinSi
FinPara
Para ci = 1 Hasta n+1 Hacer // Esto no es necesario pero lo que hace es escibir el polinomio.
Si ci < n Entonces
Escribir Sinsaltar Pol[ci],"*x^", n-(ci-1), "+";
Sino
Si ci=n Entonces // para x^1
Escribir Sinsaltar Pol[ci],"*x+"; // extrae el valor del coeficiente de x^1
Sino
Escribir Pol[ci]; // para x^0
FinSi
FinSi
FinPara
Escribir "Derivada"; // Este escribe el polinomio correspondiente a la derivada.
Para ci = 1 Hasta n Hacer
Si ci < n-1 Entonces
Escribir Sinsaltar derPol[ci],"*x^", n-ci, "+";
Sino
Si ci=n-1 Entonces
Escribir Sinsaltar derPol[ci],"*x+";
Sino
Escribir derPol[ci];
FinSi
FinSi
FinPara
Escribir " "; // Este lo hice para provocar un salto de linea
Escribir Sin Saltar "Ingrese el valor inicial, punto cercano a la raíz";
Leer x0; // Este es el primer valor almacenado para comenzar la iteración
//p_x0 = evalPolinomio( Pol, n, x0 ); // Se evalúa al polinomio en el valor x0
//Escribir "Pol(", x0 ")= ", p_x0;
//dp_x0 = evalPolinomio( derPol,n-1, x0 ); // Se evalúa la derivada en el valor x0
//Escribir "DerPol(", x0 ")= ", dp_x0;
Definir max_iter Como Entero;
Escribir Sin Saltar "Ingrese el numero de iteraciones maximo permitido";
Leer max_iter;
Definir e, error Como Real;
Escribir "margen de error";
leer e; // margen de error;
error=1
i = 0;
cont = 0;
Mientras error >= e o i <= max_iter Hacer // Esta es la iteración propia del algoritmo de Newton_Raphson
p_x0 = evalPolinomio( Pol, n, x0 ); // Se evalúa al polinomio en el valor x0
Escribir "Pol(", x0 ")= ", p_x0;
dp_x0 = evalPolinomio( derPol,n-1, x0 ); // Se evalúa la derivada en el valor x0
Escribir "DerPol(", x0 ")= ", dp_x0;
x1 = x0 - (p_x0/dp_x0); // Esta es la definición del algoritmo de Newton-Raphson
cont = cont+1; // Esto cuenta el número de iteraciones hechas
error= abs((x1-x0)/x1);
si evalPolinomio( Pol, n, x1 ) == 0 Entonces
imprimir "Nos alegramos por que encontramos la raíz"
Escribir "La raíz aproximada es: ", x0;
i = max_iter+1;
fin si
x0=x1;
// Si x1 <> x0 Entonces
// x0 = x1; // Con esto en la nuava iteración se evaluará las funciones en un nuevo x0=x1
// x1 = 1000; // Esto es importante si no asigno en este punto se pararía el ciclo mientras ya que t11=x1
// Sino // se debe detener cuando x0 sea igual a x1 signando a i=1
// i = 1; // Esto detiene el ciclo "mientras" al ser x0=x1
// FinSi
// Si cont==20 Entonces // esto detiene la iteración cuando llega a veinte, ya que son demsiadas.
// i = 1; // Esto detiene el ciclo "mientras" caundo contador es 20
// FinSi
FinMientras
Escribir "La raíz aproximada es: ", x0;
Escribir "Con una toleracia de ", e;
Escribir "Número de iteraciones = ", cont;
Escribir evalPolinomio( Pol, n, x0 );
FinProceso
Codigo en matlab
%Método Newton-Raphson
%
%Es un método para aproximar la solución de una ecuación de una sola
%variable por medio de la aproximación de su derivada y con un punto fijo,
%cercano a la raíz.
%
%f=Función previamente definida en consola (use el siguiente comando en consola "f = @(x)(escriba aquí su función)");
%ff=derivada analítica de la función f (difinida previamente con el mismo comando anterior);
%a=punto cercano a la raíz; e=margen de error; n=numero de
%itaraciones maximo permitido
%
%El ingreso de datos es de la forma np(f,ff,a,e,n)
%
%by Francisco Peña Gallardo (Peñovsky Freeman)
%UMSNH
%
function np(f,ff,a,e,n)
fprintf('Método de la Secante\n');
fprintf('by Peñovsky Freeman\n');
format long
x0=a;
i=0;
error=1;
fprintf('Iter. \t m \n');
while error>=e || i==n
f0=feval(f,x0);
f1=feval(ff,x0);
x1=x0-(f0/f1);
i=i+1;
error=abs((x1-x0)/x1);
fprintf('%d \t %d \n',i,x1)
if feval(f,x1)==0
sprintf('Nos alegramos por que encontramos la raíz')
return
end
x0=x1;
end
w = feval(f,x0);
fprintf('\nLa raíz aproximada es:\t \t %f\n',x0);
fprintf('\nCon una toleracia de:\t \t %f\n',e);
fprintf('Número de Iter:\t \t \t \t %d \n',i);
disp('Función:');
disp(f);
fprintf('El valor de f(x) en %f es: f(x) = %f\n',x0,w)
return
end