Sunteți pe pagina 1din 94

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 MATLAB fzero
4. Las races de un polinomio mediante la funcin MATLAB roots
La ecuacin de segundo grado
Las races de la ecuacin de segundo grado ax
2
+bx+c=0, son
Creamos una funcin denominada raices_2 que se le pasan el vector p de los coeficientes [a b c] y devuelve las
races x
1
y x
2
.
f unct i on [ x1, x2] = r ai ces_2( p)
di s= sqr t ( p( 2) *p( 2) - 4*p( 1) *p( 3) ) ;
x1=( - p( 2) +di s) / ( 2*p( 1) ) ;
x2=( - p( 2) - di s) / ( 2*p( 1) ) ;
end
Para calcular las races de la ecuacin de segundo grado x
2
+x-6 en la la ventana de comandos llamamos a la
funcin raices_2 y le pasamos los coeficientes del polinomio
>> [ r 1, r 2] =r ai ces_2( [ 1 1 - 6] )
r 1= 2
r 2= - 3
Para calcular las races de la ecuacin de segundo grado x
2
+x+1 escribimos
>> [ r 1, r 2] =r ai ces_2( [ 1 1 1] )
r 1=- 0. 5000+0. 8660i
r 2=- 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
x
3
+ax
2
+bx+c=0
dividiendo todos los coeficientes por el primero, de modo que el coeficiente del trmino x
3
es la unidad.
Las frmulas que permiten calcular las races de una ecuacin cbica son las siguientes:
= = x
1
b + 4ac b
2

2a
x
2
b 4ac b
2

2a
3b a
2
2 9ab +27c a
3
Si R
2
<Q
3
entonces la ecuacin tiene tres races reales
En caso contrario, R
2
Q
3
tenemos una raz real y dos complejas.
La raz real y las dos complejas conjugadas son:
Creamos una funcin denominada raices_3 a la que se le pasa el vector p de los coeficientes [1 a b c] y devuelve
las valores de races x
1
, x
2
y x
3
.
f unct i on [ x1, x2, x3] = r ai ces_3( p)
%cdi go
end
Ahora bien, para hacerla similar a la funcin roots de MATLAB, vamos a definirla para que devuelva un vector x
f unct i on x = r ai ces_3( p)
Q=( p( 2) *p( 2) - 3*p( 3) ) / 9;
R=( 2*p( 2) ^3- 9*p( 2) *p( 3) +27*p( 4) ) / 54;
x=zer os( 3, 1) ; %r eser va memor i a par a un vect or de t r es el ement os
i f ( R*R) <( Q^3)
t et ha=acos( R/ sqr t ( Q^3) ) ;
x( 1) =- 2*sqr t ( Q) *cos( t et ha/ 3) - p( 2) / 3;
x( 2) =- 2*sqr t ( Q) *cos( ( t et ha+2*pi ) / 3) - p( 2) / 3;
x( 3) =- 2*sqr t ( Q) *cos( ( t et ha- 2*pi ) / 3) - p( 2) / 3;
el se
A=- si gn( R) *nt hr oot ( abs( R) +sqr t ( R*R- Q^3) , 3) ;
i f A==0
B=0;
el se
B=Q/ A;
end
x( 1) =( A+B) - p( 2) / 3;
x( 2) =- ( A+B) / 2- p( 2) / 3+( sqr t ( 3) *( A- B) / 2) *sqr t ( - 1) ; %mej or que i
x( 3) =- ( A+B) / 2- p( 2) / 3- ( sqr t ( 3) *( A- B) / 2) *sqr t ( - 1) ;
end
end
En la ventana de comandos llamamos a la funcin raices_3 para calcular las races de la ecuacin cbica
x
3
+0x
2
-7x-6
>> r =r ai ces_3( [ 1 0 - 7 - 6] )
r =
- 2. 0000
3. 0000
- 1. 0000
Para calcular las races de la ecuacin cbica x
3
+3x
2
+3x+2 escribimos en la ventana de comandos
>> r =r ai ces_3( [ 1 3 3 2] )
r =
- 2. 0000
- 0. 5000- 0. 8660i
- 0. 5000+0. 8660i
Mtodo de las aproximaciones sucesivas
Q = R =
9 54
=arccos
?
?
?
R
Q
3

?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
=2 cos( ) x
1
Q


3
a
3
=2 cos( ) x
2
Q

+2
3
a
3
=2 cos( ) x
3
Q

2
3
a
3
A =sgn(R)(|R|+ ) R
2
Q
3

