raíces de una ecuación (i)
TRANSCRIPT
-
7/26/2019 Races de Una Ecuacin (I)
1/8
1/6/2016 Races de una ecuacin (I)
http://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/raices/raices.html
Races de ecuaciones
Sistemas de ecuaciones
Valores y vectorespropios
Integracin numrica
Ecuacionesdiferenciales
Interpolacin, regresin
Inicio MATLAB Numrico
Races de una ecuacin (I)
En este captulo vamos a estudiar:
1. Las races de una ecuacin de segundo grado
2. Las races de una ecuacin cbica
3. Las races de una ecuacin transcendente mediante los siguientes mtodos:
iterativo
Newton-Raphson
biseccin o del punto medio
secante
grfico
empleando la funcin MATLABfzero
4. Las races de un polinomio mediante la funcin MATLAB roots
La ecuacin de segundo grado
Las races de la ecuacin de segundo grado ax2+bx+c=0, son
Creamos una funcin denominada raices_2 que se le pasan el vectorpde los coeficientes [abc] y devuelve las
racesx1yx2.function [x1,x2] = raices_2(p) dis= sqrt(p(2)*p(2)-4*p(1)* p(3))
x1=(-p(2)+dis)/(2*p(1)) x2=(-p(2)-dis)/(2*p(1))
end
Para calcular las races de la ecuacin de segundo gradox2+x-6 en la la ventana de comandos llamamos a lafuncin raices_2 y le pasamos los coeficientes del polinomio
>> [r1,r2]=raices_2([1 1 -6])r1= 2
r2= -3
Para calcular las races de la ecuacin de segundo gradox2+x+1 escribimos
>> [r1,r2]=raices_2([1 1 1])
r1=-0.5000+0.8660i
r2=-0.5000-0.8660i
La ecuacin cbica
Vase http://www.sc.ehu.es/sbweb/fisica_/numerico/raices/raiz_cubica.html
Expresamos una ecuacin cbica en la forma equivalente
x3+ax2+bx+c=0
= =
1
b+ 4 a c
b
2
2 a
2
b 4 a c
b
2
2 a
http://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/portada/portada.htmlhttp://www.sc.ehu.es/sbweb/fisica_/numerico/raices/raiz_cubica.htmlhttp://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/portada/portada.htmlhttp://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/intro.htmlhttp://www.sc.ehu.es/sbweb/energias-renovables/index.htmlhttp://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/datos/interpolacion.htmlhttp://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/diferencial/diferencial.htmlhttp://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/integral/integral.htmlhttp://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/propios/propios.htmlhttp://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/ecuaciones/gauss.htmlhttp://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/raices/raices.html -
7/26/2019 Races de Una Ecuacin (I)
2/8
1/6/2016 Races de una ecuacin (I)
http://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/raices/raices.html
dividiendo todos los coeficientes por el primero, de modo que el coeficiente del trminox3es la unidad.
Las frmulas que permiten calcular las races de una ecuacin cbica son las siguientes:
SiR2 r=raices_3([1 0 -7 -6])r =
-2.0000 3.0000
-1.0000
Para calcular las races de la ecuacin cbicax3+3x2+3x+2 escribimos en la ventana de comandos
Q=
R =
3ba
2
9
2 9 a b + 2 7ca
3
5 4
= a r c c o s
( )
R
Q
3
= 2 c o s (
1
Q
3
a
3
= 2 c o s (
2
Q
+ 2
3
a
3
= 2 c o s (
3
Q
2
3
a
3
A= s g n (
R )(
| R| + )
R
2
Q
3
1
3
/
B =
Q/
A A 0
0 A
= 0
= (A + B
)
1
a
3
= (A + B
) + ( A B )
2
1
2
a
3
3
2
= ( A+
B ) (
A
B)
3
1
2
a
3
3
2
-
7/26/2019 Races de Una Ecuacin (I)
3/8
1/6/2016 Races de una ecuacin (I)
http://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/raices/raices.html
>> r=raices_3([1 3 3 2])
r = -2.0000
-0.5000-0.8660i
-0.5000+0.8660i
Mtodo de las aproximaciones sucesivas
El mtodo de las aproximaciones sucesivas es uno de los procedimientos ms importantes y ms sencillos decodificar. Supongamos la ecuacin
f(x)=0
dondef(x) es una funcin continua que se desea determinar sus races reales. Se sustituyef(x) por la ecuacinequivalente
x=g(x)
Se estima el valor aproximado de la razx0y se sustituye en el segundo miembro de la ecuacin para obtenerx1.
x1=g(x0)
Poniendox1como argumento deg(x), obtendremos un nuevo nmerox2y as, sucesivamente. Este proceso se
puede sintetizar en la frmula.
xn=g(xn-1)
Si esta secuencia es convergente es decir, tiende hacia un lmite, la raz buscada es
El mtodo de iteracin se explica geomtricamente mediante el grfico de la figura. Se dibuja la curvay=g(x), yla rectay=x, bisectriz del primer cuadrante. La abscisa del punto de interseccin es la raz buscada.
Un ejemplo tpico, es la de encontrar la raz de la ecuacin x=cos(x)
Para encontrar la raz, se comienza en el punto cualquiera de abscisax0dentro del intervalo (0, /2), y se traza la
lnea vertical hasta que interseca la curva, luego, desde este punto, se traza una lnea horizontal hasta que sealcanza la recta bisectriz, este punto tendr por abscisax1. Se traza de nuevo, una lnea vertical hasta encontrar a
la curva, y otra lnea horizontal hasta encontrar la lnea recta, el punto de interseccin tiene de abscisax2y as,sucesivamente. Como podemos apreciar en la figura, la sucesinx1, x2, x3...tiende hacia la raz de la ecuacin
x=cos(x).
Vamos ahora a crear un script para calcular la raz de la ecuacin x=cos(x) en el intervalo 0 a /2.
Tomamos una aproximacin inicial a la razx0, en dicho intervalo y aplicamos la frmulaxn=g(xn-1). Su
codificacin no presenta grandes dificultades. Escribimos el script trascedenteque guardaremos en el fichero .M
x=input ('valor inicial: ')
iter=input('nmero de iteracciones: ')for i=1:iter
x=cos(x)end
disp(x)
= l i m
-
7/26/2019 Races de Una Ecuacin (I)
4/8
1/6/2016 Races de una ecuacin (I)
http://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/raices/raices.html
En la ventana de comandos corremos el script trascendentey obtenemos una aproximacin a la raz buscadadespus de 100 iteraciones
>>trascendente
valor inicial: 0.5
nmero de iteracciones: 100 0.7391
La condicin de finalizacin
Primero, introducimos el valor inicialx, la primera aproximacin, calculamos el valor del coseno dex, el valordevuelto (segunda aproximacin), lo guardamos de nuevo en la variablexy repetimos el procesoindefinidamente. El cdigo aunque correcto, necesita terminarse en algn momento, cumpliendo una determinadacondicin.
Cuando el valor absoluto del cociente entre la diferencia de dos trminos consecutivos de la sucesin y uno de lostrminos, sea menor que cierta cantidad .
Este criterio, no es completamente riguroso, pero es un buen punto de partida para el estudio de este mtodo.
Modificamos el script trascendentepara sustituir el bucle forpor un bucle whileindefinido que se interrumpecuando se cumpla la condicin de terminacin .
x0=input ('valor inicial: ')
ERROR=0.001while(1) %bucle que se ejecuta indefinidamente
x=cos(x0) if abs((x-x0)/x)>trascedentevalor inicial: 0.5
0.7387
El criterio de convergencia
No todas las ecuaciones pueden resolverse por este mtodo, solamente si el valor absoluto de la derivada de la
funcing(x) en la vecindad de la raz es menor que la unidad (la pendiente de la recta bisectriz del primercuadrante es uno). En la figura, podemos ver como es imposible encontrar la solucin marcada por un puntitonegro en la interseccin entre la curva y la recta bisectriz del primer cuadrante, ya que la sucesinxidiverge.
-
7/26/2019 Races de Una Ecuacin (I)
5/8
1/6/2016 Races de una ecuacin (I)
http://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/raices/raices.html
Por ejemplo, la ecuacin
x3-x-1=0
tiene una raz en el intervalo (1, 2) ya quef(1)=-10.Esta ecuacin puede escribirse de la forma
x=x3-1
En este caso,
g(x)=x3-1 y su derivada es g'(x)= 3x2
y por tanto,
g'(x)3 para 1x2
en consecuencia, no se cumplen las condiciones de convergencia del proceso de iteracin. Si escribimos laecuacin en la forma
como podr verificar fcilmente el lector, cumple las condiciones de convergencia, obtenindose rpidamente unvalor aproximado de la raz buscada mediante el procedimiento de iteraccin.
Podemos transformar el script en una funcin que denominamos raiz_trascendente para que calcule la raz de laecuacinx-cos(x)=0
function x=raiz_trascendente(x0, ERROR) while(1)
x=cos(x0) if abs((x-x0)/x)>raiz_trascedente (0.5,0.0001)
ans = 0.7391
Vamos a hacer que este cdigo sea independiente de la funcinx=g(x) cuya raz queremos calcular. En elcaptulo funciones, ya hemos visto que a una funcin se le pueden pasar diversos tipos de datos: escalares,vectores, strings y tambin, funciones.
Modificamos la definicin de la funcin raiz_trascendente y le pasamos la funcinfque definiremos en laventana de comandos, en su primer parmetro y a continuacin, la aproximacin inicialx0 y el error o toleranciaen la raz buscada.
function x=raiz_trascendente(f,x0,ERROR)
while(1) x=f(x0)
if abs((x-x0)/x)
-
7/26/2019 Races de Una Ecuacin (I)
6/8
1/6/2016 Races de una ecuacin (I)
http://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/raices/raices.html
endend
En la ventana de comandos, definimos la funcin annimag(x) y calculamos la raz de la ecuacin trascendentex=g(x).
>> g=@(x) cos(x)>> raiz_trascendente(g,0.5,0.001)
ans = 0.7393
Para aplicar el mtodo de las aproximaciones sucesivas hemos de escribir la ecuacinf(x)=0 comox=g(x) y
debern adems, cumplirse las condiciones de convergencia en el proceso de iteraccin.
Mtodo de Newton-Raphson
El desarrollo en serie de la funcinf(x) en el puntoxes
Si hes pequeo, podemos despreciar los trminos en h2y superiores. Six+hes la raz de la ecuacin,entoncesf(x+h)=0,
Para calcular la raz podemos crear un desarrollo iterativo de la siguiente forma
Definimos el procedimiento de Newton-Raphson de un modo similar al de las aproximaciones sucesivas
function x=newton_raphson(f,f_prima,x0,ERROR)
while(1) x=x0-f(x0)/f_prima(x0)
if abs((x-x0)/x)
-
7/26/2019 Races de Una Ecuacin (I)
7/8
1/6/2016 Races de una ecuacin (I)
http://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/raices/raices.html
abscisax2y as, sucesivamente.
f=@(x) x.*sin(pi*x)-exp(-x)fp=@(x) sin(pi*x)+x*pi*cos(pi*x)+exp(-x)
hold on
x=linspace(0,0.8,50)
plot(x,f(x),'r')x0=0.1
for i=1:5 x1=x0-f(x0)/fp(x0)
h=line([x0,x0],[0,f(x0)],'color','g') set(h,'lineStyle', '--')
line([x1,x0],[0,f(x0)],'color','b') x0=x1
endhold off
grid onxlabel('x')
ylabel('y')
title('Mtodo de Newton-Raphson')
Calculamos la raz
>> f=@(x) x*sin(pi*x)-exp(-x)
>> fp=@(x) sin(pi*x)+x*pi*cos(pi*x)+exp(-x)
>> newton_raphson(f,fp,0.1,0.0001)ans = 0.5783
Si no conocemos la derivada de la funcin podemos calcularla aplicando la definicin de derivada
Podemos tomar un valor estimativo de =10-6o cambiarlo dependiendo del problema. La frmula de Newton-Raphson se convierte en
function x=newton_raphson_1(f,x0,ERROR) DELTA=1.0e-6
while(1)
x=x0-DELTA*f(x0)/(f(x0+DELTA)-f(x0))
if abs((x-x0)/x)
-
7/26/2019 Races de Una Ecuacin (I)
8/8
1/6/2016 Races de una ecuacin (I)
http://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/raices/raices.html
break end
x0=x endend
A la funcin newton_raphson_1, le pasamos la funcinf, la aproximacin inicialx0 y la tolerancia ERROR.Consideremos la funcinf(x)=x-cos(x), en la ventana de comandos escribimos
>> func=@(x) x-cos(x)
>> newton_raphson_1(func,0.5,0.0001)
ans = 0.7391
Energas Renovables EUITI de Eibar
http://www.sc.ehu.es/sbweb/energias-renovables/MATLAB/numerico/raices/raices_1.html