1
3 /
B ={
Q/AA 0
0 A =0
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
=(A +B) x
1
a
3
= (A +B) +i (A B) x
2
1
2
a
3
3
2
= (A +B) i (A B) x
3
1
2
a
3
3
2
El mtodo de las aproximaciones sucesivas es uno de los procedimientos ms importantes y ms sencillos de
codificar. Supongamos la ecuacin
f(x)=0
donde f(x) es una funcin continua que se desea determinar sus races reales. Se sustituye f(x) por la ecuacin
equivalente
x=g(x)
Se estima el valor aproximado de la raz x
0
y se sustituye en el segundo miembro de la ecuacin para obtener x
1
.
x
1
=g(x
0
)
Poniendo x
1
como argumento de g(x), obtendremos un nuevo nmero x
2
y as, sucesivamente. Este proceso se
puede sintetizar en la frmula.
x
n
=g(x
n-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 curva y=g(x), y
la recta y=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 abscisa x
0
dentro 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 se
alcanza la recta bisectriz, este punto tendr por abscisa x
1
. 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 abscisa x
2
y as,
sucesivamente. Como podemos apreciar en la figura, la sucesin x
1
, x
2
, x
3
... 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 raz x
0
, en dicho intervalo y aplicamos la frmula x
n
=g(x
n-1
). Su
codificacin no presenta grandes dificultades. Escribimos el script trascedente que guardaremos en el fichero .M
x=i nput ( ' val or i ni ci al : ' ) ;
i t er =i nput ( ' nmer o de i t er acci ones: ' ) ;
f or i =1: i t er ;
x=cos( x) ;
end
di sp( x)
En la ventana de comandos corremos el script trascendente y obtenemos una aproximacin a la raz buscada
despus de 100 iteraciones
>>t r ascendent e
val or i ni ci al : 0. 5
nmer o de i t er acci ones: 100
0. 7391
La condicin de finalizacin
Primero, introducimos el valor inicial x, la primera aproximacin, calculamos el valor del coseno de x, el valor
=lim
n
x
n
devuelto (segunda aproximacin), lo guardamos de nuevo en la variable x y repetimos el proceso
indefinidamente. El cdigo aunque correcto, necesita terminarse en algn momento, cumpliendo una
determinada condicin.
Cuando el valor absoluto del cociente entre la diferencia de dos trminos consecutivos de la sucesin y uno de los
trminos, 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 trascendente para sustituir el bucle for por un bucle while indefinido que se interrumpe
cuando se cumpla la condicin de terminacin .
x0=i nput ( ' val or i ni ci al : ' ) ;
ERROR=0. 001;
whi l e( 1) %bucl e que se ej ecut a i ndef i ni dament e
x=cos( x0) ;
i f abs( ( x- x0) / x) <ERROR
br eak
end
x0=x;
end
di sp( x)
En primer lugar, fijamos el valor de la constante o ERROR. Introducimos la primera aproximacin a la raz, y la
guardamos en la variable x0, calculamos su coseno y obtenemos la segunda aproximacin, la guardamos en la
variable x. Verificamos si se cumple la condicin de terminacin. En el caso de que no se cumpla, x0 toma el
valor de x y se repite el proceso. En el momento en que se cumpla la condicin de terminacin, se sale del bucle
indefinido y se imprime la raz buscada. Como podemos observar las variables x0 y x guardan dos trminos
consecutivos de la sucesin que tiende hacia la raz de la funcin.
Regresamos a la ventana de comandos para correr el script trascendente y obtenemos una aproximacin a la raz
buscada
>>t r ascedent e
val or i ni ci al : 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
funcin g(x) en la vecindad de la raz es menor que la unidad (la pendiente de la recta bisectriz del primer
cuadrante es uno). En la figura, podemos ver como es imposible encontrar la solucin marcada por un puntito
negro en la interseccin entre la curva y la recta bisectriz del primer cuadrante, ya que la sucesin x
i
diverge.
Por ejemplo, la ecuacin
x
3
-x-1=0
tiene una raz en el intervalo (1, 2) ya que f(1)=-1<0 y f(2)=5>0. Esta ecuacin puede escribirse de la forma
x=x
3
-1
En este caso,
g(x)=x
3
-1 y su derivada es g'(x)=3x
2
<
|
|
|
x
n+1
x
n
x
n+1
|
|
|
y por tanto,
g'(x)3 para 1x2
en consecuencia, no se cumplen las condiciones de convergencia del proceso de iteracin. Si escribimos la
ecuacin en la forma
como podr verificar fcilmente el lector, cumple las condiciones de convergencia, obtenindose rpidamente un
valor 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 la
ecuacin x-cos(x)=0
f unct i on x=r ai z_t r ascendent e( x0, ERROR)
whi l e( 1)
x=cos( x0) ;
i f abs( ( x- x0) / x) <ERROR
br eak
end
x0=x;
end
end
En la ventana de comandos probamos la funcin raiz_trascendente
>>r ai z_t r ascedent e ( 0. 5, 0. 0001)
ans = 0. 7391
Vamos a hacer que este cdigo sea independiente de la funcin x=g(x) cuya raz queremos calcular. En el
captulo 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 funcin f que definiremos en la
ventana de comandos, en su primer parmetro y a continuacin, la aproximacin inicial x0 y el error o tolerancia
en la raz buscada.
f unct i on x=r ai z_t r ascendent e( f , x0, ERROR)
whi l e( 1)
x=f ( x0) ;
i f abs( ( x- x0) / x) <ERROR
br eak
end
x0=x;
end
end
En la ventana de comandos, definimos la funcin annima g(x) y calculamos la raz de la ecuacin trascendente
x=g(x).
>> g=@( x) cos( x)
>> r ai z_t r ascendent e( g, 0. 5, 0. 001)
ans = 0. 7393
Para aplicar el mtodo de las aproximaciones sucesivas hemos de escribir la ecuacin f(x)=0 como x=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 funcin f(x) en el punto x+h es
Si h es pequeo, podemos despreciar los trminos en h
2
y superiores. Si x+h es la raz de la ecuacin, entonces
f(x+h)=0,
Para calcular la raz podemos crear un desarrollo iterativo de la siguiente forma
x = x +1

3
f(x +h) =f(x) +h f'(x) +...
h
f(x)
f'(x)
= x
n+1
x
n
f( ) x
n
f'( ) x
n
Definimos el procedimiento de Newton-Raphson de un modo similar al de las aproximaciones sucesivas
f unct i on x=newt on_r aphson( f , f _pr i ma, x0, ERROR)
whi l e( 1)
x=x0- f ( x0) / f _pr i ma( x0) ;
i f abs( ( x- x0) / x) <ERROR
br eak
end
x0=x;
end
end
A la funcin newton_raphson, le pasamos la funcin f y su derivada f_prima, la aproximacin inicial x0 y la
tolerancia ERROR.
Consideremos la funcin f(x)=x-cos(x), cuya derivada es f'(x)=1+sin(x). En la ventana de comandos escribimos
>> f unc=@( x) x- cos( x) ;
>> f unc_pr i ma=@( x) 1+si n( x) ;
>> newt on_r aphson( f unc, f unc_pr i ma, 0. 5, 0. 0001)
ans = 0. 7391
Si no conocemos la derivada de la funcin podemos calcularla aplicando la definicin de derivada
Podemos tomar un valor estimativo de =10
-6
o cambiarlo dependiendo del problema. La frmula de Newton-
Raphson se convierte en
f unct i on x=newt on_r aphson_1( f , x0, ERROR)
DELTA=1. 0e- 6;
whi l e( 1)
x=x0- DELTA*f ( x0) / ( f ( x0+DELTA) - f ( x0) ) ;
i f abs( ( x- x0) / x) <ERROR
br eak
end
x0=x;
end
end
A la funcin newton_raphson_1, le pasamos la funcin f, la aproximacin inicial x0 y la tolerancia ERROR.
Consideremos la funcin f(x)=x-cos(x), en la ventana de comandos escribimos
>> f unc=@( x) x- cos( x) ;
>> newt on_r aphson_1( f unc, 0. 5, 0. 0001)
ans = 0. 7391
f'(x) =lim
0
f(x +) f(x)

= x
n+1
x
n
f( ) x
n
f( +) f( ) x
n
x
n
Races de una ecuacin (II)
Mtodo del punto medio
El mtodo del punto medio es uno de los mtodos ms sencillos de comprender y es muy conveniente para dar
rpidamente con la raz de la ecuacin dada, sin embargo, el nmero de clculos aumenta sustancialmente a
medida que se desea mayor exactitud.
Este procedimiento se basa en el teorema de Bolzano que dice que si tenemos una funcin y=f(x), de variable
real y continua en el intervalo [a, b], y el signo de la funcin en el extremo a es distinto al signo de la funcin en
el extremo b del intervalo, existe al menos un valor c dentro de dicho intervalo tal que f(c)=0, c es por tanto, la
raz buscada, vase la figura.
Supongamos una ecuacin
f(x)=0
Para hallar la raz de la funcin en el intervalo (a, b), se divide el intervalo en la mitad.
m=(a+b)/2
Pueden ocurrir uno de estos tres casos:
Si f(m)=0 entonces m es la raz buscada
Si f(a) y f(m) tienen signos contrarios, como en la figura, la raz buscada est en el intervalo (a, m).
Si no se cumple la condicin anterior, f(b) y f(m) tendran signos contrarios y la raz estara en el intervalo (m,
b).
El nuevo intervalo reducido se divide por la mitad y se procede de igual forma. Finalmente, en una cierta etapa
del proceso tendremos bien la raz exacta de la funcin f(x), o una secuencia de intervalos cada vez ms
reducidos [a
1
,b
1
], [a
2
,b
2
], .... [a
i
, b
i
]... tal que
Como los puntos extremos de la izquierda a
1
, a
2
, ... a
n
, ...forman una sucesin creciente y acotada, y los de la
derecha b
1
, b
2
, ... b
n
, ... una sucesin acotada decreciente, existe un lmite comn que es la raz buscada.
Si queremos conocer el valor de la raz con un error menor que , tenemos que realizar un nmero n de
iteracciones tal que
Las condiciones de terminacin del proceso
f( )f( ) < 0 = (b a) a
n
b
n
b
n
a
n
1
2
n
= = lim
n
a
n
lim
n
b
n
n > ln( )
1
ln2
b a

El ordenador trabaja con nmeros de precisin limitada, por lo que tendremos que poner un criterio que
establezca cuando la funcin f(x) se considera nula. Diremos que f(x) es nula cuando el valor absoluto de f(x) sea
menor que una cantidad pequea pero no nula
1
.
En segundo lugar, no podemos programar un proceso indefinido, es preciso, que la rutina repetitiva acabe en un
momento dado. El criterio empleado es el siguiente
Siendo
2
cierta cantidad prefijada. La raz se encuentra en el intervalo (a
n
, b
n
) y m es el punto medio de dicho
intervalo.
El tercer criterio de terminacin establece, que el proceso de bsqueda de la raz se interrumpir despus de un
nmero prefijado de iteraciones, notificndose al usuario que no se ha encontrado la raz de la funcin con las
condiciones fijadas anteriormente.
Para poder codificar este procedimiento hemos de seguir los pasos siguientes
1. Partimos de un intervalo (a, b) en el que la funcin f(x) cambia de signo
2. Se calcula m, abscisa mitad del intervalo mediante m=(a+b)/2
3. Se verifican las condiciones de terminacin
4. Si f(a) y f(m) tienen signos contrarios, como se ve en la figura, la raz est en el intervalo (a,
m), entonces b toma el valor de m.
5. Si la condicin anterior no es cierta, la raz se encuentra en el intervalo (m, b), por lo que a tomar el valor de m.
6. Se repite el proceso hasta que se cumple una u otra condicin de terminacin
function m=punto_medio(f, a, b, MAXITER)
CERO=1e-10;
ERROR=0.001;
for i=1:MAXITER
m=(a+b)/2;
ym=f(m);
if abs(ym)<CERO
break
elseif abs((a-b)/m)<ERROR
break
elseif (f(a)*ym)<0
b=m;
else
a=m;
end
end
if(i==MAXITER)
error('no se ha encontrado la raiz')
end
end
Resolver la ecuacin trascendente f(x)=cos(x)-x=0, aplicando el procedimiento del punto medio.
En la grfica, se representa y=cos(x)-x, tiene un cero y=0, para x comprendido entre 0.7 y 0.8
Definimos la funcin f para calcular la raz de la ecuacin trascendente y buscamos la raz en el intervalo (0.5,1)
haciendo 10 iteracciones. Vamos a la ventana de comandos
|f(x)| <
1
<
|
|
|
a
n
b
n
m
|
|
|
2
>> func=@(x) cos(x)-x;
>> punto_medio(func,0.5,1,10)
??? Error using ==> punto_medio at 18
Nos da un mensaje de error bien por que hemos puesto pocas iteracciones MAXITER, o por que no acotamos
suficientemente el intervalo (a,b).
>> punto_medio(func,0.7,0.8,10)
ans = 0.7393
Mtodo de la secante
Este mtodo comienza con dos puntos (x
0
, f(x
0
)) y (x
1
, f(x
1
)), tales que los signos de f(x
0
) y f(x
1
) son opuestos, es
decir, f(x
0
) f(x
1
)<0
Se dibuja una lnea recta entre los dos puntos cuya ecuacin es
El valor de x=x
2
para el cual y se aproxima a la raz buscada es
En la siguiente iteraccin, tomamos un intervalo ms pequeo comprendido entre x
2
y x
1
que es donde se
encuentra la raz. Por lo que hacemos x
0
=x
2
y volvemos a calcular un nuevo valor x
2
cada vez ms prximo a la
raz buscada.
Definimos un nuevo procedimiento denominado secante, similar al del punto_medio, se pasa la funcin f, el
intervalo en el que se encuentra la raz (x
0
, x
1
) y el nmero de iteracciones MAXITER. El procedimiento
termina, cuando se encuentra la raz dentro de una determinada tolerancia
donde m=(a
n
+b
n
)/2 es el punto medio del intervalo (a
n
, b
n
) cada vez ms pequeo.
O bien, cuando se han completado el bucle, sin que se haya encontrado la raz emitiendo un mensaje de error.
function x2=secante(f,x0,x1,MAXITER)
ERROR=0.0001;
for i=1:MAXITER
f0=f(x0);
f1=f(x1);
x2=x0-f0*(x1-x0)/(f1-f0);
if (abs(2*(x2-x1)/(x2+x1))<ERROR | abs(2*(x2-x0)/(x2+x0))<ERROR)
break;
end
if f(x2)*f0<0
x1=x2;
else
x0=x2;
end
end
if(i==MAXITER)
error('no se ha encontrado la raiz')
end
end
A la funcin secante, le pasamos la funcin f, el intervalo en el que se encuentra la raz (x
0
, x
1
) y el nmero de
iteracciones MAXITER
Consideremos la funcin f(x)=cos(x)-x, en la ventana de comandos escribimos
=
y f( ) x
0
f( ) f( ) x
1
x
0
x x
0
x
1
x
0
= f( ) x
2
x
0
x
0
x
1
x
0
f( ) f( ) x
1
x
0
<
|
|
|
a
n
b
n
m
|
|
|
2
>> func=@(x) cos(x)-x;
>> secante(func,0.5,1,10)
ans = 0.7391
Races mltiples
La representacin grfica de la funcin en una pantalla de alta resolucin nos permitir estimar los intervalos en
los que la funcin cambia de signo y aplicar en consecuencia, el procedimiento mitad a cada intervalo. Si no es
posible una representacin grfica o esta no es de la suficiente resolucin, ser preciso explorar el eje X en busca
de intervalos en los que la funcin cambia de signo. Cuando los encontremos aplicaremos a cada uno de ellos el
procedimiento del punto medio.
Esta exploracin no es sencilla, ya que podemos encontrarnos con intervalos en que la funcin no cambia de
signo ya sea por que no tiene races, o por que tiene un nmero par, tal como se ve en las figuras. La solucin a
este problema es hacer ms pequeo el intervalo de exploracin, esto implica ms tiempo de clculo y no
garantiza que las races puedan ser encontradas si algunas de ellas estn muy juntas, o la curva es tangente al eje
X.
Las situaciones en las que nos podemos encontrar cuando buscamos las races de una funcin y=f(x) en un
intervalo (a,b) se muestran en la figura
f(a) y f(b) tienen el mismo signo, no hay raz de la funcin en dicho intervalo, pero tambin puede ocurrir que
haya un nmero par de races en dicho intervalo.
f(a) y f(b) tienen distinto signo, hay una raz de la funcin en dicho intervalo, pero tambin puede ocurrir que
haya un nmero impar de races en dicho intervalo.
Vamos a crear un procedimiento que nos permita buscar los intervalos en los que la funcin cambia de signo y
calcular la raz en cada uno de ellos, definiendo una funcin denominada buscar_intervalos.
Se divide el intervalo (a,b) en n-1 intervalos igualmente espaciados (n divisiones incluidos los extremos) se
calcula si en los extremos de los cada uno de los pequeos intervalos la funcin cambia de signo, en caso
afirmativo se guardan los extremos (x
j
, y
j
) de dicho intervalo en una matriz xb. Si la matriz est vaca (no tiene
ningn elemento) isempty, un mensaje nos lo indica. La funcin devuelve los intervalos (x
j
, y
j
) guardados en la
matriz xb.
function xb = buscar_intervalos(f,a,b,n)
x = linspace(a,b,n);
j = 0;
for i = 1:length(x)-1
if sign(f(x(i))) ~= sign(f(x(i+1)))
j = j + 1;
xb(j,1) = x(i);
xb(j,2) = x(i+1);
end
end
if isempty(xb)
disp('no se han encontrado cambios de signo')
else
disp(['nmero de intervalos:' int2str(j)])
end
end
Este cdigo es correcto, pero se puede hacer ms eficiente, un asunto de vital importancia en el clculo intensivo.
Nos daremos cuenta, que se calcula dos veces la funcin f para el mismo valor de x, en el final de un intervalo y
en el comienzo del siguiente, ahorraremos el tiempo que tarda al procesador en realizar estas operaciones si
guardamos el valor de f(x) calculado al final del intervalo previo en la variable local y2 y lo asignamos a la
variable y1, que guarda el valor de la funcin f(x) en el principio del intervalo siguiente.
function xb = buscar_intervalos(f,a,b,n)
x = linspace(a,b,n);
j = 0;
y1=f(x(1));
for i = 1:length(x)-1
y2=f(x(i+1));
if sign(y1) ~= sign(y2)
j = j + 1;
xb(j,1) = x(i);
xb(j,2) = x(i+1);
end
y1=y2;
end
if isempty(xb)
disp('no se han encontrado cambios de signo')
else
disp(['nmero de intervalos:' int2str(j)])
end
end
Difraccin Fraunhofer producida por una abertura circular
http://www.sc.ehu.es/sbweb/fisica_/ondas/interfer/difraccion1/difraccion1_1.html
En la figura vemos el mximo principal de difraccin en el origen, los mximos secundarios y los mnimos o
ceros de intensidad debida a la difraccin por una abertura circular. La intensidad en una direccin producida
por una abertura circular de raio a es
Los mnimos de intensidad son los ceros de la funcin de Bessel J
1
(x) cuya representacin grfica vemos en la
figura
I = x = sin I
0
( )
2 (x) J
1
x
2
2a

Si exploramos el intervalo comprendido entre a=0 y b=30, tomando 6 intervalos, de anchura x=5 tal como
vemos en la figura, la funcin cambia de signo en los intervalos (0,5), (5,10) y (20,25), pero no cambia de signo
en los intervalos (10,15), (15,20) y (25,30) por tener un nmero par de races. Luego, si exploramos la funcin
J
1
(x) en el intervalo (0,30) tomando 6 intervalos de anchura x=5 encontraremos solamente tres races de las
nueve existentes.
Nota: omitimos el origen x=0, por que se produce un mximo (no un mnimo de intensidad)
Escribimos el script denominado circular_difraccion para calcular las races de la ecuacin trascendente J
1
(x)=0
La funcin buscar_intervalos, busca los intervalos en los que la funcin J
1
(x) cambia de signo, el intervalo en el
que se explora la funcin es (0.1, 30), omitimos el origen, y el nmero de divisiones del intervalo es 50,
incluyendo los extremos. La funcin devuelve la matriz xb, que guarda los extremos (x
j
, y
j
) de cada intervalo en
los que la funcin cambia de signo. La dimensin de la martriz xb nos la proporciona la funcin size y se guarda
en el vector nb de dos elementos [filas columnas]. El nmero de columnas nb(2) de la matriz es dos y el nmero
de filas nb(1) es el nmero de intervalos.
Para cada intervalo en el que la funcin cambia de signo, se aplica el procedimiento del punto medio, llamando a
la funcin punto_medio, para buscar la raz en dicho intervalo.
Escribimos un script que realiza las siguientes tareas:
1. Define una funcin annima besselj(1,x)
2. Utiliza la funcin buscar_intervalos para encontrar los intervalos en los que la funcin cambia de signo.
Explorando el intervalo que va de a=0.1 y b=30. Se omite la primera raz x=0 por que corresponde al mximo
principal
3. Calcula e imprime las races empleando el procedimiento del punto medio, llamando a la funcin punto_medio.
J1=@(x) besselj(1,x);
xb=buscar_intervalos(J1,0.1,30,50);
nb=size(xb);
disp('mnimos: difraccin por abertura circular')
for i=1:nb(1)
min(i)=punto_medio(J1,xb(i,1),xb(i,2),50);
disp(min(i))
end
En la ventana de comandos corremos el script circular_difraccion para resolver la ecuacin trascendente J
1
(x)=0
en el intervalo (0.1,30)
>> circular_difraccion
mnimos: difraccin por abertura circular
3.8315
7.0149
10.1731
13.3195
16.4659
19.6170
22.7634
25.9097
29.0561
Difraccin Fraunhofer producida por una rendija
http://www.sc.ehu.es/sbweb/fisica_/ondas/interfer/difraccion/difraccion.html
El mximo principal ocurre en el origen x=0, y los mximos secundarios son las races de la ecuacin
trascendente
tan(x)-x=0
( ) = 1 lim
x0
(x) J
1
x
En la figura se representan la recta y=x (color azul) y la funcin y=tan(x) (color rojo). Se ha hecho ms pequea la
escala vertical que la horizontal.
Como observamos en la grfica los mximos secundarios ocurren aproximadamente para x
n
(2n+1)/2 donde n=
1, 2, 3...
Escribimos el script rendija_difraccion que realiza las siguientes tareas:
1. Define una funcin annima tan(x)-x
2. Utiliza la funcin buscar_intervalos para encontrar los intervalos en los que la funcin cambia de signo.
Explorando el intervalo que va de a=0.1 y b=7/2. Se omite la primera raz x=0 por que corresponde al mximo
principal
3. Calcula e imprime las races empleando el procedimiento del punto medio, llamando a la funcin punto_medio.
f=@(x) tan(x)-x;
xb=buscar_intervalos(f,0.1,7*pi/2,10);
nb=size(xb);
disp('mximos secundarios: difraccin por una rendija')
for i=1:nb(1)
max(i)=punto_medio(f,xb(i,1),xb(i,2),50);
disp(max(i))
end
En la ventana de comandos corremos el script rendija_difraccion
>> rendija_difraccion
mximos secundarios: difraccin por una rendija
1.5710
4.4933
4.7122
10.9018
Como hemos visto en la figura (ms arriba), la primera raz es prxima a 3/2=4.7124, la segunda, es prxima
5/2=7.8540 y la tercera es prxima a 7/2=10.9956. El resultado que hemos obtenido difiere notablemente. No
parece adecuado el procedimiento del punto medio para calcular las races de la ecuacin tan(x)-x=0. El
problema radica, como se v en la figura, en que la tangente se hace muy grande en valores prximos a
x
n
(2n+1)/2.
Cambiamos la ecuacin tan(x)-x=0 por su equivalente x cos(x)-sin(x)=0. Representamos la funcin
y=x cos(x)-sin(x)
Escribimos el siguiente script denominado rendija_difraccion
f=@(x) x*cos(x)-sin(x);
xb=buscar_intervalos(f,0.1,7*pi/2,50);
nb=size(xb);
disp('mximos: difraccin por una rendija')
for i=1:nb(1)
r(i)=punto_medio(f,xb(i,1),xb(i,2),50);
disp(max(i))
end
En la ventana de comandos
>> rendija_difraccion
mximos: difraccin por una rendija
4.4933
7.7262
10.9018
Comparamos las races obtenidas con la representacin grfica y vemos que hemos obtenido un resultado mejor.
Un procedimiento numrico no siempre es adecuado para resolver un problema particular.
Funciones MATLAB para calcular las races
de una ecuacin
En esta pgina, vamos calcular la races de un polinomio mediante la funcin roots. Un estudio ms detallado de
los polinomios se encuentra en la pgina titulada "Polinomios y fracciones polinmicas". La raz de una ecuacin
mediante procedimientos grficos, que nos va a servir para estimar un valor prximo a la raz buscada. Las races
de una ecuacin transcendente mediante fzero y finalmente, las races de un sistema de ecuaciones transcedentes
mediante fsolve.
Races de un polinomio
Para calcular las races de la ecuacin
a
1
x
n
+a
2
x
n-1
+...+a
n
x+a
n+1
=0
se emplea la funcin roots y se le pasa el vector p formado por los coeficientes del polinomio. La funcin roots
devuelve un vector columna que contiene las races.
>> p=[a
1
a
2
... a
n
a
n+1
];
>> x=roots(p)
La funcin roots tiene una funcin inversa poly que se le pasa el vector x que contiene las races y devuelve los
coeficientes del polinomio
p=poly(x)
Sea f(x)= x
5
- 3.5x
4
+ 2.75x
3
+ 2.125x
2
- 3.875x + 1.25
Guardamos los coeficientes del polinomio en el vector fila p=[1 -3.5 2.75 2.125 -3.875 1.25];
Mediante la funcin plolyval, podemos calcular el valor del polinomio cuando proporcionamos el valor de x
>> p=[1 -3.5 2.75 2.125 -3.875 1.25];
>> polyval(p, 1.5) %valor del polinomio cuando se proporciona el valor de x.
ans= -0.6250
>> r=roots(p) %races del polinomio
r =
2.0000
-1.0000
1.0000 + 0.5000i
1.0000 - 0.5000i
0.5000
>> c=poly(r) %reconstruimos el polinomio a partir de las races
Comprobamos que las races calculadas son correctas utilizando la funcin polyval, pasndole los coeficientes del
polinomio p y el valor x
i
de cada una de las races
>> polyval([1 3 3 2], -2)
Como ejercicio se sugiere al lector, hallar las races de las ecuaciones siguientes con la funcin roots y reconstruir
el polinomio con la funcin poly, o calcular el valor del polinomio para cada una de las races con la funcin
polyval
x
3
+ x
2
+ x + 1 = 0
x
5
+x
2
-2x-4=0
x
5
-x
4
+ x
3
+2x
2
-1
Procedimiento grfico
Vamos a estudiar varios procedimientos para calcular la raz de una ecuacin trascedente, por ejemplo, x-
cos(x)=0
En primer lugar, vamos a hacer una representacin grfica de esta funcin para conocer aproximadamente el
punto donde la funcin corta al eje X. Escribimos el script mouse_raiz y lo guardamos un fichero .M
x=0:0.1:pi/2;
y=x-cos(x);
plot(x,y)
grid on
xlabel('x')
ylabel('y')
title('x-cos(x)')
Se selecciona en el men Tools/Data Cursor, o el icono de la barra horizontal de herramientas .
Situamos el cursor en forma de cruz prximo a la raz de la funcin y podemos leer sus coordenadas. Cuanto
mejor sea la resolucin de la grfica ms cerca podremos estar de la raz buscada. La resolucin de la grfica es
el paso x utilizado, para calcular la tabla de valores (x, y) en el intervalo que va desde x
i
hasta x
f
. En este
ejemplo x=0.1
Podemos utilizar la herramienta Zoom In y Pan para acercarnos a este punto y el botn Zoom
Out para alejarnos y volver a la situacin inicial.
En la imagen podemos ver que despus de acercarnos repetidamente al punto de corte con el eje X mediante
Zoom In y la mano Pan, la raz buscada est comprendida entre 0.735 y 0.74.
Races simples
Podemos utilizar el puntero del ratn para buscar los puntos en los que la funcin corta al eje X, aadiendo el
comando ginput al final del script mouse_raiz
x=0:0.1:pi/2;
y=x-cos(x);
plot(x,y)
grid on
xlabel('x')
ylabel('y')
title('x-cos(x)')
[xRaiz,yRaiz] = ginput
En la ventana de comandos corremos el script mouse_raiz. La raz buscada se seala mediante el cursor en forma
de cruz de color negro. Se pulsa el botn izquierdo del ratn y luego la tecla Retorno.
>> mouse_raiz
xRaiz = 0.7379
yRaiz = -0.0022
Races mltiples
Si la funcin tiene ms de una raz, se seala cada uno de los puntos de interseccin de la funcin con el eje X
con el puntero del ratn y se pulsa el botn izquierdo del ratn. Finalmente, se pulsa Retorno y aparecen las
abscisas en el vector xRaiz y las ordenadas en el vector yRaiz de dichos puntos.
Nos aproximaremos a las races que ya conocemos de una funcin para ilustrar este interesante procedimiento
grfico
Guardamos el script mouse_raiz mediante File/Save As.. con el nombre mouse_raiz_1. Modificamos el script
para representar la funcin coseno con el eje horizontal en grados y lo guardamos mediante File/Save o pulsando
el icono correspondiente.
Las dos races de cos(x)=0 en el intervalo (0,360) son 90 y 270.
x=0:1:360;
y=cosd(x);
plot(x,y)
grid on
xlabel('x')
ylabel('y')
title('cos(x)')
[xRaiz,yRaiz] = ginput
En la ventana de comandos corremos el script mouse_raiz_1. En la ventana grfica, pulsamos dos veces el botn
izquierdo del ratn:
1. cuando el puntero est situado aproximadamente en el punto de coordendas (90,0), pulsamos el botn izquierdo
del ratn
2. cuando el puntero est situado en el punto (270,0), pulsamos el botn izquierdo del ratn
3. pulsamos Retorno,
y obtenemos lo siguiente:
>> mouse_raiz_1
xRaiz = 89.8618 270.5069
yRaiz = -0.0088 -0.0029
El procedimiento grfico nos da una estimacin de las races (puntos de interseccin en la representacin grfica
de la funcin con el eje X) de una ecuacin trascendente en un intervalo (a,b) dado.
La funcin MATLAB fzero
La funcin fzero puede encontrar la raz de una ecuacin trascendente f(x)=0. Su sintaxis es
fzero(funcion,x0)
Donde funcion es el nombre de la funcin cuyas races queremos determinar y x0 es el intervalo [a b] donde la
funcin cambia de signo, es decir, el signo de f(a) es distinto al signo de f(b). x0 puede ser tambin un valor
cercano a la raz es decir, una primera aproximacin. Podemos definir una funcin annima y guardarla en el
manejador func.Le pasamos la funcin annima func a fzero.
En la ventana de comandos, definimos la funcin y buscamos un intervalo [0.4 1] donde la funcin cambia de
signo. Alternativamente, probamos una primara aproximacin a la raz buscada x0=0.6
>> func=@(x) cos(x)-x;
>> func(0.4)
ans =
0.5211
>> func(1)
ans =
-0.4597
>> r=fzero(func,[0.4 1]) %intervalo donde se encuentra la raz
r= 0.7391
>> fzero(func,0.6) %aproximacin inicial a la raz
ans =
0.7391
Podemos definir explcitamente la funcin func y guardarla en el fichero func.m
function y=func(x)
y=cos(x)-x;
end
Llamamos a fzero anteponiendo al nombre de la funcin el smbolo @ (vase al final de la pgina Funciones)
>> fzero(@func,0.6)
ans= 0.7391
A veces la funcin func definida y guardada en un fichero .M precisa de los valores de ciertos parmetros a, b
function y=func(x,a,b)
%cdigo de la funcin
end
A fzero solamente le podemos pasar el manejador (handle) de la funcin de variable x. La forma en que la
funcin func conoce el valor de sus parmetros a y b es crear una funcin annima f1 en trminos de func y se le
pasamos su manejador a la funcin fzero
f1=@(x)func(x,a,b);
p=fzero(f1,x0);
En el ejercicio "La ecuacin de van der Waals" utilizaremos esta opcin.
Funciones implcitas
La siguiente funcin se estudia en la asignatura Energa Solar Fotovoltaica (tercer curso).
y = 3 5 (exp( ) 1) 10
12
x + 0.01y
0.025
x + 0.01y
1000
Donde x representa la diferencia de potencial e y la intensidad de la corriente elctrica.
Representamos la funcin f(x,y) el intervalo [0,0.7] en el eje X y en el intervalo [0,3.1] en el eje Y. Utilizamos la
funcin MATLAB contour que habitualmente se emplea para dibujar curvas de nivel.
xx=linspace(0,0.7,50);
yy=linspace(0,3.1,100);
[x,y] = meshgrid(xx,yy);
f=3-5e-12*(exp((x+y*0.01)/0.025)-1)-(x+y*0.01)/1000-y;
contour(x,y,f,[0,0],'r');
xlabel('d.d.p. V');
ylabel('Intensidad');
title('Fotovoltaica')
grid on
Una representacin grfica similar la obtenemos con la funcin ezplot
Vamos a estudiar con ms detalle esta funcin.
En primer lugar, sabemos que para el valor de x prximo a 0.6 V (diferencia de potencial) la intensidad y vale
cero. Empleamos la funcin MATLAB fzero para obtener un valor ms preciso.
f=@(x,y) 3-5e-12*(exp((x+y*0.01)/0.025)-1)-(x+y*0.01)/1000-y;
g=@(x) f(x,0);
Vmax=fzero(g,0.6);
fprintf('Valor mximo de la d.d.p. %1.4f\n',Vmax)
En la ventana de comandos vemos este valor
Valor mximo de la d.d.p. 0.6780
Dado un valor de la diferencia de potencial x en el intervalo [0,0.678], queremos obtener el correspondiente valor
de la intensidad de la corriente y. Suministramos a fzero un valor prximo a la raz buscada, por ejemplo, 3.
Aadimos las siguientes lneas de cdigo al script.
....
x=0.6;
g=@(y) f(x,y);
y=fzero(g,3);
fprintf('Para una d.d.p. de %1.4f le corresponde una intensidad de %1.4f\n',x, y)
En la ventana de comandos vemos este valor
Para una d.d.p. de 0.6000 le corresponde una intensidad de 2.6214
Dado un vector de valores de la diferencia de potencial x el intervalo [0,0.678], queremos obtener el
correspondiente vector de intensidades y. Finalmente, con estos dos vectores (x,y) dibujaremos la curva
diferencia de potencial - intensidad mediante el comando plot. El script completo es el siguiente
f=@(x,y) 3-5e-12*(exp((x+y*0.01)/0.025)-1)-(x+y*0.01)/1000-y;
g=@(x) f(x,0);
Vmax=fzero(g,0.6); %intervalo de valores de la d.d.p. [0,Vmax]
x=linspace(0,Vmax,100);
n=length(x);
opt=optimset('display','off'); %evita que fzero emita mensajes de aviso
y=zeros(size(x));
for i=1:n
y(i)=fzero(@(y) f(x(i),y),3,opt);
end
plot(x,y,'r')
ylim([0 3.1])
xlabel('d.d.p. V')
ylabel('Intensidad')
title('Fotovoltaica')
Obtenemos una representacin grfica similar a la obtenida empleando la funcin MATLAB contour.
Sistemas de ecuaciones no lineales
Calcular las races del sistema de dos ecuaciones:
f
1
(x,y)=2x
2
-xy-5x-1=0
f
2
(x,y)=x+3log
10
x-y
2
=0
En la figura vemos el punto de interseccin y mediante Tools/Data Cursor sus coordendas aproximadas..
x=linspace(2.5,5.5,50);
y1=(2*x.^2-5*x-1)./x;
y2=sqrt(x+3*log10(x));
plot(x,y1,'b',x,y2,'r')
Vamos a utilizar la funcin fsolve de MATLAB para obtener el punto de interseccin.
En primer lugar, tenemos que definir la funcin denominada sis_ecuaciones y guardarla en el correspondiente
fichero . M. A esta funcin le tenemos que pasar los valores de x e y en el vector xn, y nos devuelve los valores
de las funciones f
1
(x,y) y f
2
(x,y) en el vector s.
function s=sis_ecuaciones(xn)
x=xn(1);
y=xn(2);
s=[2*x^2-x*y-5*x-1, x*3*log10(x)-y^2];
end
Creamos el script sis_ecuaciones_script para llamar al procedimiento numrico implementado en la funcin
fsolve de MATLAB.
x0 =[3 2]; %valor inicial
[x,fval] = fsolve(@sis_ecuaciones,x0);
fprintf('La solucin es x=%1.3f, y=%1.3f\n',x(1),x(2));
fprintf('Valores de la funcin = %g\n',fval)
A fsolve tenemos que pasarle la funcin que hemos definido, sis_ecuaciones y la aproximaxin inicial (x
0
, y
0
)
que hemos encontrado anteriormente de forma grfica. Esta funcin nos devuelve las coordenadas (x,y) del punto
de interseccin buscado y los valores de las funciones f
1
(x,y) y f
2
(x,y) en dicho punto.
En la ventana de comandos corremos el script sis_ecuaciones_script
>> sis_ecuaciones_script
La solucin es x=3.958, y=2.664
Valores de la funcin = -1.33692e-010
Valores de la funcin = -3.07305e-009
Sistema de ecuaciones lineales. Mtodo de
Gauss
La tcnica ms comn para resolver el sistema de ecuaciones lineales es la de hacer uso de un procedimiento para
la eliminacin sucesiva de las incgnitas denominado mtodo de Gauss. Describiremos la aplicacin de este
mtodo para un sistema de cuatro ecuaciones con cuatro incgnitas y posteriormente, la generalizaremos para un
sistema de n ecuaciones.
Sistema de cuatro ecuaciones con cuatro incgnitas
(2)
Despejamos x
1
de la primera ecuacin
y la sustituimos en las restantes, quedando el sistema de tres ecuaciones con tres incgnitas
con
Despejamos, ahora, x
2
de la primera ecuacin
y las sustituimos en las dos restantes, quedando un sistema de dos ecuaciones con dos incgnitas.
con
Despejamos ahora, x
3
de la primera ecuacin
y la sustituimos en la ecuacin restante,
con
+ + + = a
11
x
1
a
12
x
2
a
13
x
3
a
14
x
4
b
1
+ + + = a
21
x
1
a
22
x
2
a
23
x
3
a
24
x
4
b
2
+ + + = a
31
x
1
a
32
x
2
a
33
x
3
a
34
x
4
b
3
+ + + = a
41
x
1
a
42
x
2
a
43
x
3
a
44
x
4
b
4
= x
1
b
1
a
11
a
12
a
11
x
2
a
13
a
11
x
3
a
14
a
11
x
4
+ + = a
1
22
x
2
a
1
23
x
3
a
1
24
x
4
b
1
2
+ + = a
1
32
x
2
a
1
33
x
3
a
1
34
x
4
b
1
3
+ + = a
2
42
x
1
a
1
43
x
3
a
1
44
x
4
b
1
4
= = (i, j2,3,4) a
1
ij
a
ij
a
i1
a
1j
a
11
b
1
i
b
i
a
i1
b
1
a
11
= x
2
b
1
2
a
1
22
a
1
23
a
1
22
x
3
a
1
24
a
1
22
x
4
+ = a
2
33
x
3
a
2
34
x
4
b
2
3
+ = a
2
43
x
3
a
2
44
x
4
b
2
4
= = (i, j3,4) a
2
ij
a
1
ij
a
1
i2
a
1
2j
a
1
22
b
2
i
b
1
i
a
1
i2
b
1
2
a
1
22
= x
3
b
2
3
a
2
33
a
2
34
a
2
33
x
4
= a
3
44
x
4
b
3
4
2 2
2 2
Por tanto, el proceso de resolver un sistema lineal de ecuaciones por el mtodo de Gauss se reduce a la
construccin de un sistema equivalente que tenga una matriz triangular.
Ahora vamos obteniendo las incgnitas empezando por la ltima ecuacin y terminando en la primera.
Sistema de n ecuaciones con n incgnitas
Sea un sistema de n ecuaciones con n incgnitas
que convertimos en el sistema equivalente
donde
Obtenemos las incgnitas x
n
a x
1
function x=gauss_ecuacion(A,b)
Ab=[A b];
n=length(b);
%matriz triangular
for k=1:n-1
for i=k+1:n
= = (i, j4) a
3
ij
a
2
ij
a
i3
a
3j
a
2
33
b
3
i
b
2
i
a
i3
b
3
a
2
33
+ + + = a
11
x
1
a
12
x
2
a
13
x
3
a
14
x
4
b
1
+ + = a
1
22
x
2
a
1
23
x
3
a
1
24
x
4
b
1
2
+ = a
2
33
x
3
a
2
34
x
4
b
2
3
= a
3
44
x
4
b
3
4
= x
4
b
3
4
a
3
44
= x
3
b
2
3
a
2
34
x
4
a
2
33
= x
2
b
1
2
a
1
23
x
3
a
1
24
x
4
a
1
22
= x
1
b
1
a
12
x
2
a
13
x
3
a
14
x
4
a
11
?
?
?
?
?
?
?
?
?
?
?
+ + + ... + = a
11
x
1
a
12
x
2
a
13
x
3
a
1n
x
n
b
1
+ + + ... + = a
21
x
1
a
22
x
2
a
23
x
3
a
2n
x
n
b
2
....
+ + + ... + = a
n1
x
1
a
n2
x
2
a
n3
x
3
a
nn
x
n
b
n
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
+ + + ... + = a
11
x
1
a
12
x
2
a
13
x
3
a
1n
x
n
b
1
+ + ... + = a
1
22
x
2
a
1
23
x
3
a
1
2n
x
n
b
1
2
+ ... + = a
2
33
x
3
a
2
3n
x
n
b
2
3
....
+ = a
n2
n1n1
x
n1
a
n2
n1n
x
n
b
n2
n1
= a
n1
nn
x
n
b
n1
n
= = i, j = 2...n a
1
ij
a
ij
a
i1
a
11
a
1j
b
1
i
b
i
a
i1
a
11
b
1
= = i, j = 3...n a
2
ij
a
1
ij
a
1
i2
a
1
22
a
1
2j
b
2
i
b
1
i
a
1
i2
a
1
22
b
1
2
= = i, j = k...n a
k
ij
a
k1
ij
a
k1
ik
a
k1
kk
a
k1
kj
b
k
i
b
k1
i
a
k1
ik
a
k1
kk
b
k1
k
k = 1,2...n 1
= = i = n 1,n 2,...2,1 x
n
b
n1
n
a
n1
nn
x
i
b
i1
i

i+1
n
a
i1
ij
x
i1
j
a
i1
ii
factor=Ab(i,k)/Ab(k,k);
for j=k:n+1
Ab(i,j)=Ab(i,j)-factor*Ab(k,j);
end
end
end
%incgnitas
x=zeros(n,1);
x(n)=Ab(n,n+1)/Ab(n,n);
for i=n-1:-1:1
x(i)=Ab(i,n+1)/Ab(i,i);
for j=i+1:n
x(i)=x(i)-Ab(i,j)*x(j)/Ab(i,i);
end
end
end
Podemos abreviar el cdigo suprimiendo el bucle de ndice j y sustituyndolo por el operador :
function x=gauss_ecuacion(A,b)
Ab=[A b];
n=length(b);
%matriz triangular
for k=1:n-1
for i=k+1:n
factor=Ab(i,k)/Ab(k,k);
Ab(i,k:n+1)=Ab(i,k:n+1)-factor*Ab(k,k:n+1);
end
end
%incgnitas
x=zeros(n,1);
x(n)=Ab(n,n+1)/Ab(n,n);
for i=n-1:-1:1
x(i)=Ab(i,n+1)/Ab(i,i)-Ab(i,i+1:n)*x(i+1:n)/Ab(i,i);
end
end
Probamos la funcin gauss_ecuacion con los sistemas de ecuaciones
>> A=[1,2,3;2,2,3;1,4,4];
>> b=[6;7;9];
>> gauss_ecuacion(A,b)
ans =
1
1
1
>> A=[1,1,1;2,1,3;3,1,6];
>> b=[4;7;2];
>> gauss_ecuacion(A,b)
ans =
19
-7
-8
Mejora del procedimiento de Gauss
Sea el sistema de ecuaciones
El procedimiento de Gauss no se puede aplicar si a
11
es nulo. La solucin a este problema es intercambiar filas
hasta conseguir que a
11
0. A este elemento a
11
que aparece como denominador se le denomina elemento pivote.
Si despus de la primera iteracin
?
?
?
?
?
+ 2 + 3 = 6 x
1
x
2
x
3
2 + 2 + 3 = 7 x
1
x
2
x
3
+ 4 + 4 = 9 x
1
x
2
x
3
?
?
?
?
?
+ + = 4 x
1
x
2
x
3
2 + + 3 = 7 x
1
x
2
x
3
3 + + 6 = 2 x
1
x
2
x
3
?
?
?
?
?
?
?
?
?
?
?
+ + + ... + = a
11
x
1
a
12
x
2
a
13
x
3
a
1n
x
n
b
1
+ + + ... + = a
21
x
1
a
22
x
2
a
23
x
3
a
2n
x
n
b
2
....
+ + + ... + = a
n1
x
1
a
n2
x
2
a
n3
x
3
a
nn
x
n
b
n
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
+ + + ... + = a
11
x
1
a
12
x
2
a
13
x
3
a
1n
x
n
b
1
+ + ... + = a
1
22
x
2
a
1
23
x
3
a
1
2n
x
n
b
1
2
+ + ... + = a
1
32
x
2
a
1
33
x
3
a
1
3n
x
n
b
1
3
....
+ + ... + = a
1
x
2
a
1
x
3
a
1
nn
x
n
b
1
el primer elemento de la segunda fila (pivote) es nulo hay que intercambiar filas entre las n-1 ecuaciones restantes
para que este elemento sea distinto de cero.
Para mejorar la estabilidad del mtodo de Gauss en cada una de las interacciones se intercambian filas para
conseguir que el elemento pivote sea el elemento mayor (en valor absoluto) de cada una de las columnas, es
decir que los elementos:
sean lo ms grandes (en valor absoluto).
Creamos el siguiente script para ver el proceso de intercambio de filas y de reduccin de la matriz A a una matriz
triangular.
A=[0,4,-2,-2;1,2,4,-3;-3,-3,8,-2;-1,1,6,-3];
b=[-4;5;7;7];
Ab=[A b]
n=length(b);
for k=1:n-1
[mayor,j]=max(abs(Ab(k:n,k)));
fila=j+k-1;
if fila~=k
fprintf('intercambio fila %i por fila %i\n',k,fila);
Ab([k,fila],:)=Ab([fila,k],:);%intercambio de filas
Ab %muestra la matriz
end
%convierte en matriz triangular
for i=k+1:n
factor=Ab(i,k)/Ab(k,k);
Ab(i,k:n+1)=Ab(i,k:n+1)-factor*Ab(k,k:n+1);
end
Ab %muestra la matriz
end
En la ventana de comandos vemos lo siguiente:
%matriz ampliada Ab
%El elemento pivote Ab(1,1) es cero
Ab =
0 4.00 -2.00 -2.00 -4.00
1.00 2.00 4.00 -3.00 5.00
-3.00 -3.00 8.00 -2.00 7.00
-1.00 1.00 6.00 -3.00 7.00
intercambio fila 1 por fila 3
Ab =
-3.00 -3.00 8.00 -2.00 7.00
1.00 2.00 4.00 -3.00 5.00
0 4.00 -2.00 -2.00 -4.00
-1.00 1.00 6.00 -3.00 7.00
%se hacen ceros los elementos de la primera columna de las filas 2,3,4
Ab =
-3.00 -3.00 8.00 -2.00 7.00
0 1.00 6.67 -3.67 7.33
0 4.00 -2.00 -2.00 -4.00
0 2.00 3.33 -2.33 4.67
%se examinan los valores de los elementos de la segunda columna de las filas 2,3,4
intercambio fila 2 por fila 3
Ab =
-3.00 -3.00 8.00 -2.00 7.00
0 4.00 -2.00 -2.00 -4.00
0 1.00 6.67 -3.67 7.33
n2 n3 n
0 a
1
22
, , ... k = 1,2,...n 1 a
11
a
1
22
a
2
33
a
k1
kk
?
?
?
?
?
?
?
?
?
?
?
0 + 4 2 2 = 4 x
1
x
2
x
3
x
4
1 + 2 + 4 3 = 5 x
1
x
2
x
3
x
4
3 3 + 8 2 = 7 x
1
x
2
x
3
x
4
1 + 1 + 6 3 = 7 x
1
x
2
x
3
x
4
0 2.00 3.33 -2.33 4.67
%se hacen ceros los elementos de la segunda columna de las filas 3,4
Ab =
-3.00 -3.00 8.00 -2.00 7.00
0 4.00 -2.00 -2.00 -4.00
0 0 7.17 -3.17 8.33
0 0 4.33 -1.33 6.67
%se examinan los valores de los elementos de la tercera columna de las filas 3,4
%no hay intercambio
%se hacen ceros los elementos de la tercera columna de la fila 4
%se completa la matriz triangular
Ab =
-3.00 -3.00 8.00 -2.00 7.00
0 4.00 -2.00 -2.00 -4.00
0 0 7.17 -3.17 8.33
0 0 0 0.58 1.63
Modificamos la funcin gauss_ecuacion para incluir la mejora
function x=gauss_ecuacion(A,b)
Ab=[A b];
n=length(b);
%matriz triangular
for k=1:n-1
[mayor,j]=max(abs(Ab(k:n,k)));
fila=j+k-1;
if fila~=k
Ab([k,fila],:)=Ab([fila,k],:);%intercambio de filas
end
for i=k+1:n
factor=Ab(i,k)/Ab(k,k);
Ab(i,k:n+1)=Ab(i,k:n+1)-factor*Ab(k,k:n+1);
end
end
%incgnitas
x=zeros(n,1);
x(n)=Ab(n,n+1)/Ab(n,n);
for i=n-1:-1:1
x(i)=Ab(i,n+1)/Ab(i,i)-Ab(i,i+1:n)*x(i+1:n)/Ab(i,i);
end
end
Llamamos a la funcin gauss_ecuacion para resolver el sistema de cuatro ecuaciones lineales
>> A=[0,4,-2,-2;1,2,4,-3;-3,-3,8,-2;-1,1,6,-3];
>> b=[-4;5;7;7];
>> gauss_ecuacion(A,b)
ans =
0.6000
1.6000
2.4000
2.8000
Sistemas de ecuaciones lineales
En esta pgina se discute y se resuelve un sistema de ecuaciones lineales
Matriz inversa
Se denomina matriz identidad I a aquella matriz cuadrada de dimensiones mm en la cual los elementos de la
diagonal valen 1 y el resto de los elementos vale cero. MATLAB dispone de la funcin eye(m) para crear una
matriz cuadrada de dimensin m con los elementos de la diagonal principal unos y el resto ceros.
El producto de la matriz identidad I por otra matriz A nos da la matriz A
Si la matriz A es cuadrada, se obtiene el mismo resultado efectuando el producto A*I o I*A
Si A es una matriz cuadrada, B es su matriz inversa si el producto A*B=B*A=I
En MATLAB se puede obtener la matriz inversa de A elevando A a la potencia -1, A
-1
o bien, mediante la
funcin inv(A)
>> A=[-1 0 3; 2 -1 0; 3 1 -2]
A =
-1 0 3
2 -1 0
3 1 -2
>> B=inv(A)
B =
0.1538 0.2308 0.2308
0.3077 -0.5385 0.4615
0.3846 0.0769 0.0769
>> A*B
ans =
1.0000 0 0
-0.0000 1.0000 -0.0000
0 -0.0000 1.0000
Determinante
Un determinante es un nmero asociado a una matriz cuadrada. Para una matriz cuadrada de dimensin 22
El determinante de una matriz mm se desarrolla en trminos de una combinacin de determinates de matrices de
dimensin m-1m-1 y as, sucesivamente, hasta llegar a los determinantes de matrices 22.
En MATLAB la funcin det(A) calcula el determinante de la matriz cuadrada A.
>> A=[-1 0 3; 2 -1 0; 3 1 -2];
>> det(A)
ans = 13
Rango de una matriz
El rango de una matriz es el mximo nmero de filas linealmente independientes. La funcin rank calcula el
rango de una matriz. Sea la matriz A
A = [ ] I =
a
11
a
21
a
12
a
21
a
13
a
23
?
?
?
1
0
0
0
1
0
0
0
1
?
?
?
A * I = [ ]
a
11
a
21
a
12
a
21
a
13
a
23
A = [ ] |A| =
a
11
a
21
a
12
a
22
a
11
a
22
a
12
a
21
>> A=[0 -1 2 1; 1 -1 0 -1; 3 1 2 0; 2 -3 2 -1];
>> rank(A)
ans = 3
Como podemos apreciar la fila cuatro es combinacin lineal de la fila 1 y la fila 2:. a
4j
=a
1j
+2 a
2j
, j=1...4
Divisin por la izquierda y por la derecha
La divisin por la izquierda se utiliza para resolver la ecuacin AX=B. En esta ecuacin X es el vector columna de
las incgnitas, B es el vector columna de los trminos independientes y A es una matriz cuadrada.
A
-1
AX=IX=X
De modo que
X=A
-1
B
En MATLAB esta ltima expresin se escribe utilizando el operador divisin por la izquierda
X=A\B
La divisin por la derecha se utiliza para resolver la ecuacin XC=D. En esta ecuacin X y D son vectores fila y C
es una matriz cuadrada.
XCC
-1
=DC
-1
X=DC
-1
o bien, X=D/C (divisin por la derecha)
Sistema de ecuaciones lineales
Consideremos el sistema de ecuaciones lineales
que podemos escribir Ax=b, donde A es una matriz de dimensin mn, y x y b son dos vectores columna de
longitudes n y m respectivamente. Tenemos un sistema de m ecuaciones con n incgnitas.
1. El sistema tiene solucin si y solo si el rango de la matriz A es igual al rango de la matriz ampliada A|b.
Sistema compatible.
2. Si el rango es igual al nmero n de incgnitas el sistema tiene una solucin nica. Sistema compatible
determinado
3. Si el rango es menor que el nmero n de incgnitas entonces hay un nmero infinito de soluciones. Sistema
compatible indeterminado.
Vamos a ver algunos ejemplos:
A =
?
?
?
?
?
?
0
1
3
2
1
1
1
3
2
0
2
2
1
1
0
1
?
?
?
?
?
?
+ + = a
11
x
1
a
12
x
2
a
13
x
3
b
1
+ + = a
21
x
1
a
22
x
2
a
23
x
3
b
2
+ + = a
31
x
1
a
32
x
2
a
33
x
3
b
3
=
?
?
?
a
11
a
21
a
31
a
12
a
22
a
32
a
13
a
23
a
23
?
?
?
?
?
?
x
1
x
2
x
3
?
?
?
?
?
?
b
1
b
2
b
3
?
?
?
AX = B
?
?
?
?
?
?
?
?
?
?
?
+ + ..... + = a
11
x
1
a
12
x
2
a
1n
x
n
b
1
+ + ..... + = a
21
x
1
a
22
x
2
a
2n
x
n
b
2
...
+ + ..... + = a
m1
x
1
a
m2
x
2
a
mn
x
n
b
m
=
?
?
?
?
?
?
a
11
a
21
...
a
m1
a
12
a
22
...
a
m2
...
...
...
...
a
1n
a
2n
...
a
mn
?
?
?
?
?
?
?
?
?
?
?
?
x
1
x
2
...
x
n
?
?
?
?
?
?
?
?
?
?
?
?
b
1
b
2
...
b
m
?
?
?
?
?
?
1.-Sea el sistema de tres ecuaciones con dos incgnitas
En forma matricial se escribe
La matriz A y la matriz ampliada A|b son respectivamente
>> A=[2 1; 2 -1; 1 -2];
>> b=[3;0;4];
>> Ab=[A b]
Ab =
2 1 3
2 -1 0
1 -2 4
>> rank(A)
ans = 2
>> rank(Ab)
ans = 3
El sistema no tiene solucin (primer caso). Cada una de las ecuaciones del sistema representa una recta,
identificamos x
1
con x y x
2
con y. En la figura vemos la representacin grfica de las rectas: y=3-2x, y=2x, y=x/2-
2; que como vemos no se cortan en un punto.
2.-Sea el sistema de tres ecuaciones con dos incgnitas
?
?
?
?
?
2 + = 3 x
1
x
2
2 = 0 x
1
x
2
2 = 4 x
1
x
2
[ ] =
?
?
?
2
2
1
1
1
2
?
?
?
x
1
x
2
?
?
?
3
0
4
?
?
?
A = A b =
?
?
?
2
2
1
1
1
2
?
?
?
|
|
|
|
?
?
?
2
2
1
1
1
2
3
0
4
?
?
?
?
?
?
?
?
2 + = 3 x
1
x
2
4 + 2 = 6 x
1
x
2
6 + 3 = 9 x
1
x
2
[ ] =
?
?
?
2
4
6
1
2
3
?
?
?
x
1
x
2
?
?
?
3
6
9
?
?
?
>> A=[2 1; 4 2; 6 3];
>> b=[3;6;9];
>> Ab=[A b];
>> rank(A)
ans = 1
>> rank(Ab)
ans = 1
El sistema tiene solucin, pero como el rango es menor que el nmero de incgnitas hay un nmero infinito de
soluciones (tercer caso).
Como vemos tenemos tres ecuaciones iguales, la segunda es igual a la primera multiplicada por dos y la tercera
es igual a la primera multiplicada por tres. En la figura se representa la recta y=3-2x, que es la solucin del
sistema de ecuaciones.
3.-Sea el sistema de tres ecuaciones con dos incgnitas y su representacin matricial
>> A=[2 1; 2 -1; 1 -2];
>> b=[3;5;4];
>> Ab=[A b];
>> rank(A)
ans = 2
>> rank(Ab)
ans = 2
El sistema tiene solucin nica ya que el rango es igual al nmero de incgnitas (segundo caso).
>> X=A\b
X = 2.0000
-1.0000
En la figura vemos la representacin grfica de las rectas: y=3-2x, y=2x-5, y=x/2-2; que como vemos se cortan en
un el punto x=2, y=-1.
?
?
?
?
?
2 + = 3 x
1
x
2
2 = 5 x
1
x
2
2 = 4 x
1
x
2
[ ] =
?
?
?
2
2
1
1
1
2
?
?
?
x
1
x
2
?
?
?
3
5
4
?
?
?
Divisin por la izquierda \
Vamos a practicar la divisin por la izquierda \ resolviendo el sistema de tres ecuaciones con tres incgnitas:
>> A=[3 -1 0; -2 1 1; 2 -1 4];
>> b=[5;0;15];
>> Ab=[A b];
>> rank(A)
ans = 3
>> rank(Ab)
ans = 3
>> A\b
ans =
2.0000
1.0000
3.0000
>> inv(A)*b
ans =
2.0000
1.0000
3.0000
La funcin rref de MATLAB
Esta funcin nos puede ser til para resolver sistemas de ecuaciones.
La matriz ampliada Ab del sistema de tres ecuaciones con tres incgnitas del apartado anterior es
3 = 5 x
1
x
2
2 + + = 0 x
1
x
2
x
3
2 + 4 = 15 x
1
x
2
x
3
=
?
?
?
3
2
2
1
1
1
0
1
4
?
?
?
?
?
?
x
1
x
2
x
3
?
?
?
?
?
?
5
0
15
?
?
?
AX = B
X = A\B
Ab =
?
?
?
?
3
2
2
1
1
1
0
1
4
5
0
15
?
?
?
?
>> A=[3 -1 0; -2 1 1; 2 -1 4];
>> b=[5;0;15];
>> Ab=[A b];
>> R=rref(Ab)
R =
1 0 0 2
0 1 0 1
0 0 1 3
Pasamos la matriz Ab a la funcin rref de MATLAB y obtenemos la matriz ampliada R del sistema equivalente
de ecuaciones
Sea ahora, el sistema de tres ecuaciones con tres incgnitas siguiente:
Creamos la matriz A de los coeficientes y la matriz ampliada Ab
>> A=[1 1 1;1 0 -2;2 1 -1];
>> b=[-6;4;18];
>> Ab=[A b];
>> R=rref(Ab)
R =
1 0 -2 0
0 1 3 0
0 0 0 1
El sistema equivalente es
Se trata de un sistema incompatible, tal como podemos comprobar calculando el rango de la matriz A y de su
ampliada Ab
>> rank(A)
ans = 2
>> rank(Ab)
ans = 3
Finalmente, sea el sistema
Creamos la matriz A de los coeficientes y la matriz ampliada Ab
>> A=[1 1 1; 1 0 -2;2 1 -1];
>> b=[6;4;10];
>> Ab=[A b];
>> rref(Ab)
ans =
1 0 -2 4
0 1 3 2
0 0 0 0
La ltima fila 0x
1
+0x
2
+0x
3
=0 se verifica para cualquier valor de x
1
, x
2
y x
3
El sistema equivalente es
R =
?
?
?
?
1
0
0
0
1
0
0
0
1
2
1
3
?
?
?
?
?
?
?
?
?
= 2 x
1
= 1 x
2
= 3 x
3
?
?
?
?
?
+ + = 6 x
1
x
2
x
3
2 = 4 x
1
x
3
2 + = 18 x
1
x
2
x
3
?
?
?
?
?
2 = 0 x
1
x
3
+ 3 = 0 x
2
x
3
0 = 1
?
?
?
?
?
+ + = 6 x
1
x
2
x
3
2 = 4 x
1
x
3
2 + = 10 x
1
x
2
x
3
{
2 = 4 x
1
x
3
+ 3 = 2 x
2
x
3
{
= 4 + 2 x
1
x
3
= 2 3 x
2
x
3
Una solucin sera por ejemplo, x
1
=4, x
2
=2 y x
3
=0.
>> rank(A)
ans = 2
>> rank(Ab)
ans = 2
El sistema es compatible e indeterminado.
Valores y vectores propios
El clculo de los valores propios y de los vectores propios de una matriz simtrica tiene gran importancia en las
matemticas y en la ingeniera, entre los que cabe destacar, el problema de la diagonalizacin de una matriz, el
clculo de los momentos de inercia y de los ejes principales de inercia de un slido rgido, o de las frecuencias
propias de oscilacin de un sistema oscilante.
Se denominan valores propios o races caractersticas de una matriz cuadrada A, a los valores de tales que.
Desarrollando el determinante tenemos un polinomio de grado n en . Trataremos de encontrar los coeficientes
del polinomio y luego, aplicaremos un mtodo de hallar las races del polinomio.
Una vez hallados los valores propios, para hallar el vector propio X correspondiente al valor propio es necesario
resolver el sistema homogneo
donde el vector X es Siempre podemos tomar x
1
como 1, y hallar las otras n-1 incgnitas.
De las n ecuaciones podemos tomar n-1, y resolver el sistema lineal.
El polinomio caracterstico
Dada una matriz cuadrada A de dimensin n. El polinomio caracterstico de la matriz es
Los coeficientes se hallan mediante las siguientes relaciones:
(1)
Los valores s
1
, s
2
, ... s
n
son las trazas de las potencias de la matriz cuadrada A.
La aplicacin de este mtodo no reviste dificultad, se calculan:
Las potencias de la matriz A y la traza de cada una de ellas,
Los coeficientes p
i
del polinomio caracterstico
Los valores propios o las races del polinomio mediante el comando roots
Conocidos los valores propios se calculan los vectores propios
det(A E) = = 0
|
|
|
|
|
|
a
11
a
21
...
a
n1
a
12
a
22
...
a
n2
...a
1n
...a
2n
...
a
nn
|
|
|
|
|
|
AX = X
X = { , ... } x
1
x
2,
x
n
( ) + + .... + = a
22
x
2
a
23
x
3
a
2n
x
n
a
21
+ ( ) + .... + = a
32
x
2
a
33
x
3
a
3n
x
n
a
31
...............................................
+ + .... + ( ) = a
n2
x
2
a
n3
x
3
a
nn
x
n
a
n1
p() = + + + ... +
n
p
1

n1
p
2

n2
p
n1
p
n
= p
1
s
1
= ( + ) p
2
1
2
s
2
p
1
s
1
..........................
= ( + + .... + ) p
n
1
n
s
n
p
1
s
n1
p
n1
s
1
?
?
?
?
?
?
?
?
?
?
?
?
?
trazaA =
= trazaA s
1
= traza s
2
A
2
....................
= traza s
n
A
n
?
?
?
?
?
?
?
?
?
?
?

i=1
in
a
ii
Hallar el polinomio caracterstico de la matriz
El desarrollo del determinante secular mediante el mtodo de Leverrier conduce a la ecuacin
Conocidos los coeficientes del polinomio caracterstico, se determinan las races por algn procedimiento
numrico, el mejor procedimiento es utilizar la funcin MATLAB roots que veremos con ms detalle en el
captulo races de una ecuacin.
Vectores propios
Conocidos los valores propios de una matriz simtrica A, se pueden calcular el vector propio X correspondiente a
cada valor propio .
AX=X
mediante el siguiente procedimiento. Supongamos una matriz simtrica A de dimensin 4.
Conocido el valor propio , tenemos un sistema de ecuaciones homogneo de 4 ecuaciones con 4 incgnitas. Le
damos a x
1
el valor arbitrario de 1 y lo convertimos en el sistema de tres ecuaciones con tres incgnitas
La funcin leverrier
A la funcin leverrier se le pasa la matriz cuadrada A de dimensin n y devuelve dos matrices
La matriz V de los vectores propios, cada vector propio correspondiente a un valor propio es un vector columna
La matriz diagonal D que contiene los valores propios en las columnas ordenados, de modo que al valor propio

i
que se guarda en el elemento diagonal D(i,i) le corresponde el vector columna i de la matriz cuadrada
V(1:n,i)
La funcin leverrier realiza dos tareas:
Calcula los valores propios
1. Calcula las potencias de la matriz A y sus trazas guardndolas en el vector s.
2. Calcula n coeficientes del polinomio caracterstico de acuerdo con las frmulas (1) y los guarda en el vector p.
Se ha de tener en cuenta que el coeficiente que falta es el de mayor grado y vale 1. El vector de los coeficientes
del polinomio caracterstico es el vector ampliado [1 p] cuyo primer trmino es 1 y a continuacin el resto de
los coeficienetes calculados.
?
?
?
?
?
1
2
3
4
2
1
2
3
3
2
1
2
4
3
2
1
?
?
?
?
?
4 40 56 20 = 0
4

3

2
=
?
?
?
?
?
?
a
11
a
21
a
31
a
41
a
12
a
22
a
32
a
42
a
13
a
23
a
33
a
43
a
14
a
24
a
34
a
44
?
?
?
?
?
?
?
?
?
?
?
?
x
1
x
2
x
3
x
4
?
?
?
?
?
?
?
?
?
?
?
?
x
1
x
2
x
3
x
4
?
?
?
?
?
?
= 0
?
?
?
?
?
?
a
11
a
21
a
31
a
41
a
12
a
22
a
32
a
42
a
13
a
23
a
33
a
43
a
14
a
24
a
34
a
44
?
?
?
?
?
?
?
?
?
?
?
?
x
1
x
2
x
3
x
4
?
?
?
?
?
?
?
?
?
?
?
+ ( ) + + = 0 a
21
x
1
a
22
x
2
a
23
x
3
a
24
x
4
+ + ( ) + = 0 a
31
x
1
a
32
x
2
a
33
x
3
a
34
x
4
+ + + ( ) = 0 a
41
x
1
a
42
x
2
a
43
x
3
a
44
x
4
?
?
?
?
?
( ) + + = a
22
x
2
a
23
x
3
a
24
x
4
a
21
x
1
+ ( ) + = a
32
x
2
a
33
x
3
a
34
x
4
a
31
x
1
+ + ( ) = a
42
x
2
a
43
x
3
a
44
x
4
a
41
x
1
=
?
?
?
( ) a
22
a
32
a
42
a
23
( ) a
33
a
43
a
24
a
34
( ) a
44
?
?
?
?
?
?
x
2
x
3
x
4
?
?
?
?
?
?
a
21
x
1
a
31
x
1
a
41
x
1
?
?
?
3. Calcula las races del polinomio, que son los valores propios empleando la funcin MATLAB roots, a la cual se
le pasa el vector de los coeficientes y devuelve el vector (columna) de las races.
4. Creamos una matriz D de dimensin n en cuya diagonal principal guardamos los valores propios, D(i,i)=
i
Calcula el vector propio para cada uno de los valores propios.
1. Extraemos de la matriz A la submatriz A(2:n,2:n) y creamos otra matriz B de dimensin n-1. Los elementos de
la diagonal de la matiz B, valen B(i,i)=A(i,i)-
i
2. Extraemos los elementos 2..n de la primera columna de la matriz A del siguiente modo, A(2:n,1), los cambiamos
de signo y los asignamos al vector C de dimensin n-1.
3. Los n-1 elementos del vector popio correspondiente al valor propio
i
se obtienen resolviendo un sistema de n-1
ecuaciones con n-1 incgnitas, mediante el operador divisin por la izquierda \ tal como hemos visto en la p
gina Vectores y matrices.
4. El vector propio S correspondiente al valor propio
i
est formado por la unidad y los n-1 valores que hemos
obtenido al resolver el sistema lineal de n-1 ecuaciones con n-1 incgnitas.
5. El vector propio S se normaliza (su mdulo es la unidad). Recurdese que el cuadrado del mdulo de un vector
es el producto escalar de dicho vector consigo mismo.
6. El vector propio S correspondiente al valor propio
i
es la columna i de la matriz V. V(1:n,i)=S/norm(S). La
funcin MATLAB norm calcula el mdulo de un vector.
Finalmente podemos comprobar que los resultados son correctos realizando el producto
VDV
-1
cuyo resultado es la matriz original A.
function [V,D]=leverrier(A)
%V vectores propios en columnas
% D valores propios en la diagonal de la matriz
n=length(A); %dimensin de la matriz
p=zeros(1,n); %reserva memoria para n elementos
s=zeros(n,1);
B=zeros(n); %reserva memoria para la matriz cuadrada de dimensin n
for i=1:n
B=A^i; %potencia de la matriz A
s(i)=trace(B); %calcula la traza de las sucesivas potencias de la matriz A
end
%calcula los coeficientes del polinomio caracterstico
p(1)=-s(1);
for i=2:n
p(i)=-s(i)/i;
for j=1:i-1
p(i)=p(i)-p(j)*s(i-j)/i;
end
end
%races del polinomio caracterstico
raiz=roots([1 p]);
%Los valores propios aparecen en la diagonal de la matriz D
D=diag(raiz);
%Vectores propios para cada valor propio
C=-1.*A(2:n,1); %columna de A
V=zeros(n);
S=zeros(n,1); %vector propio
for i=1:length(D)
B=A(2:n,2:n)-D(i,i)*eye(n-1); %submatriz de A
S=[1 (B\C)'];
% vectores propios normalizados
%cada vector propio es una columna de V
V(1:n,i)=S/norm(S);
end
end
Probamos la funcin leverrier en la ventana de comandos
>> A=[1 2 3 4; 2 1 2 3; 3 2 1 2; 4 3 2 1]
A =
1 2 3 4
2 1 2 3
3 2 1 2
4 3 2 1
>> [V,D]=leverrier(A)
V =
0.5468 0.6533 0.4483 0.2706
0.4483 0.2706 -0.5468 -0.6533
0.4483 -0.2706 -0.5468 0.6533
0.5468 -0.6533 0.4483 -0.2706
D =
9.0990 0 0 0
0 -3.4142 0 0
0 0 -1.0990 0
0 0 0 -0.5858
>> V*D*inv(V)
ans =
1.0000 2.0000 3.0000 4.0000
2.0000 1.0000 2.0000 3.0000
3.0000 2.0000 1.0000 2.0000
4.0000 3.0000 2.0000 1.0000
La funcin MATLAB eig
MATLAB dispone de la funcin eig que realiza las mismas tareas que la funcin leverrier.
>> A=[1 2 3 4; 2 1 2 3; 3 2 1 2; 4 3 2 1]
A =
1 2 3 4
2 1 2 3
3 2 1 2
4 3 2 1
>> [V,D]=eig(A)
V =
0.6533 -0.4483 0.2706 0.5468
0.2706 0.5468 -0.6533 0.4483
-0.2706 0.5468 0.6533 0.4483
-0.6533 -0.4483 -0.2706 0.5468
D =
-3.4142 0 0 0
0 -1.0990 0 0
0 0 -0.5858 0
0 0 0 9.0990
Ejercicio
Calcular los vectores propios y los valores propios de las matrices
?
?
?
1
1
1
3
1
0
2
1
0
?
?
?
?
?
?
7
1
1
1
5
1
1
1
5
?
?
?
Integracin numrica
Hay muchas situaciones en la que es preciso aplicar procedimientos numricos para obtener la integral definida
de una funcin. En este captulo se explicarn dos procedimientos:
Mtodo del punto medio
El procedimiento del trapecio
El procedimiento de Simpson
Concepto de integral definida
Para introducir el concepto de integral definida vamos a resolver el siguiente problema de cinemtica.
http://www.sc.ehu.es/sbweb/fisica_/cinematica/rectilineo/rectilineo/rectilineo_3.html
Dada la velocidad de un mvil en funcin del tiempo v(t) calcular el desplazamiento x-x
0
de dicho mvil entre los
instantes t
0
y t.
Dividimos el intervalo t
0
a t en pequeos intervalos de tiempo t
i
=t
i
-t
i-1
En el instante t
i-1
la velocidad del mvil es v
i-1
, en el instante t
i
la velocidad del mvil es v
i
. La velocidad media
<v
i
> en el intervalo de tiempo t
i
=t
i
-t
i-1
comprendido entre t
i-1
y t
i
es
El desplazamiento del mvil durante el intervalo de tiempo t
i
=t
i
-t
i-1
comprendido entre t
i-1
y t
i
es
aproximadamente el rea del rectngulo <v
i
> t
i
. El desplazamiento total x-x
0
entre el instante inicial t
0
, y el
instante final t=t
n
es, aproximadamente
donde n es el nmero de intervalos
Si v=-t
2
+14t+21 (m/s) y tomamos n=10 intervalos iguales, entre el instante t
0
=0 y t=10 s el desplazamiento
aproximado vale
t
i-1
t
i
<v
i
> <v
i
> t
i
0 1 27.5 27.5
1 2 39.5 39.5
2 3 49.5 49.5
< >= v
i
v( ) + v( ) t
i
t
i1
2
x < > x
0

i=1
n
v
i
t
i
3 4 57.5 57.5
4 5 63.5 63.5
5 6 67.5 67.5
6 7 69.5 69.5
7 8 67.5 67.5
9 10 63.5 63.5
0 10 575.0
Cuando el nmero de intervalos en los que se ha dividido un intervalo dado (t
0
, t) es muy grande t
i
-->0, la
velocidad media <v
i
> en el intervalo comprendido entre t
i-1
y t
i
es la velocidad v en cada instante t. En el lmite,
el desplazamiento se expresa como
Si v=-t
2
+14t+21 (m/s), el desplazamiento entre el instante t
0
=0 y t=10 s vale
Se ha de tener en cuenta que los ndices en MATLAB comienzan en uno no en cero. Creamos un funcin
denominada integral_1 que realice las siguientes tareas:
1. Calcular la velocidad en el instante t
i
2. Calcular la velocidad en el instante t
i+1
3. Calcular la velocidad media v
m
del mvil en el intervalo de tiempo t
i
=t
i+1
-t
i
4. Calcular el desplazamiento aproximado en dicho intervalo de tiempo, v
m
t
i
.
5. Calcular el desplazamiento total aproximado x-x
0
de dicho mvil entre los instantes t
0
y t.
function suma=integral_1(f,t)
suma=0;
v1=f(t(1));
for i=1:length(t)-1
v2=f(t(i+1));
vm=(v1+v2)/2;
suma=suma+vm*(t(i+1)-t(i));
v1=v2;
end
end
En el script (ms abajo), el vector t1 contiene n+1 datos comprendidos entre el tiempo inicial t
0
y la final t
f
ambos
incluidos, si el nmero de intervalos es n.
t0=input('tiempo inicial, t0: ');
tf=input('tiempo final, tf: ');
n=input('nmero intervalos, n: ');
vel=@(t) -t.^2+14*t+21; %funcin velocidad
t1=linspace(t0,tf,n+1);
res=integral_1(vel,t1); %calcula la integral
fprintf('El desplazamiento es %3.2f: \n',res)
En la ventana de comandos corremos el script velocidad
>> velocidad
tiempo inicial, t0: 0
tiempo final, tf: 10
nmero intervalos, n: 10
El desplazamiento es: 575.00
Mtodo del punto medio
El mtodo del punto medio es muy fcil de entender, ya que aproxima la integral definida
por la suma de pequeos rectngulos. Como se ve en la figura el rea de cada rectngulo es f(x
m
) x
i
, donde x
m
=
x = v dt x
0

t
0
t
x = ( + 14t + 21) dt = = =576.6667m x
0

t
0
t
t
2
+ 7 + 21t
t
3
3
t
2
|
|
|
10
0
1730
3
f(x)dx
a
b
(x
i+1
+x
i
)/2 es la posicin intermedia entre x
i
y x
i+1
.
Definimos la funcin integral_2 para que realice las siguientes tareas:
1. Calcula la posicin intermedia x
m
=(x
i+1
+x
i
)/2 entre x
i
y x
i+1
2. Calcula el rea del rectngulo f(x
m
) x
i
, donde x
i
=x
i+1
-x
i
3. Calcula el rea total aproximada en el intervalo a, b.
function suma=integral_2(f,x)
suma=0;
for i=1:length(x)-1
xm=(x(i+1)+x(i))/2;
suma=suma+f(xm)*(x(i+1)-x(i));
end
end
Escribimos el script velocidad_1
t0=input('tiempo inicial, t0: ');
tf=input('tiempo final, tf: ');
n=input('nmero intervalos, n: ');
vel=@(t) -t.^2+14*t+21; %funcin velocidad
t1=linspace(t0,tf,n+1);
res=integral_2(vel,t1); %calcula la integral
fprintf('El desplazamiento es: %3.2f\n',res)
En la ventana de comandos corremos el script velocidad_1
>> velocidad_1
tiempo inicial, t0: 0
tiempo final, tf: 10
nmero intervalos, n: 10
El desplazamiento es: 577.50
Frmula del trapecio
Para calcular la integral definida de la funcin f(x) en el intervalo comprendio entre x
0
y x, dividimos este
intervalo en pequeos intervalos de longitud h=x
i+1
-x
i
. Sustituimos la funcin por la recta que une los puntos (x
i
,
y
i
) y (x
i+1
, y
i+1
). El rea sombreada en la figura es la suma del rea de un rectngulo ms el rea de un tringulo,
vale
El rea total aproximada bajo la curva es
h + h ( ) = h ( + ) y
i
1
2
y
i+1
y
i
1
2
y
i+1
y
i
Definimos en la funcin trapecio el procedimiento. Donde f es la funcin integrando, y x el vector de n+1 datos
comprendidos entre la abscisa inicial x
0
y la final x
f
ambas incluidas, si el nmero de intervalos es n.
function sum=trapecio(f,x0, xf, nInterv)
%el nmero de puntos es n intervalos ms uno
x=linspace(x0,xf,nInterv+1);
n=length(x);
sum=(f(x(1))+f(x(n)))/2;
for i=2:n-1
sum=sum+f(x(i));
end
sum=sum*(x(2)-x(1));
end
Dada la funcin integrando f(x), calculamos la aproximacin a la integral definida en el intervalo comprendido
entre x
0
y x, escribiendo el script velocidad_2.
x0=input('abscisa inicial, x0: ');
xf=input('abscisa final, xf: ');
n=input('nmero intervalos, n: ');
deriv=@(x) -x^2+14*x+21; %definicin del integrando
res=trapecio(deriv,x0,xf,n); %calcula la integral
fprintf('El valor aproximado de la integral: %3.2f\n',res)
En la ventana de comandos corremos el script velocidad_2
>> velocidad_2
abscisa inicial, x0: 0
abscisa final, xf: 10
nmero intervalos, n: 10
El valor aproximado de la integral: 575.00
El mtodo de Simpson (1/3)
En este procedimiento, se toma el intervalo de anchura 2h, comprendido entre x
i
y x
i+2
, y se sustituye la
funcin f(x) por la parbola que pasa por tres puntos (x
i
, y
i
), (x
i+1
, y
i+1
), y (x
i+2
, y
i+2
).
Calculamos la contribucin a la integral del primer intervalo (x
0
, x
0
+2h) y generalizaremos para el resto de los
intervalos.
La ecuacin de la parbola y=ax
2
+bx+c que pasa por los puntos (x
0
, y
0
), (x
0
+h, y
1
), (x
0
+2h, y
2
) es
Este sistema de tres ecuaciones con tres incgnitas, se reduce a
Despejamos el coeficiente a, y 2ax
0
+b
( + ) + ( + ) + ( + ) + ... + ( + ) + ( + ) =
h
2
y
1
y
2
h
2
y
2
y
3
h
2
y
3
y
4
h
2
y
n2
y
n1
h
2
y
n1
y
n
( + 2 + 2 + 2 + ... + 2 + 2 + )
h
2
y
1
y
2
y
3
y
4
y
n2
y
n1
y
n
= a + b + c y
0
x
2
0
x
0
= a + b( + h) + c y
1
( + h) x
0
2
x
0
= a + b( + 2h) + c y
2
( + 2h) x
0
2
x
0
= + 2a h + a + bh y
1
y
0
x
0
h
2
= + 4a h + 4a + 2bh y
2
y
0
x
0
h
2
a = 2a + b =
2 + y
2
y
1
y
0
2
x
0
4 3 y
1
y
0
y
2
2h
Sustituimos la curva por la porcin de parbola en el intervalo (x
0
, x
0
+2h). La integral vale.
En general, el valor del rea aproximada, en el intervalo (x
i
, x
i
+2h) sombreada en la figura, es
El rea aproximada en el intervalo (a, b) es
o bien, agrupando trminos
El primer parntesis, contiene la suma de los extremos, el segundo, la suma de los trminos de ndice impar, y el
tercero la suma de los trminos de ndice par. En el mtodo de Simpson, el nmero de divisiones n debe de ser
par.
Definimos en la funcin simpson el procedimiento. Donde f es la funcin integrando, y x el vector de n+1 datos
comprendidos entre la abscisa inicial x
0
y la final x
f
ambas incluidas, si el nmero de intervalos es n que tiene
que ser un nmero PAR.
function suma=simpson(f,x0,xf,n)
%n nmero par de intervalos, n+1 nmero de puntos en el vector
x=linspace(x0,xf,n+1);
h=x(2)-x(1);
suma=f(x(1))+f(x(n+1));
for i=2:2:n
suma=suma+4*f(x(i));
end
for i=3:2:n-1
suma=suma+2*f(x(i));
end
suma=suma*h/3;
end
Dada la funcin integrando f(x), calculamos la aproximacin a la integral definida en el intervalo comprendido
entre x
0
y x, escribiendo el script velocidad_3
x0=input('abscisa inicial, x0: ');
xf=input('abscisa final, xf: ');
n=input('nmero intervalos (par), n: ');
if rem(n,2)==1
disp('El nmero intervalos tiene que ser par ');
break
end
deriv=@(x) -x^2+14*x+21; %definicin del integrando
res=simpson(deriv,x0,xf,n); %calcula la integral
fprintf('El valor aproximado de la integral: %3.2f\n',res)
En la ventana de comandos corremos el script velocidad_3
>> velocidad_3
abscisa inicial, x0: 0
abscisa final, xf: 10
nmero intervalos, n: 10
El valor aproximado de la integral: 576.67
Apreciamos la mejora en el resultado de la integral con el mtodo de Simpson.
Existe una versin del mtodo de Simpson denominada 3/8 en el que se emplea una ecuacin cbica para
concectar cuatro puntos.
2h
I = (a + bx + c)dx = (6 + 12 + 8 ) + (4 h + 4 ) + c(2h) =
x
0
+2h x
0
x
2
a
3
x
2
0
x
0
h
2
h
3
b
2
x
0
h
2
2h(a + b + c) + 2(2a + b) + a = x
2
0
x
0
x
0
h
2
8
3
h
3
( + 4 + )
h
3
y
0
y
1
y
2
( + 4 + )
h
3
y
i
y
i+1
y
i+2
f(x) dx ( + 4 + ) + ( + 4 + ) + .... + ( + 4 + )
a
b
h
3
y
0
y
1
y
2
h
3
y
2
y
3
y
4
h
3
y
n2
y
n1
y
n
f(x) dx (( + ) + 4( + + .... ) + 2( + + .... ))
a
b
h
3
y
0
y
n
y
1
y
3
y
n1
y
2
y
4
y
n2
Integracin numrica con funciones MATLAB
MATLAB dispone de las funciones denominadas quad y dblquad para las integrales simples y dobles
Integrales simples
La funcin quad(function, a, b);devuelve el resultado aproximado de la integral cuando se le pasa la funcin a
integrar en el primer parmetro function, los lmites a y b de la integral. Ejemplos:
>> f=@(x) -x.^2+14*x+21;
>> q=quad(f,0,10)
q = 576.6667
Integrales dobles
Queremos calcular una integral doble de la funcin f(x,y) en la regin rectangular de abscisas a y b y de
ordenadas c y d, tal como se muestra en la figura
MATLAB dispone de la funcin dblquad (se sustituye por integral2 en versiones ms recientes de MATLAB)
que realiza esta tarea. Supongamos que queremos calcular la integral doble
Creamos el script integral_doble, en el que definimos la funcin annima f(x,y) y llamamos a dblquad pasndole
la funcin, los lmites de integracin de la variable x, y los lmites de integracin de la variable y.
f=@(x,y) x.^2.*y;
res=dblquad(f,1,2,0,3);
fprintf('El valor de la integral es: %2.3f\n',res)
En la ventana de comandos corremos el script integral_doble
>> integral_doble
El valor de la integral es: 10.500
Como puede comprobarse fcilmente haciendo la integral doble.
Para calcular la integral doble de la funcin f(x,y) en la regin no rectangular comprendida entre las curvas
( + 14t + 21) dt = = =576.6667m
0
10
t
2
+ 7 + 21t
t
3
3
t
2
|
|
|
10
0
1730
3
f(x, y) dy dx
b
a

d
c
y dy dx
2
1

3
0
x
2
y=c(x), y=d(x) y las rectas x=a y x=b
Al integrar la funcin f(x,y) respecto de la variable y entre los lmites c(x) y d(x) nos queda la funcin g(x) que
integramos entre los lmites a y b.
Utilizamos la funcin MATLAB quad, para resolver ambas integrales, tal como vemos en el siguiente ejemplo.
Definimos la funcin g(x) del siguiente modo
function z=g(x)
n=length(x);
z=zeros(size(x));
for j=1:n
%lmites de y
c=x(j)^3-x(j);
d=x(j)^2+x(j);
%integrando f(x,y)
f=@(y) x(j)^3*y.^4+x(j)*y.^2;
z(j)=quad(f,c,d);
end
end
En el script integral_doble1 llamamos a la funcin quad para resolver la integral de g(x)
res=quad(@g,0,2);
fprintf('El valor de la integral es: %3.3f\n',res)
En la ventana de comandos corremos el script integral_doble1
>> integral_doble1
El valor de la integral es: 961.181
Comprobar los resultados de las integrales siguientes:
Solucin
Integral de pares de datos
Supongamos que en una experiencia hemos medido la velocidad de un mvil en funcin del tiempo,
f(x, y)dy dx
a
b

c(x)
d(x)
( f(x, y) dy) dx = g(x) dx
b
a

d(x)
c(x)

b
a
( + x ) dy dx = ( ( + x ) dy) dx
2
0

+x x
2
x x
3
x
3
y
4
y
2

0
2

+x x
2
x x
3
x
3
y
4
y
2
dy dx 0.0333
0.1
0.5

x
3
x
2
e
y/x
( + )dy dx 1.0001
0
1

x
2x
x
2
y
3
t(s) 1 2 3 4 5 6 7 8 9 10
v(m/s) 5.0 6.0 5.5 7.0 8.3 7.6 6.2 6.1 7.0 5.7
calcular el desplazamiento del mvil utilizando la funcin trapz, que emplea el procedimiento del trapecio.
>> t=[1 2 3 4 5 6 7 8 9 10];
>> v=[5.0 6.0 5.5 7.0 8.3 7.6 6.2 6.1 7.0 5.7];
>> des=trapz(t,v)
des = 59.0500
Solucin numrica de ecuaciones diferenciales
(I)
Las leyes que gobiernan los fenmenos de la naturaleza se expresan habitualmente en forma de ecuaciones
diferenciales. Las ecuaciones del movimiento de los cuerpos (la segunda ley de Newton) es una ecuacin
diferencial de segundo orden, como lo es la ecuacin que describe los sistemas oscilantes, la propagacin de las
ondas, la transmisin del calor, la difusin, el movimiento de partculas subatmicas, etc.
Pocas ecuaciones diferenciales tienen una solucin analtica sencilla, la mayor parte de las veces es necesario
realizar aproximaciones, estudiar el comportamiento del sistema bajo ciertas condiciones. As, en un sistema tan
simple como un pndulo, la amplitud de la oscilacin ha de ser pequea y el rozamiento ha de ser despreciable,
para obtener una solucin sencilla que describa aproximadamente su movimiento peridico.
Se estudia el procedimiento de Runge-Kutta que se aplica de forma directa a una ecuacin diferencial de primer
orden, pero veremos como se extiende a un sistema de ecuaciones de primer orden, a un ecuacin diferencial de
segundo orden y a un sistema de ecuaciones diferenciales de segundo orden.
El procedimiento de Runge-Kutta se puede programar fcilmente en los ordenadores y adems, se emplea mucho
en la prctica, debido a la su exactitud relativamente elevada de la solucin aproximada de la ecuacin
diferencial. La justificacin del procedimiento de Runge-Kutta no es sencilla, el lector interesado puede
consultar algn libro de mtodos numricos de anlisis.
Mtodo de Euler
Vamos aresolver la ecuacin diferencial de primer orden
con con la condicin inicial de que en el instante t
0
la posicin es x
0
La primera derivada nos permite conocer la posicin x
i+1
en el instante t
i+1
, a partir de la posicin x
i
en el instante
t
i
de acuerdo a la frmula siguiente. La lnea de color rojo es la tangente a la curva en el instante t
i
x
i+1
=x
i
+f(t
i
,x
i
)h
El procedimiento de Euler produce un error que se acumula a cada paso h de integracin, que es el segmento en
color azul que une los dos puntos en la figura.
Escribimos una funcin denominada euler, a la que le pasaremos:
la funcin f(t,x),
la condicin inicial de que en el instante t
0
la posicin es x
0
,
el instante final t
f
el nmero de pasos de integracin n
y nos devolver un vector t y su correspondiente vector x.
function [t,x] =euler(f,t0,tf,x0,n)
= f(t, x)
dx
dt
h=(tf-t0)/n;
t=t0:h:tf;
x=zeros(n+1,1); %reserva memoria para n+1 elementos del vector x
x(1)=x0;
for i=1:n
x(i+1)=x(i)+f(t(i),x(i))*h;
end
end
Supongamos que queremos integrar la ecuacin diferencial
con las condicin inicial t=0, x=0.
Tomamos un intervalo h=/6, y construimos la siguiente tabla
t x(Euler)
x=sin
t
0 1 0 0
/6 0.866 0.523 0.5
/3 0.5 0.977 0.866
/2 0 1.239 1
2/3 -0.5 1.239 0.866
5/6 -0.866 0.977 0.5
0.523 0
Esta tabla nos ilustra el modo de aplicar el mtodo de Euler a una ecuacin diferencial de primer orden. Para
aplicar el mtodo de Euler precisamos de un paso h pequeo, incluso as los errores se van acumulando y al cabo
de cierto tiempo la diferencia entre el valor exacto y el calculado es grande.
Escribimos en script euler_script en el que definiremos la funcin f(t,x), las condiciones iniciales y llamaremos a
la funcin euler. Finalmente, representaremos grficamente la solucin exacta y la obtenida aplicando el mtodo
de Euler
tf=input('tiempo final, tf: ');
n=input('nmero de pasos, n: ');
f=@(t,x) cos(t);
%condiciones iniciales
t0=0;
x0=0;
[t,x]=euler(f,t0,tf,x0,n);
hold on
plot(t,x,'b')
y=sin(t);
plot(t,y,'r')
xlabel('t')
ylabel('x');
legend('aproximada','exacta')
title('dx/dt=cost')
hold off
En la ventana de comandos corremos el script euler_script
>> euler_script
tiempo final, tf: pi
nmero de pasos, n: 40
= cos t
dx
dt
x 0 = cos t dt
0
t
x = sint
= cos t
dx
dt
Hay diferencia entre la solucin exacta y la obtenida mediante integracin numrica por el mtodo de Euler
Mtodo de Runge-Kutta
En esta seccin vamos a estudiar la aplicacin del mtodo de Runge-Kutta a:
Una ecuacin diferencial de primer orden
Un sistema de dos ecuaciones diferenciales de primer orden
Una ecuacin difrencial de segundo orden
Un sistema de dos ecuaciones diferenciales de segundo orden
Ecuacin diferencial de primer orden
Sea una ecuacin diferencial de primer orden, con la condicin inicial de que en el instante t
0
el valor inicial de x
es x
0
Se elige una anchura de paso h y se calculan cuatro nmeros k
1
, k
2
, k
3
, k
4
de acuerdo con el procedimiento
esquematizado en la tabla adjunta. Segn el procedimiento ordinario de Runge-Kutta, a partir del valor de x en el
instante t se determina el valor de x en el instante t+h mediante la frmula que figura en la ltima fila de dicha
tabla.
= f(t, x)
dx
dt
= h f(t, x) k
1
= h f (t + h, x + ) k
2
1
2
1
2
k
1
= h f (t + h, x + ) k
3
1
2
1
2
k
2
= h f (t + h, x + ) k
4
k
3
x(t + h) = x(t) + ( + 2 + 2 + )
1
6
k
1
k
2
k
3
k
4
Definimos la funcin rk_1 que resuelve la ecuacin diferencial de primer orden, cuando le pasamos:
la funcin f(t,x),
la condicin inicial de que en el instante t
0
el valor inicial es x
0
,
el instante final t
f
el nmero de pasos de integracin n comprendidos entre el instante inical t
0
y final t
f
.
y nos devolver un vector t y su correspondiente vector x.
function [t,x] =rk_1(f,t0,tf,x0,n)
h=(tf-t0)/n;
t=t0:h:tf;
x=zeros(n+1,1); %reserva memoria para n elementos del vector x
x(1)=x0;
for i=1:n
k1=h*f(t(i),x(i));
k2=h*f(t(i)+h/2,x(i)+k1/2);
k3=h*f(t(i)+h/2,x(i)+k2/2);
k4=h*f(t(i)+h,x(i)+k3);
x(i+1)=x(i)+(k1+2*k2+2*k3+k4)/6;
end
end
Considrese el circuito en serie de la figura. Inicialmente el condensador est descargado. Si se cierra el
interruptor I la carga empieza a fluir produciendo corriente en el circuito, el condensador se empieza a cargar.
Una vez que el condensador adquiere la carga mxima, la corriente cesa en el circuito.
Escribimos el script carga para que realice las siguientes tareas:
1. Establezca, mediante comandos input:
La resistencia R del circuito
La capacidad C del condensador
El tiempo final, tf
el nmero de pasos, n.
2. Fije las condiciones iniciales, en el instante inicial t=0, el condensador est descargado x=0.
3. Defina la funcin f(t,x),
4. Llame al procedimiento numrico rk_1
5. Mediante el comando plot realice una representacin grfica de la solucin numrica
6. Realice una representacin grfica de la solucin exacta
Ejemplo: R=2.0, C=0.8, y tf=10.
V0=10;
R=input('Resistencia R: ');
C=input('Capacidad C: ');
tf=input('tiempo final, tf: ');
n=input('nmero de pasos, n: ');
f=@(t,x) V0/R-x/(R*C);
%condiciones iniciales
t0=0; x0=0;
[t,x]=rk_1(f,t0,tf,x0,n);
hold on
plot(t,x,'b')
y=C*V0*(1-exp(-t/(R*C)));
plot(t,y,'r')
xlabel('t')
ylabel('q');
legend('aproximada','exacta','Location','Southeast')
title('Carga del condensador')
hold off
En la ventana de comandos corremos el script carga
>> carga
Resistencia R: 2
Capacidad C: 0.8
tiempo final, tf: 10
R =
dq
dt
V

q
C
= dtq = C (1 exp( ))
0
q
dq
C q V

1
RC

0
t
V

t
RC
nmero de pasos, n: 50
No se aprecia diferencia entre la solucin exacta y la numrica, aplicando el procedimiento de Runge_Kutta.
Sistema de dos ecuaciones diferenciales de primer orden
El procedimiento de Runge-Kutta es igualmente efectivo en la resolucin de un sistema de dos ecuaciones
diferenciales de primer orden.
El procedimiento de aplicacin del mtodo de Runge-Kutta a cada una de las ecuaciones diferenciales, con las
condicin inicial siguiente, en el instante t
0
el valor inicial de x es x
0
el valor inicial de y es y
0
se esquematiza en la tabla adjunta. Como vemos adems de los cuatro nmeros k
1
, k
2
, k
3
, k
4
para la primera
ecuacin diferencial precisamos otros cuatro nmeros l
1
, l
2
, l
3
, l
4
para la segunda ecuacin diferencial. A partir
del valor de x en el instante t, se determina el valor de x en el instante t+h, y a partir del valor de y en el
instante t se determina el valor de y en el instante t+h mediante las frmulas de la ltima fila de la tabla.
Definimos la funcin rk_2_1 que resuelve el sistema de dos ecuaciones diferenciales de primer orden, cuando le
pasamos:
= f(t, x, y) = g(t, x, y)
dx
dt
dy
dt
= f(t, x, y)
dx
dt
= g(t, x, y)
dy
dt
= h f(t, x, y) k
1
= h f (t + h, x + , y + , ) k
2
1
2
1
2
k
1
1
2
l
1
= h f (t + h, x + , y + ) k
3
1
2
1
2
k
2
1
2
l
2
= h f (t + h, x + , y + ) k
4
k
3
l
3
= h g(t, x, y) l
1
= h g(t + h, x + , y + ) l
2
1
2
1
2
k
1
1
2
l
1
= h g(t + h, x + , y + ) l
3
1
2
1
2
k
2
1
2
l
2
= h g(t + h, x + , y + ) l
4
k
3
l
3
x(t + h) = x(t) + ( + 2 + 2 + )
1
6
k
1
k
2
k
3
k
4
y(t + h) = y(t) + ( + 2 + 2 + )
1
6
l
1
l
2
l
3
l
4
las funciones f (t,x,y) y g(t,x,y)
las condiciones iniciales (x
0
,y
0
) en el instante t
0
el nmero n de pasos de integracin entre t
0
y el tiempo final t
f
Nos devuelve los vectores x e y para cada instante que se guarda en el vector t comprendido entre el instante
inicial t
0
y el final t
f
.
function [t,x,y] =rk_2_1(f,g,t0,tf,x0,y0,n)
h=(tf-t0)/n;
t=t0:h:tf;
x=zeros(n+1,1); %reserva memoria para n+1 element(i)os del vect(i)or x(i)
y=zeros(n+1,1);
x(1)=x0; y(1)=y0;
for i=1:n
k1=h*f(t(i),x(i),y(i));
l1=h*g(t(i),x(i),y(i));
k2=h*f(t(i)+h/2,x(i)+k1/2,y(i)+l1/2);
l2=h*g(t(i)+h/2,x(i)+k1/2,y(i)+l1/2);
k3=h*f(t(i)+h/2,x(i)+k2/2,y(i)+l2/2);
l3=h*g(t(i)+h/2,x(i)+k2/2,y(i)+l2/2);
k4=h*f(t(i)+h,x(i)+k3,y(i)+l3);
l4=h*g(t(i)+h,x(i)+k3,y(i)+l3);
x(i+1)=x(i)+(k1+2*k2+2*k3+k4)/6;
y(i+1)=y(i)+(l1+2*l2+2*l3+l4)/6;
end
end
Consideremos una serie radioactiva de tres elementos A-->B-->C en la que, una sustancia radiactiva A se
desintegra y se transforma en otra sustancia radiactiva B, que a su vez se desintegra y se transforma en una
sustancia C estable. Las ecuaciones diferenciales que gobiernan el proceso y sus soluciones analticas son,
respectivamente,
La solucin analtica que aparece a la derecha, se ha obtenido con las condiciones iniciales t=0, x=x
0
e y=0. La
segunda solucin se obtiene siempre que a sea distinto de b. En el caso de que a sea igual a b, la solucin
analtica para y es
La interpretacin del sistema de ecuaciones diferenciales no es complicada. En la unidad de tiempo, desaparecen
ax ncleos de la sustancia A al desintegrarse (primera ecuacin). En la unidad de tiempo, se producen ax ncleos
de la sustancia B y a su vez desaparecen bx ncleos de la sustancia B, que al desintegrarse se transforman en
ncleos de la sustancia C estable (segunda ecuacin).
Escribimos el script radioactivo en el que definiremos las funciones f(t,x,y), g(t,x,y), las condiciones iniciales y
llamaremos a la funcin rk_2_1
a=input('parmetro a: ');
b=input('parmetro b: ');
x0=input('valor inicial de x: ');
y0=input('valor inicial de y: ');
tf=input('tiempo final, tf: ');
n=input('nmero de pasos, n: ');
f=@(t,x,y) -a*x;
g=@(t,x,y) a*x-b*y;
%condiciones iniciales
t0=0;
[t,x,y]=rk_2_1(f,g,t0,tf,x0,y0,n);
hold on
plot(t,x,'b')
plot(t,y,'r')
xlabel('t')
ylabel('x,y');
legend('x(t)','y(t)')
title('dx/dt=-ax, dy/dt=ax-by')
hold off
En la ventana de comandos corremos el script radioactivo
>> radioactivo
parmetro a: 0.1
parmetro b: .2
valor inicial de x: 100
valor inicial de y: 0
tiempo final, tf: 10
nmero de pasos, n: 40
= axx = exp(at)
dx
dt
x
0
= ax byy = (exp(at) exp(bt))
dy
dt
a
b a
x
0
y = aexp(at) x
0
Ecuacin diferencial de segundo orden
Existen muchas situaciones en las que es necesario resolver una ecuacin diferencial de segundo orden.
con las condiciones iniciales
Una ecuacin diferencial de segundo orden es equivalente a un sistema de dos ecuaciones diferenciales de primer
orden, por lo que aplicaremos el mismo esquema.
Definimos la funcin rk_2 que resuelve la ecuacin diferencial de segundo orden, cuando le pasamos:
la funcin f (t,x,v)
las condiciones iniciales: posicin inicial x
0
y velocidad inicial v
0
en el instante t
0
el nmero n de pasos de integracin entre t
0
y el tiempo final t
f
Nos devuelve los vectores de las posiciones x y las velocidades v para cada instante que se guarda en el vector t
comprendido entre el instante inicial t
0
y el final t
f
.
function [t,x,v] =rk_2(f,t0,tf,x0,v0,n)
= f(t, x, v)
x d
2
dt
2
x( ) = = t
0
x
0
( )
dx
dt
t
0
v
0
= v
dx
dt
= f(t, x, v)
dv
dt
= hv k
1
= h(v + ) k
2
1
2
l
1
= h(v + ) k
3
1
2
l
2
= h(v + ) k
4
l
3
= h f(t, x, v) l
1
= h f (t + h, x + , v + ) l
2
1
2
1
2
k
1
1
2
l
1
= h f (t + h, x + , v + ) l
3
1
2
1
2
k
2
1
2
l
2
= h f (t + h, x + , v + ) l
4
k
3
l
3
x(t + h) = x(t) + ( + 2 + 2 + )
1
6
k
1
k
2
k
3
k
4
v(t + h) = v(t) + ( + 2 + 2 + )
1
6
l
1
l
2
l
3
l
4
h=(tf-t0)/n;
t=t0:h:tf;
x=zeros(n+1,1); %reserva memoria para n+1 element(i)os del vect(i)or x(i)
v=zeros(n+1,1);
x(1)=x0; v(1)=v0;
for i=1:n
k1=h*v(i);
l1=h*f(t(i),x(i),v(i));
k2=h*(v(i)+l1/2);
l2=h*f(t(i)+h/2,x(i)+k1/2,v(i)+l1/2);
k3=h*(v(i)+l2/2);
l3=h*f(t(i)+h/2,x(i)+k2/2,v(i)+l2/2);
k4=h*(v(i)+l3);
l4=h*f(t(i)+h,x(i)+k3,v(i)+l3);
x(i+1)=x(i)+(k1+2*k2+2*k3+k4)/6;
v(i+1)=v(i)+(l1+2*l2+2*l3+l4)/6;
end
end
La ecuacin diferencial que describe un oscilador armnico amortiguado y su solucin para unas condiciones
iniciales fijadas es
Condiciones iniciales: en el instante t=0, la posicin inicial es x
0
y la velocidad inicial v
0
.
Escribimos el script oscilador en el que definiremos la funcin f(t,x,v), las condiciones iniciales y llamaremos a la
funcin rk_2
w0=input('frecuencia angular w0: ');
g=input('rozamiento, gamma: ');
x0=input('posicin inicial, x0: ');
v0=input('velocidad inicial,v0: ');
tf=input('tiempo final, tf: ');
n=input('nmero de pasos, n: ');
f=@(t,x,v) -2*g*v-w0*w0*x;
%condiciones iniciales
t0=0;
hold on
%solucin numrica
[t,x,v]=rk_2(f,t0,tf,x0,v0,n);
plot(t,x,'b')
%solucin analtica
w=sqrt(w0*w0-g*g);
x=((v0+g*x0)*sin(w*t)/w+x0*cos(w*t)).*exp(-g*t);
plot(t,x,'r')
grid on
xlabel('t')
ylabel('x');
legend('aproximado','exacto')
title('oscilador amortiguado')
hold off
En la ventana de comandos corremos el script oscilador con distintas condiciones iniciales
>> oscilador
frecuencia angular, w0: 2
rozamiento, gamma: 0.5
posicin inicial, x0: 1.5
velocidad inicial, v0: 0
tiempo final, tf: 8
nmero de pasos, n: 100
+ 2 + x = 0
x d
2
dt
2
dx
dt

2
0
=
2
0

2

x = exp(t) (Asin(t) + Bcos(t))


v = = exp(t) (Asin(t) + Bcos(t)) + exp(t) (Acos(t) Bsin(t))
dx
dt
t = 0{
= B x
0
= B + A v
0
x = exp(t) ( sin(t) + cos(t))
+ v
0
x
0

x
0
No se aprecia tampoco diferencia entre la solucin exacta y la numrica, aplicando el procedimiento de
Runge_Kutta.
Solucin numrica de ecuaciones diferenciales
(II)
En esta pgina continuamos con el estudio de un sistema de dos ecuaciones diferenciales de segundo orden por el
procedimiento de Runge-Kutta
Sistema de dos ecuaciones diferenciales de segundo orden
El procedimiento numrico de Runge-Kutta puede aplicarse para resolver un sistema de dos ecuaciones
diferenciales de segundo orden.
con las condiciones iniciales
Este sistema, se puede transformar en un sistema equivalente formado por cuatro ecuaciones diferenciales de
primer orden. Aplicando dos veces el esquema descrito para una ecuacin diferencial de segundo
orden, obtenemos el esquema descrito en la siguiente tabla
Definimos la funcin rk_2_2 que resuelve el sistema de dos ecuaciones diferenciales de segundo orden, cuando le
pasamos:
las funciones f(t,x,v
x
,y,v
y
) y g(t,x,v
x
,y,v
y
)
las condiciones iniciales: posicin inicial (x
0
,y
0
) y velcidad inicial (v
x0
,v
y0
) en el instante t
0
el nmero n de pasos de integracin entreel instante inicial t
0
y el final t
f
= f(t, x, , y, ) = g(t, x, , y, )
x d
2
dt
2
v
x
v
y
y d
2
dt
2
v
x
v
y
x( ) = = y( ) = = t
0
x
0
( )
dx
dt
t
0
v
x0
t
0
y
0
( )
dy
dt
t
0
v
y0
=
dx
dt
v
x
= f(t, x, , y, )
dv
x
dt
v
x
v
y
= h k
1
v
x
= h( + ) k
2
v
x
1
2
l
1
= h( + ) k
3
v
x
1
2
l
2
= h( + ) k
4
v
x
l
3
= h f(t, x, , y, ) l
1
v
x
v
y
= h f (t + h, x + , + , y + , + ) l
2
1
2
1
2
k
1
v
x
1
2
l
1
1
2
q
1
v
y
1
2
m
1
= h f (t + h, x + , + , y + , + ) l
3
1
2
1
2
k
2
v
x
1
2
l
2
1
2
q
2
v
y
1
2
m
2
= h f (t + h, x + , + , y + , + ) l
4
k
3
v
x
l
3
q
3
v
y
m
3
x(t + h) = x(t) + ( + 2 + 2 + )
1
6
k
1
k
2
k
3
k
4
(t + h) = (t) + ( + 2 + 2 + ) v
x
v
x
1
6
l
1
l
2
l
3
l
4
=
dy
dt
v
y
= g(t, x, , y, )
dv
y
dt
v
x
v
y
= h q
1
v
y
= h( + ) q
2
v
y
1
2
m
1
= h( + ) q
3
v
y
1
2
m
2
= h( + ) q
4
v
y
m
3
= h g(t, x, , y, ) m
1
v
x
v
y
= h g(t + h, x + , + , y + , + ) m
2
1
2
1
2
k
1
v
x
1
2
l
1
1
2
q
1
v
y
1
2
m
1
= h g(t + h, x + , + , y + , + ) m
3
1
2
1
2
k
2
v
x
1
2
l
2
1
2
q
2
v
y
1
2
m
2
= h g(t + h, x + , + , y + , + ) m
4
k
3
v
x
l
3
q
3
v
y
m
3
y(t + h) = y(t) + ( + 2 + 2 + )
1
6
q
1
q
2
q
3
q
4
(t + h) = (t) + ( + 2 + 2 + ) v
y
v
y
1
6
m
1
m
2
m
3
m
4
Nos devuelve los vectores posicin (x,y) y velocidad (v
x
,v
y
) para cada instante que se guarda en el vector t
comprendido entre el instante inicial t
0
y el final t
f
.
function [t,x,vx,y,vy]=rk_2_2(f,g,t0,tf,x0,vx0,y0,vy0,n)
h=(tf-t0)/n;
t=t0:h:tf;
x=zeros(n+1,1); %reserva memoria para n+1 element(i)os del vect(i)or x(i)
y=zeros(n+1,1);
vx=zeros(n+1,1);
vy=zeros(n+1,1);
x(1)=x0; vx(1)=vx0;
y(1)=y0; vy(1)=vy0;
for i=1:n
k1=h*vx(i);
l1=h*f(t(i),x(i),vx(i),y(i),vy(i));
q1=h*vy(i);
m1=h*g(t(i),x(i),vx(i),y(i),vy(i));
k2=h*(vx(i)+l1/2);
l2=h*f(t(i)+h/2,x(i)+k1/2,vx(i)+l1/2,y(i)+q1/2,vy(i)+m1/2);
q2=h*(vy(i)+m1/2);
m2=h*g(t(i)+h/2,x(i)+k1/2,vx(i)+l1/2,y(i)+q1/2,vy(i)+m1/2);
k3=h*(vx(i)+l2/2);
l3=h*f(t(i)+h/2,x(i)+k2/2,vx(i)+l2/2,y(i)+q2/2,vy(i)+m2/2);
q3=h*(vy(i)+m2/2);
m3=h*g(t(i)+h/2,x(i)+k2/2,vx(i)+l2/2,y(i)+q2/2,vy(i)+m2/2);
k4=h*(vx(i)+l3);
l4=h*f(t(i)+h,x(i)+k3,vx(i)+l3,y(i)+q3,vy(i)+m3);
q4=h*(vy(i)+m3);
m4=h*g(t(i)+h,x(i)+k3,vx(i)+l3,y(i)+q3,vy(i)+m3);
x(i+1)=x(i)+(k1+2*k2+2*k3+k4)/6;
vx(i+1)=vx(i)+(l1+2*l2+2*l3+l4)/6;
y(i+1)=y(i)+(q1+2*q2+2*q3+q4)/6;
vy(i+1)=vy(i)+(m1+2*m2+2*m3+m4)/6;
end
end
Uno de los ejemplos ms interesantes de resolucin de un sistema de ecuaciones diferenciales de segundo orden
es la descripcin del movimiento de los cuerpos celestes, el cual tiene una solucin analtica sencilla en
coordenadas polares. La trayectoria seguida por un planeta es una cnica, una elipse en particular, en uno de
cuyos focos est el centro fijo de fuerzas, el Sol. En la figura, se muestra la fuerza que ejerce el Sol sobre un
planeta, inversamente proporcional al cuadrado de las distancias que separan sus centros y tambin, se muestran
sus componentes rectangulares
Teniendo en cuenta que la fuerza que ejerce el Sol sobre un planeta viene descrita por la ley de la Gravitacin
Universal
donde M es la masa del Sol, m la masa del planeta y r la distancia entre el centro del Sol y del planeta. Las
componentes de la aceleracin del planeta sern
Uno de los problemas del tratamiento numrico con ordenador, es la de reducir el problema a nmeros simples e
inteligibles por el usuario de un vistazo. Las masa de los planetas y del Sol son nmeros muy grandes: la masa
de la Tierra es 5.98 10
24
kg., y 1.98 10
30
kg. la del Sol. La distancia media entre la Tierra y el Sol es tambin
muy grande 1.49 10
11
m, y la constante G es muy pequea 6.67 10
-11
en el Sistema Internacional de Unidades.
Escalas
Antes de resolver el sistema de ecuaciones diferenciales por procedimientos numricos, es conveniente
F = G
Mm
r
2
= = = G x a
x
F
x
m
F cos
m
M
r
3
= = = G y a
y
F
y
m
F sin
m
M
r
3
prepararlas para que el ordenador no maneje nmeros excesivamente grandes o pequeos.
Establecemos un sistema de unidades en el que la longitud se mide en unidades astronmicas, la distancia media
entre el Sol y la Tierra. L=una UA=1.496 10
11
m y el tiempo en unidades de ao, P=un ao= 365.26
das=3.156 10
7
s.
En el nuevo sistema de unidades x=Lx, t=Pt, la primera ecuacin diferencial se escribe
Como L es el semieje mayor de la rbita de la Tierra alrededor del Sol, P es el periodo o tiempo que tarda en dar
una vuelta completa, y M es la masa del Sol. Por la tercera ley de Kepler, el trmino
Volviendo a la notacin x e y para la posicin y t para el tiempo en el nuevo sistema de unidades. El sistema de
ecuaciones diferenciales se escribe
Se resuelve por procedimientos numricos con las condiciones iniciales siguientes: en el instante t=0, x=x
0
, y=0,
v
x
=0, v
y
=v
0y
.
Principio de conservacin de la energa
La energa total de la partcula es una constante del movimiento. La energa de la partcula de masa m en el
instante inicial t=0 es
Cuando E
0
<0 la partcula permanece confinada en el espacio que rodea a los dos cuerpos. Cuando E
0
0 la
partcula escapa al infinito
La energa de la partcula en el instante t es igual a
En el nuevo sistema de unidades establecido
v=vL/P, x=xL, y=yL, d=dL
Volviendo a la notacin previa. Definimos una nueva energa e por unidad de masa en este sistema de unidades
El programa evala el cociente
que denominaremos tanto por ciento de error. Cuando la energa e difiere apreciablemente de e
0
, la trayectoria
calculada puede que se desve significativamente de la real, y esto suele ocurrir cuando la partcula est muy
= x'
d
2
x

dt'
2
L
P
2
GM
(x + y ) '
2
'
2
3/2
L
L
3
=
d
2
x

dt'
2
GMP
2
L
3
x'
(x + y ) '
2
'
2
3/2
= 4
GMP
2
L
3

2
= 4
x d
2
dt
2

2
x
( + ) x
2
y
2
3/2
= 4
y d
2
dt
2

2
y
( + ) x
2
y
2
3/2
= m E
0
1
2
v
2
0
GmM
r
0
E = m( + )
1
2
v
2
x
v
2
y
GmM
+ x
2
y
2

= v
E
m
1
2
'
2
L
2
P
2
GM
1
L
1
x + y '
2
'
2

= v
E
m
1
2
'
2
L
2
P
2
4
2
L
2
P
2
1
x + y '
2
'
2

= = v 4 e

E
m
P
2
L
2
1
2
'
2

2
1
x + y '
2
'
2

e = ( + ) 4
1
2
v
2
x
v
2
y

2
1
+ x
2
y
2

100
|
|
|
e e
0
e
0
|
|
|
cerca del centro de fuerzas
Elaboramos el script orbita, para describir el movimiento de un cuerpo celeste.
x0=input('posicin inicial x: ');
vx0=input('velocidad incial x: ');
y0=0;
vy0=input('velocidad incial y: ');
tf=input('tiempo final, tf: ');
n=input('nmero de pasos, n: ');
f=@(t,x,vx,y,vy) -4*pi*pi*x/(sqrt(x*x+y*y))^3;
g=@(t,x,vx,y,vy) -4*pi*pi*y/(sqrt(x*x+y*y))^3;
%condiciones iniciales
t0=0;
e0=(vx0*vx0+vy0*vy0)/2-4*pi*pi/sqrt(x0*x0+y0*y0); %energa inicial
[t,x,vx,y,vy]=rk_2_2(f,g,t0,tf,x0,vx0,y0,vy0,n);
plot(x,y,'r')
xlabel('x')
ylabel('y');
title('rbita de un planeta')
%energa final
m=length(t);
ef=(vx(m)*vx(m)+vy(m)*vy(m))/2-4*pi*pi/sqrt(x(m)*x(m)+y(m)*y(m));
%error relativo
fprintf('Error en energia %1.4f\n',abs((ef-e0)/e0))
En la ventana de comandos corremos el script orbita
>> orbita
posicin inicial x: 1
velocidad incial x: 0
velocidad incial y: 6.27
tiempo final, tf: 1
nmero de pasos, n: 40
Error en energia 0.0000
Solucin numrica de ecuaciones diferenciales
mediante ode45
MATLAB dispone de varias funciones para resolver mediante procedimientos numricos ecuaciones
diferenciales: ode23, ode45, ode113, etc, (vase en el sistema de ayuda para qu tipos de problemas es ms
adecuado cada uno de los procedimientos). Eligiremos ode45 para resolver la mayor parte de los problemas.
La funcin ode45
Su sintaxis es la siguiente
[t,x]=ode45(odefun,tspan,x0, options, params)
x es una matriz donde cada columna corresponde a las variables dependientes y t es el vector tiempo.
odefun es el nombre de la funcin,
tspan especifica el intervalo de tiempo, un vector de dos nmeros tspan=[ti,tf], tiempo inicial y final. Para
obtener valores de las variables dependientes en instantes concretos t
0
, t
1
, t
2
, ... t
n
. se escribe tspan=[t0,t1....tn];
x0 es un vector que contiene los valores iniciales.
options es una estructura que se crea con la funcin odeset, que explicaremos al final de esta pgina ya que es
un asunto bastante complicado.
params son parmetros que queremos pasar a la funcin odefun
En la mayor parte de los ejemplos, utilizaremos los tres primeros parmetros: llamaremos a la funcin ode45 y le
pasaremos la funcin odefunc, los instantes inicial y final en el vector tspan y las condiciones iniciales en el
vector x0.
Vamos a volver a resolver los problemas planteados en este captulo mediante la funcin MATLAB ode45.
Ecuacin diferencial de primer orden
Elaboramos el script titulado carga_1 para integrar la ecuacin diferencial de primer orden que describe la carga
de un condensador.
V0=10;
R=input('Resistencia R: ');
C=input('Capacidad C: ');
tf=input('tiempo final, tf: ');
f=@(t,x) V0/R-x/(R*C);
tspan=[0 tf];
x0=0;
[t,x]=ode45(f,tspan,x0);
plot(t,x,'r')
xlabel('t')
ylabel('q');
title('carga del condensador')
En la ventana de comandos corremos el script carga_1
>> carga_1
Resistencia R: 2
Capacidad C: 0.8
tiempo final, tf: 10
Sistema de dos ecuaciones diferenciales de primer orden
=
dq
dt
V

R
q
RC
Elaboramos el script titulado radiactivo_1 para integrar el sistema de dos ecuaciones diferenciales de primer
orden que describe la serie de desintagracin radioactiva. A-->B-->C donde C es un elemento estable.
En la matriz x que devuelve la funcin ode45, x(1) representar los sucesivos valores de la variable x y x(2)
representar a la variable y. El mismo criterio se emplear para determinar el vector x0 de las condiciones
iniciales.
La definicin de las funciones f (t,x,y) y g(t,x,y) aparecen en un vector columna, separadas por ; (punto y coma)
fg=@(t,x) [-a*x(1);a*x(1)-b*x(2)]; % x(1) es x, x(2) es y
El script radiactivo_1 ser el siguiente:
a=input('parmetro a: ');
b=input('parmetro b: ');
%condiciones iniciales en el vector x0
x0=zeros(1,2);
x0(1)=input('valor inicial de x: ');
x0(2)=input('valor inicial de y: ');
tf=input('tiempo final, tf: ');
tspan=[0 tf];
fg=@(t,x) [-a*x(1);a*x(1)-b*x(2)];
[t,x]=ode45(fg,tspan,x0);
plot(t,x)
xlabel('t')
ylabel('x,y');
title('dx/dt=-ax, dy/dt=ax-by')
En la ventana de comandos corremos el script radiactivo_1
>> radioactivo_1
parmetro a: 0.1
parmetro b: 0.2
valor inicial de x: 100
valor inicial de y: 0
tiempo final, tf: 20
Alternativamente, vamos a definir las funciones f (t,x,y) y g(t,x,y) en un fichero .M y le pasamos los valores de los
parmetros a y b.
function z=func_radioactivo(t,x,a,b)
z=[-a*x(1);a*x(1)-b*x(2)]; % x(1) es x, x(2) es y
end
Elaboramos el script radioactivo_2 para establecer los valores de los parmetros a y b, las condiciones iniciales y
llamar a la funcin que realiza la integracin numrica ode45. El primer parmetro de ode45 es el handler
(manejador de la funcin) a integrar que se especifica del siguiente modo @nombre_funcion.
[t,x]=ode45(@func_radioactivo,tspan,x0);
Ahora bien, func_radioactivo precisa de los valores de los parmetros a y b. Hay dos formas de hacerlo. La ms
sencilla es definir una funcin annima fg en trminos de func_radioactivo. En el problema 3 "Sistemas de
ecuaciones de Lorentz" describimos el segundo procedimiento.
fg=@(t,x) func_radioactivo_1(t,x,a,b);
Vase la misma situacin en la llamada a funcin fzero al final de la pgina Races de una ecuacin
a=input('parmetro a: ');
b=input('parmetro b: ');
%condiciones iniciales
x0=zeros(1,2);
x0(1)=input('valor inicial de x: ');
x0(2)=input('valor inicial de y: ');
tf=input('tiempo final, tf: ');
tspan=[0 tf];
fg=@(t,x) func_radioactivo(t,x,a,b);
[t,x]=ode45(fg,tspan,x0);
plot(t,x)
xlabel('t')
ylabel('x,y');
title('dx/dt=-ax, dy/dt=ax-by')
En la ventana de comandos corremos el script radioactivo_2
>> radioactivo_2
parmetro a: 0.1
parmetro b: 0.2
valor inicial de x: 100
?
?
?
?
?
?
?
= ax
dx
dt
= ax by
dy
dt
valor inicial de y: 0
tiempo final, tf: 20
Ecuacin diferencial de segundo orden
Una vez que se ha entendido como resolver un sistema de dos ecuaciones diferenciales de primer orden es posible
entender la resolucin de cualquier ecuacin diferencial o sistema. Podemos definir las funciones de forma
annima o explcitamente en un fichero .M
En este sistema de dos ecuaciones diferenciales de primer orden x(1) representar los sucesivos valores de la
variable x y x(2) representar a la variable v. El mismo criterio se emplear para determinar el vector x0 de las
condiciones iniciales.
Como ejemplo, estudiamos las oscilaciones amortiguadas, que hemos descrito en la pgina anterior.
Las funciones a integrar v, y f (t,x,v) aparecen en un vector columna, separadas por ; (punto y coma)
f=@(t,x) [x(2);-2*g*x(2)-w0*w0*x(1)]; % x(1) es x, x(2) es v
Elaboramos el script oscilador_1 para resolver la ecuacin de segundo grado que describe las oscilaciones
amortiguadas
w0=input('frecuencia angular, w0: ');
g=input('rozamiento, gamma: ');
%condiciones iniciales
x0=zeros(1,2);
x0(1)=input('posicin inicial, x0: ');
x0(2)=input('velocidad inicial, v0: ');
tf=input('tiempo final, tf: ');
f=@(t,x) [x(2);-2*g*x(2)-w0*w0*x(1)];
tspan=[0 tf];
[t,x]=ode45(f,tspan,x0);
plot(t,x(:,1),'r')
grid on
xlabel('t')
ylabel('x');
title('oscilador amortiguado')
Si en el comando plot ponemos plot(t,x), se representa la posicin x(1) y la velocidad x(2) en funcin del tiempo
(en dos colores asignados por MATLAB). Si solamente queremos representar la posicin x(1) en funcin del
tiempo t, se escribe plot(t,x(:,1)). Vase la pgina Vectores y matrices
En la ventana de comandos corremos el script oscilador_1
>> oscilador_1
frecuencia angular w0: 2
rozamiento, gamma: 0.5
posicin inicial, x0: 0
velocidad inicial,v0: 10
tiempo final, tf: 10
Sistema de dos ecuaciones diferenciales de segundo orden
En este caso tenemos un sistema de cuatro ecuaciones difrenciales de primer orden
En este sistema x(1) representar los sucesivos valores de la variable x y x(2) representar a la variable v
x
, x(3) a
la variable y y x(4) a la variable v
y
. El mismo criterio se emplear para determinar el vector x0 de las condiciones
iniciales.
Como ejemplo, estudiamos el movimiento de un planeta alrededor del Sol o de un satlite artificial alrededor de
= v
dx
dt
= f(t, x, v)
dv
dt
+ 2 + x = 0
x d
2
dt
2
dx
dt

2
0
?
?
?
?
?
?
?
= v
dx
dt
= 2v x
dv
dt

2
0
=
dx
dt
v
x
= f(t, x, , y, )
dv
x
dt
v
x
v
y
=
dy
dt
v
y
= g(t, x, , y, )
dv
y
dt
v
x
v
y
la Tierra.
Elaboramos el script orbita_1 para resolver el sistema de dos ecuaciones de segundo grado que describe el
movimiento de un cuerpo celeste.
%condiciones iniciales
x0=zeros(1,4);
x0(1)=input('posicin inicial x: ');
x0(2)=input('velocidad incial x: ');
x0(3)=0;
x0(4)=input('velocidad incial y: ');
tf=input('tiempo final, tf: ');
tspan=[0 tf];
fg=@(t,x)[x(2);-4*pi*pi*x(1)/(sqrt(x(1)*x(1)+x(3)*x(3)))^3; x(4);
-4*pi*pi*x(3)/(sqrt(x(1)*x(1)+x(3)*x(3)))^3];
[t,x]=ode45(fg,tspan,x0);
plot(x(:,1),x(:,3),'r')
xlabel('x')
ylabel('y');
title('rbita de un planeta')
En Figure Window representamos la trayectoria, es decir, los puntos de abscisas x(1) que guardan los valores x y
las ordenadas x(3) que guardan los valores y, en funcin del tiempo t, se escribe plot(t,x(:,1),x(:,3)).
En la ventana de comandos corremos el script orbita_1
>> orbita_1
posicin inicial x: 1
velocidad incial x: 0
velocidad incial y: 6.27
tiempo final, tf: 1
Opciones de ode45
Imaginemos que estudiamos el movimiento de cada de un cuerpo, no sabemos cuanto tiempo tardar en llegar al
suelo, desconocemos el valor del elemento tf en el vector tspan. Sin embargo, queremos detener el proceso de
integracin numrica de la ecuacin diferencial que describe el movimiento cuando la posicin del mvil sea
cero. La funcin MATLAB ode45 dispone de un parmetro adicional options donde podemos indicarlo, pero es
bastante lioso e intentaremos explicarlo mediante ejemplos.
Volvemos a resolver la ecuacin diferencial que describe las oscilaciones amortiguadas y detendremos el
proceso de integracin cuando el mvil alcance la posicin mxima, su velocidad es nula.
Supongamos que el oscilador amortiguado estudiado anteriormente, de frecuencia natural
0
=2, constante de
amortiguamiento =0.25, parte de la posicin x
0
=2.5 con velocidad nula, queremos detener el proceso de
integracin cuando el mvil alcance la posicin mxima, cuando su velocidad es nula, tal como se muestra en la
figura, con lo que se completa un periodo.
= 4
x d
2
dt
2

2
x
( + ) x
2
y
2
3/2
?
?
?
?
?
?
?
?
?
=
dx
dt
v
x
= 4
dv
x
dt

2
x
( + ) x
2
y
2
3/2
= 4
y d
2
dt
2

2
y
( + ) x
2
y
2
3/2
?
?
?
?
?
?
?
?
?
=
dy
dt
v
y
= 4
dv
y
dt

2
y
( + ) x
2
y
2
3/2
Los pasos a seguir son los siguientes:
1.-Definimos la funcin cuyo nombre es opcion_ode45
function [detect,stopin,direction]=opcion_ode45(t,x)
detect=[x(1) x(2)]; %[posicin, velocidad]
stopin=[0 1]; % 1 indice que detiene la integracin cuando la velocidad se hace cero
direction=[0 -1]; % 1 crece, -1 decrece, 0 no importa
end
2.-Creamos la estructura opts con la llamada a la funcin odeset
opts=odeset('events',@opcion_ode45);
Cuando se utiliza options la funcin ode45 devuelve los tiempos te en los cuales ocurren los 'eventos' y los
correspondientes valores de las variables dependientes (posicin, velocidad) en el vector xe. Finalmente, ie es un
ndice que es til cuando se vigilan varios eventos.
3.-Le pasamos opts a la funcin ode45 en su cuarto parmetro
[t,x,te,xe,ie]=ode45(odefunc,tspan,x0,opts);
Escribimos el script oscilador_2 para resolver la ecuacin diferencial de segundo orden y detener el proceso de
integracin de acuerdo con lo estipulado en el parmetro opts.
w0=2;
g=0.25;
x0=[2.5 0];
tf=10;
f=@(t,x) [x(2);-2*g*x(2)-w0*w0*x(1)];
tspan=[0 10];
opts=odeset('events',@opcion_ode45);
[t,x,te,xe,ie]=ode45(f,tspan,x0,opts);
te,xe,ie
plot(t,x(:,1),'r')
grid on
xlabel('t')
ylabel('x');
title('oscilador amortiguado')
Cuando corremos el script oscilador_2 en la ventana de comandos se imprime los siguientes datos relativos a los
eventos.
Tiempo, te Posicin x(1) Velocidad x(2) Indice ie
0.0000 2.5000 -0.0000 2
2.4378 0.0000 2.7173 1
3.1662 1.1322 -0.0000 2
Cuando parte de la posicin inicial x(1)=2.5 la velocidad es cero x(2)=0, detecta velocidad (ndice ie=2).
Cuando pasa por el origen x(1)=0 detecta posicin (ndice ie=1), pero no se detiene ya que en stopin se ha
puesto un cero.
Cuando la posicin es x(1)=1.1322 detecta velocidad nula x(2)=0, (ndice ie=2) y la integracin numrica se
detiene ya que en stopin se ha puesto un uno y la velocidad decrece en direction se ha puesto un -1.
La columna de tiempos nos porporciona el periodo de la oscilacin, te=3.1662.
Se sugiere al lector, cambiar en la funcin opcion_ode45
direction=[0 1];
Vamos ahora a marcar en la representacin grfica de la oscilacin amortiguada, las posiciones de mxima
amplitud x(2)=0 y cuando pasa por el origen x(1)=0 sin detener el proceso de integracin numrica.
Definimos una nueva versin de la funcin opcion1_ode45
function [detect,stopin,direction]=opcion1_ode45(t,x)
detect=[x(1) x(2)]; %[posicin, velocidad]
stopin=[0 0];
direction=[0 0];
end
Creamos la estructura opts mediante odeset y se la pasamos al procedimiento de integracin ode45.
w0=2;
g=0.25;
x0=[2.5 0];
tf=10;
f=@(t,x) [x(2);-2*g*x(2)-w0*w0*x(1)];
tspan=[0 7];
opts=odeset('events',@opcion1_ode45);
[t,x,te,xe,ie]=ode45(f,tspan,x0,opts);
hold on
plot(t,x(:,1),'r')
plot(te(ie==1),xe(ie==1),'o','markersize',6,'markerfacecolor','k')
plot(te(ie==2),xe(ie==2),'o','markersize',6,'markerfacecolor','b')
grid on
xlabel('t')
ylabel('x');
title('oscilador amortiguado')
hold off
Si solamente estamos interesados en los mximos definimos una nueva versin de la funcin opcion2_ode45
function [detect,stopin,direction]=opcion2_ode45(t,x)
detect=x(2);
stopin=0;
direction=-1;
end
Modificamos el script oscilador_4
w0=2;
g=0.25;
x0=[2.5 0];
tf=10;
f=@(t,x) [x(2);-2*g*x(2)-w0*w0*x(1)];
tspan=[0 7];
opts=odeset('events',@opcion1_ode45);
[t,x,te,xe,ie]=ode45(f,tspan,x0,opts);
te,xe,ie
hold on
plot(t,x(:,1),'r')
plot(te(ie==1),xe(ie==1),'o','markersize',6,'markerfacecolor','b')
grid on
xlabel('t')
ylabel('x');
title('oscilador amortiguado')
hold off
Corremos el script oscilador_4 en la ventana de comandos y observamos los resultados
Paso de parmetros a la funcin
Como hemos visto, a ode45 se le pasa la funcin (handle) a integrar en su primer argumento. Si la funcin
contiene parmetros como la frecuencia angular
0
, no hay problema si la funcin se define como annima, tal
como se ha mostrado en los ejemplos previos. Si la funcin se define en un fichero entonces a la funcin se le
pasan los valores de los parmetros en el quinto argumento params de ode45. Los pasos se explican en el
siguiente ejemplo:
El sistema de ecuaciones de Lorentz es un sistema de tres ecuaciones diferenciales de primer orden
donde =10, =8/3 y =28
Vamos a resolver el sistema de tres ecuaciones diferenciales con las condiciones iniciales siguientes: en el
instante t=0, x
0
=-8, y
0
=8 z
0
=27.
1. Escribir una funcin denominada lorentz(t,x,p) como fichero.M que contenga las tres ecuaciones y dependa de
los tres parmetros =p(1), =p(2) y =p(3). Observar que la variable x se guarda en el primer elemento x(1), la
variable y en el segundo x(2) y la variable z en el tercer x(3) elemento del vector x.
2. Escribir un script denominado lorentz_script que llame a la funcin MATLAB ode45, para resolver el sistema
de ecuaciones diferenciales para las condiciones iniciales especificadas.
3. Pasar los parmetros , y como elementos de un vector p a la funcin ode45 para que a su vez se los pase a
la funcin lorentz.
4. Dibujar el atractor de Lorentz de z en funcin de x hasta el instante t
f
=20 en una primera ventana grfica.
5. Dibujar x, y y z en funcin del tiempo en tres zonas de una segunda ventana grfica.
6. Examinar el comportamiento del sistema para otras condiciones iniciales, t=0, x
0
=1, y
0
=2 z
0
=3.
Definimos la funcin lorentz como fichero .M
function fg=lorentz(t,x,p)
%x(1) es x, x(2) es y y x(3) es z
% p(1) es sigma, p(2) es beta y p(3) es rho
fg=[-p(1)*x(1)+p(1)*x(2); p(3)*x(1)-x(2)-x(1)*x(3); -p(2)*x(3)+x(1)*x(2)];
end
Elaboramos el script lorentz_script
x0=[-8 8 27]; %valores iniciales
tspan=[0 20];
p=[10 8/3 28]; %parmetros
%no pasamos nada [] en el parmetro options de ode45
[t,x]=ode45(@lorentz,tspan,x0,[],p);
figure
plot(x(:,1),x(:,3),'r')
xlabel('x')
ylabel('z');
title('Atractor de Lorentz')
figure
subplot(3,1,1)
= x + y
dx
dt
= x y xz
dy
dt
= z + xy
dz
dt
plot(t,x(:,1))
ylabel('x');
subplot(3,1,2)
plot(t,x(:,2))
ylabel('y');
subplot(3,1,3)
plot(t,x(:,3))
ylabel('z');
xlabel('t')
En la ventana de comandos corremos el script lorentz_script
>> lorentz_script
Aparecen dos ventanas grficas, la primera con el atractor de Lorentz, la representacin z(x) y la segunda ventana
dividida en tres regiones que muestran x(t), y(t) y z(t)
Interpolacin
En este captulo se estudia la interpolacin y la regresin.
La regresin es el ajuste de los datos experiementales a una funcin que describe el modelo fsico particular. Por
ejemplo, en un experiemento de movimiento rectilneo uniforme, los datos experimentales (tiempo, posicin del
mvil) se ajustan a una lnea recta, ya que la ecuacin que describe el movimiento rectilneo uniforme es
x=x
0
+vt.
En la interpolacin la funcin pasa por todos los puntos.
Este pequeo programa muestra la diferencia
%datos experiementales
x=0.5:0.5:3;
y=[0.7,1.2,1.3,1.2,0.8,0.3];
hold on
plot(x,y,'ro','markersize',4,'markerfacecolor','r')
xx=linspace(0,3.1,100);
%regresin
p=polyfit(x,y,2); %polinomio de segundo grado
yy=polyval(p,xx);
plot(xx,yy,'b')
%interpolacin
yy=spline(x,y,xx);
plot(xx,yy,'r')
hold off
grid on
legend('datos','regresin','interpolacin')
xlabel('x')
ylabel('y');
title('Interpolacin, regresin')
En esta pgina, comenzamos el estudio de la interpolacin lineal, continuamos por el mtodo de Lagrange, pero
veremos que la interpolacin mediante "splines" es mucho ms adecuada.
Interpolacin lineal
La interpolacin lineal es muy sencilla. Disponemos de pares de datos (x
k
,y
k
) k=1,2...n. Queremos conocer el
valor de y para un valor cualesquiera de x en el intervalo x
1
a x
n
. Supongamos que x est en el intervalo (x
k
,x
k+1
)
tal como se muestra en la figura. Trazamos la recta que pasa por los puntos (x
k
,y
k
) y (x
k+1
,y
k+1
), cuya ecuacin
es
Creamos la funcin interpola_lineal para obtener el valor de y cuando se proporciona el valor de x.
function y0 = interpola_lineal(x,y,x0)
y0=zeros(length(x0),1);
for j=1:length(x0)
indice=find(x>x0(j));
k=indice(1)-1;
y0(j)=((x0(j)-x(k))*y(k+1)-(x0(j)-x(k+1))*y(k))/(x(k+1)-x(k));
end
end
Probamos la funcin para interpolar linealmente los siguientes pares de datos (0,0), (/3, sin(/3)), (2/3,
sin(2/3)),(, 0). Podemos comprobar que obtenemos los mismos resultado utilizando la funcin MATLAB
interp1, pasndole la opcin linear en el ltimo parmetro.
x=[0,pi/3,2*pi/3,pi]; %datos
y=sin(x);
xx=0:pi/90:pi; %funcin
yy=sin(xx);
x0=[pi/6,pi/2,5*pi/6]; %interpolacin lineal
y0=interpola_lineal(x,y,x0);
%y0=interp1(x,y,x0,'linear'); %esta es una funcin MATLAB
hold on
plot(xx,yy,'b')
plot(x,y,'r')
plot(x,y,'bo','markersize',4,'markerfacecolor','b')
plot(x0,y0,'ro','markersize',6,'markerfacecolor','r')
hold off
xlabel('x');
ylabel('y')
title('Interpolacin lineal')
y =
(x ) (x ) x
k
y
k+1
x
k+1
y
k
( ) x
k+1
x
k
Discutiremos en la siguiente seccin, la interpolacin mediante un polinomio de mayor grado. Podemos calcular
los coeficientes de un polinomio de tercer grado y=a
1
x
3
+a
2
x
2
+a
3
x+a
4
que pase por los cuatro puntos.
Obtenemos un sistema de cuatro ecuaciones con cuatro incgnitas.
x=[0,pi/3,2*pi/3,pi]; %datos
y=sin(x);
xx=0:pi/90:pi; %funcin
yy=sin(xx);
x0=[pi/6,pi/2,5*pi/6]; %interpolacin lineal
A=vander(x);
p=A\y'; %coeficientes del polinomio
hold on
plot(xx,yy,'b') %datos y funcin
plot(x,y,'bo','markersize',4,'markerfacecolor','b')
yy=polyval(p,xx); %polinomio
plot(xx,yy,'r')
y0=polyval(p,x0); %valores interpolados
plot(x0,y0,'ro','markersize',6,'markerfacecolor','r')
hold off
xlabel('x');
ylabel('y')
title('Interpolacin con un polinomio de tercer gardo')
?
?
?
?
?
?
?
?
?
?
?
?
?
+ + + = a
1
x
3
1
a
2
x
2
1
a
3
x
1
a
4
y
1
+ + + = a
1
x
3
2
a
2
x
2
2
a
3
x
2
a
4
y
2
+ + + = a
1
x
3
3
a
2
x
2
3
a
3
x
3
a
4
y
3
+ + + = a
1
x
3
4
a
2
x
2
4
a
3
x
4
a
4
y
4
=
?
?
?
?
?
?
x
3
1
x
3
2
x
3
3
x
3
4
x
2
1
x
2
2
x
2
3
x
2
4
x
1
x
2
x
3
x
4
1
1
1
1
?
?
?
?
?
?
?
?
?
?
?
a
1
a
2
a
3
a
4
?
?
?
?
?
?
?
?
?
?
?
y
1
y
2
y
3
y
4
?
?
?
?
?
?
Interpolacin de Lagrange
Queremos encontrar los coeficientes de un polinomio de grado N
a
1
x
N
+a
2
x
N-1
+...+a
N
x+a
N+1
que pase por todos los pares de datos (x
1
,y
1
), (x
2
,y
2
), ...(x
N+1
,y
N+1
). Los coeficientes se pueden obtener
resolviendo el sistema de ecuaciones:
En forma matricial
Esta matriz se conoce con el nombre de Vandermonde y se construye con el comando vander(x), como podemos
leer en el sistema de ayuda de MATLAB, A=vander(v) devuelve una matriz de Vandermonde cuyas columnas
son las potencias del vector v, esto es A(i,j)=v(i)^(n-j)
Sea la siguiente tabla de datos tomada de una experiencia
x 0.97 1.12 2.92 3.00 3.33 3.97 6.10 8.39 8.56 9.44
y 2.58 0.43 0.06 5.74 7.44 8.07 6.37 2.51 1.44 0.52
Cuando el nmero N+1 de datos es relativamente pequeo, las primeras columnas de la matriz A pueden guardar
nmeros muy grandes, los efectos del redondeo pueden afectar al valor de los coeficientes a
i
del polinomio.
Los valores del polinomio se puede obtener tambin utilizando la funcin polyfit que emplearemos ms adelante
en el ajuste por el procedimiento de mnimos cuadrados.
x=[0.97 1.12 2.92 3.00 3.33 3.97 6.10 8.39 8.56 9.44];
y=[2.58 0.43 0.06 5.74 7.44 8.07 6.37 2.51 1.44 0.52];
n=length(x); %nmero de pares de datos
%A=vander(x);
?
?
?
?
?
?
?
?
?
?
?
+ + + = a
1
x
N
1
a
2
x
N1
1
a
N
x
1
a
N+1
y
1
+ + + = a
1
x
N
2
a
2
x
N1
2
a
N
x
2
a
N+1
y
2
.....
+ + + = a
1
x
N
N+1
a
2
x
N1
N+1
a
N
x
N+1
a
N+1
y
N+1
=
?
?
?
?
?
?
x
N
1
x
N
2
...
x
N
N+1
x
N1
1
x
N1
2
...
x
N1
N+1
...
...
...
...
x
1
x
2
...
x
N+1
1
1
...
1
?
?
?
?
?
?
?
?
?
?
?
a
1
a
2
...
a
N+1
?
?
?
?
?
?
?
?
?
?
?
y
1
y
2
...
y
N+1
?
?
?
?
?
?
A=zeros(n); %lneas equivalentes a utilizar vander(x)
for j=1:n
A(:,j)=(x').^(n-j);
end
p=A\y'; %sistema de ecuaciones lineales, y' es vector columna
p=polyfit(x,y,n-1) %n-1 es el grado del polinomio
xx=linspace(0.97,9.44,50); %interpolacin
yy=polyval(p,xx);
hold on
plot(x,y,'o','markersize',4,'markerfacecolor','r')
plot(xx,yy,'b')
xlabel('x')
ylabel('y')
title('Interpolacin de Lagrange');
hold off
Corremos el script interpola-1 en la ventana de comandos, obtenemos un aviso, los coeficientes del polinomio y
la representacin grfica de los datos y del polinomio que pasa por dichos puntos.
Warning: Polynomial is badly conditioned.
p = 1.0e+004 *
0.0000 -0.0003 0.0057 -0.0595 0.3782 -1.4951 3.6430 -5.2142
3.9256 -1.1823
Un polinomio de Lagrange L
N
(x) de grado N es la expresin
Como puede probarse fcilmente este polinomio pasa por todos los puntos (x
i
,y
i
).
Podemos elaborar una funcin denominada lagrange_3 que devuelva el valor interpolado yy de xx cuando se le
pasa los vectores x e y que guardan las abscisas y ordenadas (x
i
,y
i
) de los datos
function yy = lagrange_3(x,y,xx)
n = length(x);
for i=1:n
w(i)=prod(xx-x([1:i-1 i+1:n]))*y(i)/prod( x(i)-x([1:i-1 i+1:n]) ) ;
end
yy=sum(w);
end
Llamamos a la funcin lagrange_3 para conocer los valores interpolados de xx=1.0 y xx=2.0
>> x=[0.97 1.12 2.92 3.00 3.33 3.97 6.10 8.39 8.56 9.44];
>> y=[2.58 0.43 0.06 5.74 7.44 8.07 6.37 2.51 1.44 0.52];
(x) = + L
N
(x )(x )...(x ) x
2
x
3
x
N+1
( )( )...( ) x
1
x
2
x
1
x
3
x
1
x
N+1
y
1
+ ... +
(x )(x )...(x ) x
1
x
3
x
N+1
( )( )...( ) x
2
x
1
x
2
x
3
x
2
x
N+1
y
2
(x )(x )...(x ) x
1
x
2
x
N
( )( )...( ) x
N+1
x
1
x
N+1
x
2
x
N+1
x
N
y
N+1
>> yy=lagrange_3(x,y,1.0)
yy = 10.0725
>> yy=lagrange_3(x,y,2.0)
yy = -203.7000
Alternativamente, podemos elaborar una funcin denominada lagrange_p que devuelva los coeficientes del
polinomio. El polinomio de Lagrange es la suma de N+1 trminos. El numerador de cada trmino es el producto
de N binomios (x-x
i
)
function p=lagrange_p(x,y)
n=length(x); %n-1 es el grado del polinomio
if length(y)~=n
error('x e y tienen que tener la misma longitud')
end
p=zeros(1,n);
for i=1:n
pol=[y(i)];
for j=1:n
if(i~=j)
pol=conv([1 -x(j)],pol)/(x(i)-x(j)); %multiplica un polinomio por un
binomio
end
end
p=p+pol;
end
end
Para obtener el producto de los binomios del numerador de cada trmino, utilizamos la funcin conv, vase la
pgina Polinomios. Por ejemplo, queremos multiplicar los polinomios p
1
=x
3
-2x-4 y p
2
=x
2
+3x+4
>> p1=[1 0 -2 -4];
>> p2=[1 3 4];
>> p=conv(p1,p2)
p = 1 3 2 -10 -20 -16
Utilizamos la funcin lagrange_p para obtener los coeficientes del polinomio de Lagrange con los datos del
ejemplo anterior.
>> x=[0.97 1.12 2.92 3.00 3.33 3.97 6.10 8.39 8.56 9.44];
>> y=[2.58 0.43 0.06 5.74 7.44 8.07 6.37 2.51 1.44 0.52];
>> p=lagrange_p(x,y)
p = 1.0e+004 *
0.0000 -0.0003 0.0057 -0.0595 0.3782 -1.4951 3.6430 -5.2142
3.9256 -1.1823
Obtenemos el mismo resultado, que resolviendo el sistema de N+1 ecuaciones lineales.
Una vez obtenido el polinomio de Lagrange podemos calcular el valor de y para valores de x que no estn en la
tabla.
>> xx=[1.0 2.0 3.5];
>> yy=polyval(p,xx)
yy = 10.0725 -203.7000 1.8338
Para estos datos, la interpolacin de Lagrange parece que no produce buenos resultados
Splines
Vamos a explicar mediante un ejemplo el procedimiento de interpolacin denominado "splines", para
generalizarlo despus a cualquier conjunto de pares de datos.
Dado el conjunto de pares de datos (x
1
,y
1
), (x
2
,y
2
), (x
3
,y
3
), (x
4
,y
4
), (x
5
,y
5
) puntos de color rojo en la fihgura.
Definimos la funcin S(x)
S(x) =
?
?
?
?
?
(x) x < s
1
x
1
x
2
(x) x < s
2
x
2
x
3
Cada una de las funciones s
i
(x) en color azul en la figura, es un polinomio de tercer grado, cuya primera y
segunda derivada es
Para calcular las 44=16 incgnitas a
1
,a
2
,a
3
,a
4
, b
1
,b
2
,b
3
,b
4
, c
1
,c
2
,c
3
,c
4
, d
1
,d
2
,d
3
,d
4
, se imponen las siguientes
condiciones:
1. La funcin S(x) pasa por todos los puntos (x
i
,y
i
) i=1,2,3,4,5
2. La funcin S(x) es continua en x
2
, x
3
, x
4
.
3. La derivada primera de la funcin S(x) es continua en x
2
, x
3
, x
4
.
4. Denominamos m
1
, m
2
, m
3
, m
4
, m
5
al valor de la derivada segunda de s
i
(x) en los puntos x
1
, x
2
, x
3
, x
4
, x
5
.
5. La derivada segunda de S(x) es continua en los puntos x
2
, x
3
, x
4
Supongamos que el espaciado entre dos puntos consecutivos es constante h=x
i
-x
i-1
, i=2,3,4,5.
Vamos a expresar las incgnitas a
1
,a
2
,a
3
,a
4
, b
1
,b
2
,b
3
,b
4
, c
1
,c
2
,c
3
,c
4
, d
1
,d
2
,d
3
,d
4
, en trminos de h, el valor de las
ordenadas y
i
y el valor de la derivada segunda de S(x), m
i
en cada punto x
i
, i=1,2,3,4,5.
De (4) y (5) expresamos a
1
,a
2
, a
3
, a
4
en trminos de m
1
, m
2
, m
3
, m
4
, m
5
.
Teniendo en cuenta (1) y (4), las ecuaciones (2) se expresan
?
?
?
?
?
?
(x) x < s
3
x
3
x
4
(x) x < s
4
x
4
x
5
(x) = + + (x ) + i = 1,2,3,4 s
i
a
i
(x ) x
i
3
b
i
(x ) x
i
2
c
i
x
i
d
i
= 3 + 2 (x ) +
ds
i
dx
a
i
(x ) x
i
2
b
i
x
i
c
i
= 6 (x ) + 2
d
2
s
i
dx
2
a
i
x
i
b
i
i = 1,2,3,4
( ) = s
i
x
i
y
i
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
= d
1
y
1
= d
2
y
2
= d
3
y
3
= d
4
y
4
+ + ( ) + = a
4
( ) x
5
x
4
3
b
4
( ) x
5
x
4
2
c
4
x
5
x
4
d
4
y
5
( ) = ( ) s
i1
x
i
s
i
x
i
?
?
?
?
?
?
?
+ + ( ) + = a
1
( ) x
2
x
1
3
b
1
( ) x
2
x
1
2
c
1
x
2
x
1
d
1
d
2
+ + ( ) + = a
2
( ) x
3
x
2
3
b
2
( ) x
3
x
2
2
c
2
x
3
x
2
d
2
d
3
+ + ( ) + = a
3
( ) x
4
x
3
3
b
3
( ) x
4
x
3
2
c
3
x
4
x
3
d
3
d
4
s ( ) = s ( ) '
i1
x
i
'
i
x
i
?
?
?
?
?
?
?
3 + 2 ( ) + = a
1
( ) x
2
x
1
2
b
1
x
2
x
1
c
1
c
2
3 + 2 ( ) + = a
2
( ) x
3
x
2
2
b
2
x
3
x
2
c
2
c
3
3 + 2 ( ) + = a
3
( ) x
4
x
3
2
b
3
x
4
x
3
c
3
c
4
s' ( ) = '
i
x
i
m
i
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
2 = b
1
m
1
2 = b
2
m
2
2 = b
3
m
3
2 = b
4
m
4
6 ( ) + 2 = a
4
x
5
x
4
b
4
m
5
s' ( ) = s' ( ) '
i1
x
i
'
i
x
i
?
?
?
?
?
6 ( ) + 2 = 2 a
1
x
2
x
1
b
1
b
2
6 ( ) + 2 = 2 a
2
x
3
x
2
b
2
b
3
6 ( ) + 2 = 2 a
3
x
4
x
3
b
3
b
4
= = = = a
1
m
2
m
1
6h
a
2
m
3
m
2
6h
a
3
m
4
m
3
6h
a
4
m
5
m
4
6h
?
?
?
?
?
?
?
?
+ + h + =
m
2
m
1
6h
h
3
m
1
2
h
2
c
1
y
1
y
2
+ + h + =
m
3
m
2
h
3
m
2
h
2
c
2
y
2
y
3
Que nos permite despejar c
1
, c
2
, c
3
en trminos de m
1
, m
2
, m
3
, m
4
, y
1
, y
2
, y
3
, y
4
La ltima ecuacin de (1) nos permite despejar c
4
Las ecuaciones (3) se expresan
Tenemos tres ecuaciones y cinco incgnitas m
1
, m
2
, m
3
, m
4
, m
5
Fijamos los valores de la derivada segunda m
1
y m
5
en los puntos extremos. Supongamos que m
1
=0 y m
5
=0.
Hay otras posibilidades que se pueden consultar en el documento
http://online.redwoods.edu/instruct/darnold/laproj/Fall98/SkyMeg/Proj.PDF
Despejamos m
2
, m
3
, m
4
del sistema de tres ecuaciones
Caso general
En general, con n pares de datos tendremos el sistema
Fijamos los valores de los extremos del vector de las incgnitas m: m =0, m =0, a continuacin, obtenemos
?
?
?
?
?
?
?
6h 2
+ + h + =
m
4
m
3
6h
h
3
m
3
2
h
2
c
3
y
3
y
4
= h c
1
y
2
y
1
h
+ 2 m
2
m
1
6
= h c
2
y
3
y
2
h
+ 2 m
3
m
2
6
= h c
3
y
4
y
3
h
+ 2 m
4
m
3
6
+ + h + =
m
5
m
4
6h
h
3
m
4
2
h
2
c
4
y
4
y
5
= h c
4
y
5
y
4
h
+ 2 m
5
m
4
6
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
3 + h + h = h
m
2
m
1
6h
h
2
m
1
y
2
y
1
h
+ 2 m
2
m
1
6
y
3
y
2
h
+ 2 m
3
m
2
6
3 + h + h = h
m
3
m
2
6h
h
2
m
2
y
3
y
2
h
+ 2 m
3
m
2
6
y
4
y
3
h
+ 2 m
4
m
3
6
3 + h + h = h
m
4
m
3
6h
h
2
m
3
y
4
y
3
h
+ 2 m
4
m
3
6
y
5
y
4
h
+ 2 m
5
m
4
6
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
+ 4 + = ( 2 + ) m
1
m
2
m
3
6
h
2
y
1
y
2
y
3
+ 4 + = ( 2 + ) m
2
m
3
m
4
6
h
2
y
2
y
3
y
4
+ 4 + = ( 2 + ) m
3
m
4
m
5
6
h
2
y
3
y
4
y
5
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
+ 4 + = ( 2 + ) m
1
m
2
m
3
6
h
2
y
1
y
2
y
3
+ 4 + = ( 2 + ) m
2
m
3
m
4
6
h
2
y
2
y
3
y
4
+ 4 + = ( 2 + ) m
3
m
4
m
5
6
h
2
y
3
y
4
y
5
=
?
?
?
4
1
0
1
4
1
0
1
4
?
?
?
?
?
?
m
2
m
3
m
4
?
?
?
6
h
2
?
?
?
2 + y
1
y
2
y
3
2 + y
2
y
3
y
4
2 + y
3
y
4
y
5
?
?
?
=
?
?
?
?
?
?
?
?
?
?
4
1
0
0
....
0
1
4
1
0
...
0
0
1
4
1
...
0
0
0
1
4
...
...
...
...
...
...
...
1
0
0
0
0
...
4
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
m
2
m
3
m
4
m
5
...
m
n1
?
?
?
?
?
?
?
?
?
?
6
h
2
?
?
?
?
?
?
?
?
?
?
?
2 + y
1
y
2
y
3
2 + y
2
y
3
y
4
2 + y
3
y
4
y
5
2 + y
4
y
5
y
6
....
2 + y
n2
y
n1
y
n
?
?
?
?
?
?
?
?
?
?
?
1 n-1
mediante el operador divisin por la izquierda los valores de m
2
, m
3
, ...m
n-2
, finalmente, se calculan:
los coeficientes a
1
,a
2
,a
3
,...a
n-1.
los coeficientes b
1
,b
2
,b
3
,...b
n-1.
los coeficientes c
1
,c
2
,c
3
,...c
n-1.
los coeficientes d
1
,d
2
,d
3
,...d
n-1.
Codificacin
En primer lugar, vamos a entender como trabaja la funcin diag de MATLAB. La funcin diag extrae vectores
diagonales de la matriz A.
>> A=[1,2,3;4,5,6;7,8,9]
A =
1 2 3
4 5 6
7 8 9
>> diag(A) %diagonal principal
ans =
1
5
9
>> diag(A,1) %diagonal superior
ans =
2
6
>> diag(A,-1) %diagonal inferior
ans =
4
8
La funcin diag nos permite crear una matriz a partir de los vectores de sus diagonales
A=diag(4*ones(3,1))+diag(ones(2,1),1)+diag(ones(2,1),-1)
A =
4 1 0
1 4 1
0 1 4
La funcin diff calcula la diferencia entre dos elementos consecutivos del vector y
El vector de los trminos independientes se calcula aplicando dos veces la funcin diff al vector y de las
ordenadas.
Estamos en condiciones de crear un script que calcule las incgnitas m
2
, m
3
, ... m
n-1
, aplicando el operador
divisin por la izquierda.
x=-4:4;
y=sin(x)./(1+x.^2);
h=x(2)-x(1); %espaciado constante
n=length(x); %nmero de pares de datos
A=diag(4*ones(n-2,1))+diag(ones(n-3,1),1)+diag(ones(n-3,1),-1); %matriz de dimensin n-2
= = = .... = a
1
m
2
m
1
6h
a
2
m
3
m
2
6h
a
3
m
4
m
3
6h
a
n1
m
n
m
n1
6h
= = = .... = b
1
m
1
2
b
2
m
2
2
b
3
m
3
2
b
n1
m
n1
2
= h c
1
y
2
y
1
h
+ 2 m
2
m
1
6
= h c
2
y
3
y
2
h
+ 2 m
3
m
2
6
= h c
3
y
4
y
3
h
+ 2 m
4
m
3
6
.....
= h c
n1
y
n
y
n1
h
+ 2 m
n
m
n1
6
= = = .... = d
1
y
1
d
2
y
2
d
3
y
3
d
n1
y
n1
y = [ , , , , ] y
1
y
2
y
3
y
4
y
5
= diff(y) = [ , , , ] d
1
y
2
y
1
y
3
y
2
y
4
y
3
y
5
y
4
= diff( ) = [ 2 , 2 , 2 ] d
2
d
1
y
3
y
2
y
1
y
4
y
3
y
2
y
5
y
4
y
3
s=diff(diff(y))*6/h^2; %vector de los trminos indpendientes
mm=A\s'; %vector de las incgnitas
m=[0;mm;0]; %ceros en los extremos
for i=1:n-1
a(i)=(m(i+1)-m(i))/(6*h);
b(i)=m(i)/2;
c(i)=(y(i+1)-y(i))/h-(m(i+1)+2*m(i))*h/6;
d(i)=y(i);
end
%dibuja los puntos
hold on
plot(x,y,'o','markersize',4,'markeredgecolor','b','markerfacecolor','b')
for i=1:n-1
xx=x(i):h/50:x(i+1);
yy=a(i)*(xx-x(i)).^3+b(i)*(xx-x(i)).^2+c(i)*(xx-x(i))+d(i);
plot(xx,yy,'r')
end
xx=linspace(-4,4,300); %funcin
yy=sin(xx)./(1+xx.^2);;
plot(xx,yy,'g')
hold off
grid on
xlabel('x')
ylabel('y')
title('Interpolacin por splines')
Si superponemos la funcin (en color verde)
con los nueve puntos unidos mediante polinomios de tercer grado (en color rojo) veremos que la curva
interpolada y la exacta estn prximas.
Los puntos de color azul, son los nueve pares de datos, cada una de las curvas de color rojo entre dos puntos
azules consecutivos es un polinomio de tercer grado que pasa por dichos puntos y cumple las condiciones de
continuidad de su derivada primera y segunda.
Comparacin
Funcin splinede MATLAB
Utilizamos la funcin spline de MATLAB, pero es posible que las condiciones en los extremos que en el ejemplo
anterior se han establecido en m
1
=0, m
n-1
=0, sean ahora diferentes.
x=-4:4;
y=sin(x)./(1+x.^2);
%dibuja los puntos
y =
sin(x)
+ 1 x
2
hold on
plot(x,y,'o','markersize',4,'markeredgecolor','b','markerfacecolor','b')
xx=linspace(-4,4,300);
yy=spline(x,y,xx); %interpolacin
plot(xx,yy, 'r')
yy=sin(xx)./(1+xx.^2);
plot(xx,yy,'g') %funcin
hold off
grid on
xlabel('x')
ylabel('y')
title('Interpolacin por splines de MATLAB')
Interplacin de Lagrange
Ahora interpolamos mediante un polinomio de grado n-1 que pasa por los nueve puntos (x
i
,y
i
) del ejemplo
anterior
x=-4:4;
y=sin(x)./(1+x.^2);
%dibuja los puntos
hold on
plot(x,y,'o','markersize',4,'markeredgecolor','b','markerfacecolor','b')
n=length(x);
p=polyfit(x,y,n-1); %polinomio que pasa por los puntos
%p=lagrange_p(x,y); %se obtiene el mismo resultado
xx=linspace(-4,4,300); %superposicin de la curva
yy=polyval(p,xx);
plot(xx,yy, 'r')
yy=sin(xx)./(1+xx.^2);
plot(xx,yy,'g')
hold off
grid on
xlabel('x')
ylabel('y')
title('Interpolacin por Lagrange')
El resultado deja mucho que desear principalmente, en el primer y ltimo intervalo.
Aproximacin de funciones
Muchas funciones matemticas tales como sin(x), exp(x), se pueden representar cerca de x=0 por un desarrollo en
serie de Taylor. Si el desarrollo en serie converge rpidamente, tomando los primeros trminos se puede
aproximar la funcin f(x) por un polinomio de grado n no muy elevado.
Tomamos n valores de la funcin y
i
=f(x
i
) con i=1...n. y determinamos el polinomio de grado n-1 que pasa a travs
de los puntos (x
i
,y
i
). Sea la funcin
Tomamos diez abscisas x
i
espaciadas 0.8 en el intervalo [-4,4]. Representamos la funcin (en color rojo), los
puntos (x
i
,y
i
) y el polinomio que pasa por dichos puntos (en color azul). Dado que la funcin es simtrica
solamente representamos la parte positiva.
f=@(x) 1./(x.^2+1);
n=10;
a=-4;
b=4;
xx=linspace(a,b,n+1);
yy=f(xx);
p=polyfit(xx,yy,n);
x1=linspace(0,b,100);
y1=polyval(p,x1) %aproximacin mediante el polinomio p
y2=f(x1); %funcin
hold on
plot(x1,y1,'b')
plot(x1,y2,'r')
plot(xx(xx>=0),yy(xx>=0),'ro','markersize',2,'markerfacecolor','r')
hold off
xlabel('x')
ylabel('y')
title('Interpolacin de una funcin')
y =
1
+ 1 x
2
Sorprendentemente, si los puntos no estn igualmente espaciados, podemos obtener una mejor aproximacin. Si
tomamos los puntos en el intervalo [a,b] espaciados de acuerdo a la frmula denominada puntos de Chebyshev,
que se estudiar en la prxima pgina.
La funcin linspace, nos crea un vector de abscisas x
i
igualmente espaciados entre a y b. La funcin que hemos
denominado lincheby crea un vector de abscisas x
i
, espaciados de acuerdo a la frmula anterior.
f=@(x) 1./(x.^2+1);
lincheby=@(a,b,n) (a+b)/2+(a-b)/2*cos(pi/n*(1/2:n));
n=10;
a=-4;
b=4;
xx=lincheby(a,b,n+1);
yy=f(xx);
p=polyfit(xx,yy,n);
x1=linspace(0,b,100);
y1=polyval(p,x1); %aproximacin mediante el polinomio p
y2=f(x1); %funcin
hold on
plot(x1,y1,'b')
plot(x1,y2,'r')
plot(xx(xx>=0),yy(xx>=0),'ro','markersize',2,'markerfacecolor','r')
hold off
xlabel('x')
ylabel('y')
title('Interpolacin de una funcin')
= + cos ( (i )) 1 i n x
i
a + b
2
a b
2

n
1
2
Como podemos apreciar la mejora es importante
Ajuste de datos
En esta pgina, estudiaremos la regresin lineal, es decir la determinacin de la ecuacin de la recta que mejor
ajusta a una distribucin bidimensional de datos. Se explicar el mtodo de los mnimos cuadrados para
aproximar un polinomio a un conjunto de datos experimentales.
Regresin lineal
http://www.sc.ehu.es/sbweb/fisica_/cinematica/rectilineo/regresion/regresion.html
Abordaremos en esta pgina las distribuciones bidimensionales. Las observaciones se dispondrn en dos
columnas, de modo que en cada fila figuren la abscisa x y su correspondiente ordenada y. La importancia de las
distribuciones bidimensionales radica en investigar como influye una variable sobre la otra. Esta puede ser una
dependencia causa efecto, por ejemplo, la cantidad de lluvia (causa), da lugar a un aumento de la produccin
agrcola (efecto). O bien, el aumento del precio de un bien, da lugar a una disminucin de la cantidad demandada
del mismo.
Si utilizamos un sistema de coordenadas cartesianas para representar la distribucin bidimensional, obtendremos
un conjunto de puntos conocido con el diagrama de dispersin, cuyo anlisis permite estudiar cualitativamente,
la relacin entre ambas variables. El siguiente paso, es la determinacin de la dependencia funcional entre las
dos variables x e y que mejor ajusta a la distribucin bidimensional. Se denomina regresin lineal cuando la
funcin es lineal, es decir, requiere la determinacin de dos parmetros: la pendiente y la ordenada en el origen
de la recta de regresin, y=ax+b.
La regresin nos permite adems, determinar el grado de dependencia de las series de valores X e Y, prediciendo
el valor y estimado que se obtendra para un valor x que no est en la distribucin.
Vamos a determinar la ecuacin de la recta que mejor ajusta a los datos representados en la figura. Se denomina
error
i
a la diferencia y
i
-y, entre el valor observado y
i
, y el valor ajustado y= ax
i
+b, tal como se ve en la figura
inferior. El criterio de ajuste se toma como aqul en el que la desviacin cuadrtica media sea mnima, es decir,
debe de ser mnima la suma
El extremos de una funcin: mximo o mnimo se obtiene cuando las derivadas de E respecto de a y de b sean
nulas. Lo que da lugar a un sistema de dos ecuaciones con dos incgnitas del que se despeja a y b.
E = =
1
n

2
i

1
n
( (a + b)) y
i
x
i
2
= 0 = 0
E
a
E
b
n ( ) ( )
1
n
x
i
y
i

1
n
x
i

1
n
y
i
a
1
n
y
i

1
n
x
i
Expresiones ms elaboradas nos permiten determinar el error de a, a y el error de b, b
La pendiente de la recta se escribir aa, y la ordenada en el origen bb. Vase las reglas para expresar una
medida y su error de una magnitud.
El coeficiente de correlacin es otro parmetro para el estudio de una distribucin bidimensional, que nos indica
el grado de dependencia entre las variables X e Y. El coeficiente de correlacin r es un nmero que se obtiene
mediante la frmula.
El numerador es el producto de las desviaciones de los valores X e Y respecto de sus valores medios. En el
denominador tenemos las desviaciones cuadrticas medias de X y de Y.
El coeficiente de correlacin puede valer cualquier nmero comprendido entre -1 y +1.
Cuando r=1, la correlacin lineal es perfecta, directa.
Cuando r=-1, la correlacin lineal es perfecta, inversa
Cuando r=0, no existe correlacin alguna, independencia total de los valores X e Y
Ejemplo
Un vehculo que se mueve supuestamente con velocidad constante. Los datos de las medidas del tiempo en cuatro
posiciones separadas 900 m son las siguientes
Tiempo t (s) Posicin x (m)
17.6 0
40.4 900
67.7 1800
90.1 2700
Ajustar los datos a la lnea recta
x=x
0
+vt
y estimar el mejor valor de la velocidad v aplicando el procedimiento de mnimos cuadrados
Utilizando el applet de la pgina Regresin lineal, obtenemos los siguientes valores: la pendiente es a=36.71 y el
error de la pendiente a=1.001. La velocidad se escribe (vase la pgina Errores en las medidas)
v=371 m/s
function [a b]=regresion(x,y)
n=length(x);
a=zeros(2,1);
b=zeros(2,1);
%pendiente de la recta de regresin, a
a(1)=(n*sum(x.*y)-sum(x)*sum(y))/(n*sum(x.^2)-sum(x)*sum(x));
%ordenada en el origen, b
b(1)=(sum(y)-a(1)*sum(x))/n;
% errores de a y de b
sd2=sum((y-a(1)*x-b(1)).^2);
a = b =
n
1
n
x
2
i
( )
1
n
x
i
2
n
a = =
n

n
1
n
x
2
i
( )
1
n
x
i
2

?
?
?
?

1
n
( a b) y
i
x
i
2
n 2

?
?
?
?
?
b = a

1
n
x
2
i
n

?
?
?
?
?
r =
( < x >)( < y >)
1
n
x
i
y
i

1
n
( < x >) x
i
2


1
n
( < y >) y
i
2

a(2)=sqrt(sd2/(n-2))/sqrt(sum(x.^2)-sum(x)*sum(x)/n);
b(2)=sqrt(sum(x.^2)/n)*a(2);
end
En el vector a de dimensin 2 hemos guardado la pendiente en a(1) y su error en a(2)
En el vector b de dimensin 2 hemos guardado la ordenada en b(1) y su error en b(2)
Escribimos el script datos_1 para calcular la pendiente a de la recta de regresin, su error a, la ordenada en el
origen b y su error b.
t=[17.6 40.4 67.7 90.1];
x=[0 900 1800 2700];
[a b]=regresion(t,x);
fprintf('pendiente a= %2.3f, error %1.3f\n',a(1),a(2));
fprintf('ordenada b= %3.3f, error %3.3f\n',b(1),b(2));
%grfica
plot(t,x,'ro','markersize',8,'markerfacecolor','r')
tmin=min(t);
xmin=a(1)*tmin+b(1);
tmax=max(t);
xmax=a(1)*tmax+b(1);
line([tmin tmax],[xmin xmax]); %recta
xlabel('t')
ylabel('x')
title('Regresin lineal')
En la ventana de comandos corremos el script datos_1
>> datos_1
pendiente a= 36.710, error 1.001
ordenada b= -630.509, error 60.580
Queda como trabajo al lector calcular el coeficiente de correlacin. Solucin r=0.99926
La funcin potencial
y=cx
a
Se puede trasformar en
log y=alog x+log c
Si usamos las nuevas variables X=log x e Y=log y, obtenemos la relacin lineal
Y=aX+b.
Donde b=log c
Ejemplo:
x 10 20 30 40 50 60 70 80
y 1.06 1.33 1.52 1.68 1.81 1.91 2.01 2.11
Representamos estos datos en un diagrama doblemente logartmico mediante el comando loglog
x=[10 20 30 40 50 60 70 80];
y=[1.06 1.33 1.52 1.68 1.81 1.91 2.01 2.11];
loglog(x,y,'ro','markersize',2,'markerfacecolor','r')
xlabel('x')
ylabel('y')
title('Funcin potencial')
Para determinar la recta de regresin, se transforma esta tabla de datos en esta otra
X=log x 1.0 1.30 1.477 1.60 1.699 1.778 1.845 1.903
Y=log y 0.025 0.124 0.182 0.225 0.258 0.281 0.303 0.324
Calculamos mediante la funcin regresion los parmetros a y c.
Escribimos el script datos_2
x=[10 20 30 40 50 60 70 80];
y=[1.06 1.33 1.52 1.68 1.81 1.91 2.01 2.11];
[a b]=regresion(log10(x),log10(y));
fprintf('exponente a= %2.3f\n',a(1));
fprintf('coeficiente c= %3.3f\n',10^b(1));
%grfica
hold on
plot(x,y,'ro','markersize',8,'markerfacecolor','r')
z=(10^b(1))*x.^a(1);
plot(x,z,'b')
xlabel('x')
ylabel('y')
title('Regresin potencial')
hold off
Corremos el script datos_2 en la ventana de comandos
>> datos_2
exponente a= 0.331
coeficiente c = 0.495
Funcin exponencial
y=ce
ax
Tomando logaritmos neperianos en los dos miembros resulta
ln y=ax+ln c
Si ponemos ahora X=x, e Y=ln y, obtenemos la relacin lineal
Y=aX+b
Donde b=ln c.
Ejemplo:
x 12 41 93 147 204 264 373 509 773
y 930 815 632 487 370 265 147 76 17
Representamos estos datos en un diagrama semilogartmico mediante el comando semilogy
x=[12 41 93 147 204 264 373 509 773];
y=[930 815 632 487 370 265 147 76 17];
semilogy(x,y,'ro','markersize',2,'markerfacecolor','r')
xlabel('x')
ylabel('y')
title('Funcin exponencial')
grid on
Para determinar la recta de regresin, se transforma esta tabla de datos en esta otra
X= x 12 41 93 147 204 264 373 509 773
Y=ln y 6.835 6.703 6.449 6.188 5.913 5.580 4.990 4.330 2.833
Escribimos el script datos_3
x=[12 41 93 147 204 264 373 509 773];
y=[930 815 632 487 370 265 147 76 17];
[a b]=regresion(x,log(y));
fprintf('exponente a= %2.3f\n',a(1));
fprintf('coeficiente c = %3.3f\n',exp(b(1)));
%grficos
hold on
plot(x,y,'ro','markersize',8,'markerfacecolor','r')
x=linspace(min(x),max(x),100);
y=exp(b(1))*exp(x*a(1));
plot(x,y,'b')
xlabel('x')
ylabel('y')
title('Regresin exponencial')
hold off
Corremos el script datos_3 en la ventana de comandos
>> datos_3
exponente a= -0.005
coeficiente c = 1036.896
Polinomio aproximador
Supongamos que hemos medido un conjunto de pares de datos (x
i
, y
i
) en una experiencia, por ejemplo, la
posicin de un mvil en ciertos instantes de tiempo.
Queremos obtener una funcin y=f(x) que se ajuste lo mejor posible a los valores experimentales. Se pueden
ensayar muchas funciones, rectas, polinomios, funciones potenciales o logartmicas.
Una vez establecido la funcin a ajustar se determinan sus parmetros, en el caso de un polinomio, sern los
coeficientes del polinomio de modo que los datos experimentales se desven lo menos posible de la frmula
emprica. La funcin ms sencilla es la funcin lineal y=ax+b, que hemos descrito en la seccin anterior
Queremos aproximar un polinomio de grado n, a un conjunto de m pares de datos (x
i
, y
i
) de modo que n<m. Sea
el polinomio
P(x)=a
1
x
n
+a
2
x
n-1
+...a
n
x+a
n+1
Se calcula la cantidad
Para obtener los valores de los coeficientes del polinomio aproximador se tienen que determinar los valores de los
coeficientes a
1
, a
2
, a
3
, ...a
n
, a
n+1
de forma que la cantidad S tome un valor mnimo.
Hagamos las derivadas parciales de S respecto de a
1
, a
2
, a
3
, ...a
n
, a
n+1
iguales a cero
S = =
j=1
m
(P( ) ) x
i
y
i
2

j=1
m
( + + + ) a
1
x
n
j
a
2
x
n1
j
a
n
x
j
a
n+1
y
i
2
= ( + + + )
1
2
S
a
1

j=1
m
a
1
x
n
j
a
2
x
n1
j
a
n
x
j
a
n+1
y
i
x
n
j
= ( + + + )
1
2
S
a
2

j=1
m
a
1
x
n
j
a
2
x
n1
j
a
n
x
j
a
n+1
y
i
x
n1
j
....................................
= ( + + + )
1
2
S
a
n

j=1
m
a
1
x
n
j
a
2
x
n1
j
a
n
x
j
a
n+1
y
i
x
j
= ( + + + )
1
2
S
a
n+1

j=1
m
a
1
x
n
j
a
2
x
n1
j
a
n
x
j
a
n+1
y
i
Obtenemos un sistema de n+1 ecuaciones con n+1 incgnitas, a
1
, a
2
, a
3
, ...a
n
, a
n+1
que podemos escribir, altenativamente
function p=pol_regresion(x,y,n)
s=zeros(2*n+1,1);
t=zeros(n+1,1);
A=zeros(n+1);
for k=1:2*n+1
s(k)=sum(x.^(2*n+1-k));
end
%vector de los trminos independientes
for k=1:n+1
t(k)=sum(y.*x.^(n+1-k));
end
%elementos de la matriz A de las incgnitas
for i=1:n+1
for j=1:n+1
A(i,j)=s(i+j-1);
end
end
%coeficientes del polinomio a1, a2... an, an+1
p=A\t;
end
A la funcin pol_regresion se le pasa los vectores x e y de datos el grado n del polinomio aproximador y
devuelve los coeficientes del polinomio en el vector columna p.
La funcin calcula los elementos de la matriz A de las incgnitas, el vector t de los trminos independientes y
resuelve el sistema de n+1 ecuaciones con n+1 incgnitas mediante el operador divisin por la izquierda.
Ejemplo
Una experiencia que se puede llevar a cabo con la ayuda de un cronmetro es la de establecer una relacin entre
la lectura n del contador del reproductor de la casete y el tiempo t transcurrido. Vamos a comprobar que esta
relacin no es lineal
Se sugiere al lector que analice el comportamiento de su reproductor de casete y complete una tabla como la
siguiente, y represente los datos en una grfica semejante a la figura ms abajo
http://www.sc.ehu.es/sbweb/fisica_/cinematica/circular/casete/casete1.html
n t (s)
0 0
100 242
200 487
300 854
400 1220
500 1626
600 2072
700 2558
n/100 t(min)
0 0
1 4.03
2 8.12
3 14.23
4 20.33
5 27.1
6 34.53
7 42.63
+ + ... + + =
?
?

j=1
m
x
2n
j
?
?
a
1
?
?

j=1
m
x
2n1
j
?
?
a
2
?
?

j=1
m
x
n+1
j
?
?
a
n
?
?

j=1
m
x
n
j
?
?
a
n+1

j=1
m
y
j
x
n
j
+ + ... + + =
?
?

j=1
m
x
2n1
j
?
?
a
1
?
?

j=1
m
x
2n2
j
?
?
a
2
?
?

j=1
m
x
n
j
?
?
a
n
?
?

j=1
m
x
n1
j
?
?
a
n+1

j=1
m
y
j
x
n1
j
.........
+ + ... + + m =
?
?

j=1
m
x
n
j
?
?
a
1
?
?

j=1
m
x
n1
j
?
?
a
2
?
?

j=1
m
x
j
?
?
a
n
a
n+1

j=1
m
y
j
?
?
?
?
?
?
?
?
?
?
?
+ + .... + = s
1
a
1
s
2
a
2
s
n
a
n
s
n+1
a
n+1
t
1
+ + .... + = s
2
a
1
s
3
a
2
s
n+1
a
n
s
n+2
a
n+1
t
2
.......
+ + .... + = s
n+1
a
1
s
n+2
a
2
s
2n
a
n
s
2n+1
a
n+1
t
n+1
= k = 1...2n + 1 s
k

j=1
m
x
2n+1k
j
= k = 1...n + 1 t
k

j=1
m
y
j
x
n+1k
j
744 2786
7.44 46.43
Ajustar el conjunto de pares de datos de la tabla de la derecha a un polinomio de segundo grado a
1
x
2
+a
2
x+a
3
.
Creamos el script datos_5 con los datos y llamamos a la funcin pol_regresion
x=[0 1 2 3 4 5 6 7 7.44];
y=[0 4.03 8.12 14.23 20.33 27.1 34.53 42.63 46.43];
p=pol_regresion(x,y,2)
%grficos
hold on
plot(x,y,'ro','markersize',8,'markerfacecolor','r')
x=linspace(min(x),max(x),50);
y=polyval(p,x);
plot(x,y,'b')
xlabel('x')
ylabel('y')
title('Polinomio aproximador')
hold off
En la ventana de comandos corremos el script datos_5, y nos aparece el vector p que contiene los coeficientes
a
1,
a
2
, a
3
del polinomio
>> datos_5
p =
0.3446
3.7004
-0.1188
Ajuste de datos con MATLAB
MATLAB dispone de la funcin polyfit para ajustar datos a un polinomio de grado n. Tambin tiene la
posibilidad de ajustar los datos de forma interactiva en la ventana grfica (Figure Windows) seleccionado en el
men Tools/Basic Fitting.
Ajuste de datos con el operador, divisin por la izquierda \.
Conocidos los n pares de datos (x
i
,y
i
) i=1,2...n resolvemos el sistema de n ecuaciones para determinar las
incgnitas, los coeficientes a
1,
a
2
, a
3
del polinomio que mejor ajusta
Tenemos n=9 pares de datos (x
i
,y
i
). Por lo que tenemos un sistema de nueve ecuaciones con tres incgnitas, que
podemos resolver con el operador \ (divisin por la izquierda)
x=[0,1,2,3,4,5,6,7,7.44]';
y=[0,4.03,8.12,14.23,20.33,27.1,34.53,42.63,46.43]';
M=[x.^2,x,ones(size(x))];
a=M\y %coeficientes del polinomio
hold on
plot(x,y,'ro','markersize',8,'markerfacecolor','r')
x=(0:0.1:max(x))';
y=[x.^2,x,ones(size(x))]*a; %evala el polinomio para cada valor de x
plot(x,y,'b')
xlabel('x')
ylabel('y')
title('Polinomio aproximador')
hold off
En la ventana de comandos vemos los coeficientes a
1,
a
2
, a
3
como elementos del vector a. En la ventana grfica
se obtiene una figura similar.
a =
0.3446
3.7004
-0.1188
Ajuste de datos con polyfit
Para el ajuste de datos a un polinomio se utiliza la funcin MATLAB polifit, cuya sintaxis es la siguiente:
p=polyfit(x,y,n)
x, y son los vectores de las abscisas y de las ordenadas de los datos, respectivamente
n, es el grado del polinomio al que se quieren ajustar los datos
p, es el vector de los coeficientes de dicho polinomio.
Para n=1 tenemos la regresin lineal. Si m es el nmero de datos, el polinomio pasa a travs de todos los puntos si
n=m-1. El grado n del polinomio no puede ser mayor que m-1.
Renombramos el script datos_5 como datos_6, para cambiar la llamada a la funcin MATLAB polyfit en vez de
a pol_regresion
x=[0 1 2 3 4 5 6 7 7.44];
y=[0 4.03 8.12 14.23 20.33 27.1 34.53 42.63 46.43];
y = + x + a
1
x
2
a
2
a
3
=
?
?
?
?
?
?
y
1
y
2
...
y
n
?
?
?
?
?
?
?
?
?
?
?
?
x
2
1
x
2
2
...
x
2
n
x
1
x
2
...
x
n
1
1
...
1
?
?
?
?
?
?
?
?
?
a
1
a
2
a
3
?
?
?
p=polyfit(x,y,2)
%grficos
hold on
plot(x,y,'ro','markersize',8,'markerfacecolor','r')
x=linspace(min(x),max(x),50);
y=polyval(p,x);
plot(x,y,'b')
xlabel('x')
ylabel('y')
title('Polinomio aproximador')
hold off
En la ventana de comandos corremos el script datos_6, y nos aparece el vector p que contiene los coeficientes
a
1,
a
2
, a
3
del polinomio
>> datos_6
p =
0.3446 3.7004 -0.1188
Tambin se puede utilizar polyfit para realizar ajustes a una funcin potencial, exponencial, logartmica, etc, tal
como se muestra en el siguiente cuadro
Funcin Llamada a polyfit
y=cx
a
p=polyfit(log(x), log(y),1)
y=ce
ax
p=polyfit(x, log(y),1)
y=a ln(x)+c p=polyfit(log(x),y,1)
p=polyfit(x,1./y,1)
El primer elemento del vector p devuelto por polyfit, p(1) guarda el parmetro a y el segundo elemento, p(2)
guarda el parmetro c.
Renombramos el script datos_2 como datos_7 para cambiar la llamada a la funcin MATLAB polyfit en vez de
regresion.
x=[10 20 30 40 50 60 70 80];
y=[1.06 1.33 1.52 1.68 1.81 1.91 2.01 2.11];
p=polyfit(log10(x),log10(y),1);
fprintf('exponente a= %2.3f\n',p(1));
fprintf('coeficiente c = %3.3f\n',(10^p(2)));
hold on
plot(x,y,'ro','markersize',8,'markerfacecolor','r')
x=linspace(min(x),max(x),50);
z=(10^p(2))*x.^p(1);
plot(x,z,'b')
xlabel('x')
ylabel('y')
title('Regresin potencial')
hold off
Corremos el script datos_7 en la ventana de comandos
>> datos_7
exponente a= 0.331
coeficiente c = 0.495
Renombramos el script datos_3 como datos_8 para cambiar la llamada a la funcin MATLAB polyfit en vez de
regresion.
x=[12 41 93 147 204 264 373 509 773];
y=[930 815 632 487 370 265 147 76 17];
p=polyfit(x,log(y),1);
fprintf('exponente a= %2.3f\n',p(1));
fprintf('coeficiente c = %3.3f\n',exp(p(2)));
hold on
plot(x,y,'ro','markersize',8,'markerfacecolor','r')
x=linspace(min(x),max(x),100);
z=exp(p(2))*exp(x*p(1));
plot(x,z,'b')
xlabel('x')
ylabel('y')
title('Regresin exponencial')
hold off
Corremos el script datos_8 en la ventana de comandos
>> datos_8
exponente a= -0.005
coeficiente c = 1036.896
Ajuste de forma interactiva
y =
1
ax + c
Determinar la recta de regresin para la siguiente tabla de datos, tomadas de una experiencia
x 0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4
y 0.25 0.42 0.58 0.72 0.85 0.98 1.10 1.12
Escribimos el script datos_9
x=[0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4];
y=[0.25 0.42 0.58 0.72 0.85 0.98 1.1 1.12];
p=polyfit(x,y,1)
xp=linspace(min(x),max(x),20);
yp=polyval(p,xp);
plot(x,y,'r+',xp,yp)
axis([min(x)-0.05,max(x)+.05, min(y)-0.1, max(y)+.1])
grid on
xlabel('x'), ylabel('y'), title('ajuste con polyfit')
legend('datos originales','mejor ajuste','Location','SouthEast')
Corremos el script en la ventana de comandos
>> datos_9
p =
2.5762 0.1729
Vamos a realizar el ajuste de datos de forma interactiva en la ventana Figure Window. En la ventana de
comandos escribimos
>> x=[0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4];
>> y=[0.25 0.42 0.58 0.72 0.85 0.98 1.1 1.12];
>> plot(x,y,'+')
Aparece la representacin grfica de los puntos con el smbolo +
Seleccionamos en el men Tools/Basic Fitting, y activamos la casilla linear (polinomio de grado 1) y
quadratic(polinomio de grado dos) en el primer panel titulado Plot fits. Observamos en la ventana Figure 1 que
el polinomio de segundo grado en color verde parece que se ajusta mejor a los datos experimentales
Ampliamos el cuadro de dilogo pulsando en el botn con la flecha inferior derecha --> nos aprece los
coeficientes del polinomio de ajuste:
Seleccionamos en el segundo panel titulado Numerical results Fit/ linear y nos aparece
y = p1*x + p2
Coefficients:
p1 = 2.5762
p2 = 0.17286
Norm of residuals =
0.1187
Seleccionamos en el segundo panel titulado Numerical results Fit/quadratic y nos aparece
y = p1*x^2 + p2*x + p3
Coefficients:
p1 = -3.381
p2 = 4.0976
p3 = 0.046071
Norm of residuals =
0.045696
Pulsamos el botn con la flecha --> para ampliar otra vez el cuadro de dilogo, podemos introducir un valor o una
expresin para ser evaluada pulsando el botn Evaluate en el tercer panel titulado Find y=f(x).
El ajuste de datos de forma interactiva en la ventana Figure Window admite muchas posibilidades, que se pueden
consultar en el sistema de ayuda (Help).

S-ar putea să vă placă și