matlab Completo

141
Funciones MATLAB para calcular las raíces de una ecuación En esta página, vamos calcular la raíces de un polinomio mediante la función roots. Un estudio más detallado de los polinomios se encuentra en la página titulada "Polinomios y fracciones polinómicas ". La raíz de una ecuación mediante procedimientos gráficos, que nos va a servir para estimar un valor próximo a la raíz buscada. Las raíces de una ecuación transcendente mediante fzero y finalmente, las raíces de un sistema de ecuaciones transcedentes mediante fsolve. Raíces de un polinomio Para calcular las raíces de la ecuación a 1 x n +a 2 x n-1 +...+a n x+a n+1 =0 se emplea la función roots y se le pasa el vector p formado por los coeficientes del polinomio. La función roots devuelve un vector columna que contiene las raíces. >> p=[a 1 a 2 ... a n a n+1 ]; >> x=roots(p) La función roots tiene una función inversa poly que se le pasa el vector x que contiene las raíces 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

description

125

Transcript of matlab Completo

Page 1: matlab Completo

Funciones MATLAB para calcular las raíces de una ecuación

En esta página, vamos calcular la raíces de un polinomio mediante la función roots. Un estudio más detallado de los polinomios se encuentra en la página titulada "Polinomios y fracciones polinómicas". La raíz de una ecuación mediante procedimientos gráficos, que nos va a servir para estimar un valor próximo a la raíz buscada. Las raíces de una ecuación transcendente mediante fzero y finalmente, las raíces de un sistema de ecuaciones transcedentes mediante fsolve.

Raíces de un polinomio

Para calcular las raíces de la ecuación

a1xn+a2xn-1+...+anx+an+1=0

se emplea la función roots y se le pasa el vector p formado por los coeficientes del polinomio. La función roots devuelve un vector columna que contiene las raíces.

>> p=[a1 a2 ... an an+1];>> x=roots(p)

La función roots tiene una función inversa poly que se le pasa el vector x que contiene las raíces y devuelve los coeficientes del polinomio

p=poly(x)

Sea f(x)= x5- 3.5x4 + 2.75x3 + 2.125x2 - 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 función 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) %raíces del polinomio r = 2.0000 -1.0000

Page 2: matlab Completo

1.0000 + 0.5000i 1.0000 - 0.5000i 0.5000>> c=poly(r) %reconstruimos el polinomio a partir de las raíces

Comprobamos que las raíces calculadas son correctas utilizando la función polyval, pasándole los coeficientes del polinomio p y el valor xi de cada una de las raíces

>> polyval([1 3 3 2], -2)

Como ejercicio se sugiere al lector, hallar las raíces de las ecuaciones siguientes con la función roots y reconstruir el polinomio con la función poly, o calcular el valor del polinomio para cada una de las raíces con la función polyval

x3 + x2 + x + 1 = 0x5+x2-2x-4=0x5-x4 + x3 +2x2-1

Procedimiento gráfico

Vamos a estudiar varios procedimientos para calcular la raíz de una ecuación trascedente, por ejemplo, x-cos(x)=0

En primer lugar, vamos a hacer una representación gráfica de esta función para conocer aproximadamente el punto donde la función 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 onxlabel('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 próximo a la raíz de la función y podemos leer sus coordenadas. Cuanto mejor sea la resolución de la gráfica más cerca podremos estar de la raíz buscada. La resolución de la gráfica es el paso Δx utilizado, para calcular la tabla de valores (x, y) en el intervalo que va desde xi hasta xf . En este ejemplo Δx=0.1

Page 3: matlab Completo

Podemos utilizar la herramienta Zoom In y Pan  para acercarnos a este punto y el botón Zoom Out para alejarnos y volver a la situación inicial.En la imagen podemos ver que después de acercarnos repetidamente al punto de corte con el eje X mediante Zoom In y la mano Pan, la raíz buscada está comprendida entre 0.735 y 0.74.

Page 4: matlab Completo

Raíces simples

Podemos utilizar el puntero del ratón para buscar los puntos en los que la función corta al eje X, añadiendo el comandoginput al final del script mouse_raiz

x=0:0.1:pi/2;y=x-cos(x);plot(x,y)grid onxlabel('x')ylabel('y')title('x-cos(x)')[xRaiz,yRaiz] = ginput

En la ventana de comandos corremos el script mouse_raiz. La raíz buscada se señala mediante el cursor en forma de cruz de color negro. Se pulsa el botón izquierdo del ratón y luego la tecla Retorno.

>> mouse_raiz

Page 5: matlab Completo

xRaiz = 0.7379yRaiz = -0.0022

Raíces múltiples

Si la función tiene más de una raíz, se señala cada uno de los puntos de intersección de la función con el eje X con el puntero del ratón y se pulsa el botón izquierdo del ratón. 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 raíces que ya conocemos de una función para ilustrar este interesante procedimiento gráfico

Guardamos el script mouse_raiz mediante File/Save As.. con el nombre mouse_raiz_1. Modificamos el script para representar la función coseno con el eje horizontal en grados y lo guardamos mediante File/Save o pulsando el icono correspondiente.

Las dos raíces de cos(x)=0 en el intervalo (0,360) son 90° y 270°.

x=0:1:360;y=cosd(x);plot(x,y)grid onxlabel('x')ylabel('y')title('cos(x)')[xRaiz,yRaiz] = ginput

En la ventana de comandos corremos el script mouse_raiz_1. En la ventana gráfica, pulsamos dos veces el botón izquierdo del ratón:

1. cuando el puntero está situado aproximadamente en el punto de coordendas (90,0), pulsamos el botón izquierdo del ratón

2. cuando el puntero está situado en el punto (270,0), pulsamos el botón izquierdo del ratón

3. pulsamos Retorno,

y obtenemos lo siguiente:

>> mouse_raiz_1xRaiz = 89.8618 270.5069 yRaiz = -0.0088 -0.0029

Page 6: matlab Completo

El procedimiento gráfico nos da una estimación de las raíces (puntos de intersección en la representación gráfica de la función con el eje X) de una ecuación trascendente en un intervalo (a,b) dado.

La función MATLAB fzero

La función fzero puede encontrar la raíz de una ecuación trascendente f(x)=0. Su sintaxis es

fzero(funcion,x0)

Donde funcion es el nombre de la función cuyas raíces queremos determinar y x0 es el intervalo [a b] donde la función cambia de signo, es decir, el signo de f(a) es distinto al signo de f(b). x0 puede ser también un valor cercano a la raíz es decir, una primera aproximación. Podemos definir una función anónima y guardarla en el manejador func.Le pasamos la función anónima func a fzero.

En la ventana de comandos, definimos la función y buscamos un intervalo [0.4 1] donde la función cambia de signo. Alternativamente, probamos una primara aproximación a la raíz 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 raíz r= 0.7391 >> fzero(func,0.6) %aproximación inicial a la raízans = 0.7391

Podemos definir explícitamente la función func y guardarla en el fichero func.mfunction y=func(x) y=cos(x)-x; end

Llamamos a fzero anteponiendo al nombre de la función el símbolo @ (véase al final de la página Funciones)

>> fzero(@func,0.6)ans= 0.7391

A veces la función func definida y guardada en un fichero .M precisa de los valores de ciertos parámetros a, b

Page 7: matlab Completo

function y=func(x,a,b)%código de la funciónend

A fzero solamente le podemos pasar el manejador (handle) de la función de variable x. La forma en que la función funcconoce el valor de sus parámetros a y b es crear una función anónima f1 en términos de func y se le pasamos su manejador a la función fzero

f1=@(x)func(x,a,b);p=fzero(f1,x0);

En el ejercicio "La ecuación de van der Waals" utilizaremos esta opción.

Funciones implícitas

La siguiente función se estudia en la asignatura Energía Solar Fotovoltaica (tercer curso).y=3−5⋅10−12(exp(x+0.01y0.025)−1)−x+0.01y1000y=3−5·10−12(exp(x+0.01y0.025)−1)−x+0.01y1000

Donde x representa la diferencia de potencial e y la intensidad de la corriente eléctrica.

Representamos la función 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 función 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

Page 8: matlab Completo

Una representación gráfica similar la obtenemos con la función ezplot

Vamos a estudiar con más detalle esta función.

En primer lugar, sabemos que para el valor de x próximo a 0.6 V (diferencia de potencial) la intensidad y vale cero. Empleamos la función MATLAB fzero para obtener un valor más 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 máximo de la d.d.p. %1.4f\n',Vmax)

En la ventana de comandos vemos este valor

Valor máximo 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.

Page 9: matlab Completo

Suministramos a fzero un valor próximo a la raíz buscada, por ejemplo, 3. Añadimos las siguientes líneas de código 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 avisoy=zeros(size(x));for i=1:n y(i)=fzero(@(y) f(x(i),y),3,opt);endplot(x,y,'r')ylim([0 3.1])xlabel('d.d.p. V')ylabel('Intensidad')title('Fotovoltaica')

Obtenemos una representación gráfica similar a la obtenida empleando la función MATLAB contour.

Sistemas de ecuaciones no lineales

Calcular las raíces del sistema de dos ecuaciones:

f1(x,y)=2x2-xy-5x-1=0f2(x,y)=x+3log10x-y2=0

Page 10: matlab Completo

En la figura vemos el punto de intersección 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 función fsolve de MATLAB para obtener el punto de intersección.

En primer lugar, tenemos que definir la función denominada sis_ecuaciones y guardarla en el correspondiente fichero . M. A esta función le tenemos que pasar los valores de x e y en el vector xn, y nos devuelve los valores de las funcionesf1(x,y) y f2(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

Page 11: matlab Completo

Creamos el script sis_ecuaciones_script para llamar al procedimiento numérico implementado en la función fsolve de MATLAB.

x0 =[3 2]; %valor inicial[x,fval] = fsolve(@sis_ecuaciones,x0); fprintf('La solución es x=%1.3f, y=%1.3f\n',x(1),x(2));fprintf('Valores de la función = %g\n',fval)

A fsolve tenemos que pasarle la función que hemos definido, sis_ecuaciones y la aproximaxión inicial (x0, y0) que hemos encontrado anteriormente de forma gráfica. Esta función nos devuelve las coordenadas (x,y) del punto de intersección buscado y los valores de las funciones f1(x,y) y f2(x,y) en dicho punto.

En la ventana de comandos corremos el script sis_ecuaciones_script

>> sis_ecuaciones_scriptLa solución es x=3.958, y=2.664Valores de la función = -1.33692e-010Valores de la función = -3.07305e-009

Sistema de ecuaciones lineales. Método de Gauss

La técnica más común para resolver el sistema de ecuaciones lineales es la de hacer uso de un procedimiento para la eliminación sucesiva de las incógnitas denominado método de Gauss. Describiremos la aplicación de este método para un sistema de cuatro ecuaciones con cuatro incógnitas y posteriormente, la generalizaremos para un sistema de necuaciones.

Sistema de cuatro ecuaciones con cuatro incógnitas

a11x1+a12x2+a13x3+a14x4=b1a21x1+a22x2+a23x3+a24x4=b2a31x1+a32x2+a33x3+a34x4=b3a41x1+a42x2+a43x3+a44x4=b4a11x1+a12x2+a13x3+a14x4=b1a21x1+a22x2+a23x3+a24x4=b2a31x1+a32x2+a33x3+a34x4=b3a41x1+a42x2+a43x3+a44x4=b4                  (2)

Despejamos x1 de la primera ecuaciónx1=b1a11−a12a11x2−a13a11x3−a14a11x4x1=b1a11−a12a11x2−a13a11x3−a14a11x4

Page 12: matlab Completo

y la sustituimos en las restantes, quedando el sistema de tres ecuaciones con tres incógnitasa122x2+a123x3+a124x4=b12a132x2+a133x3+a134x4=b13a242x1+a143x3+a144x4=b14a221x2+a231x3+a241x4=b21a321x2+a331x3+a341x4=b31a422x1+a431x3+a441x4=b41

cona1ij=aij−ai1a1ja11  b1i=bi−ai1b1a11  (i,j 2,3,4)aij1=aij−ai1a1ja11  bi1=bi−ai1b1a11  (i,j 2,3,4)

Despejamos, ahora, x2 de la primera ecuaciónx2=b12a122−a123a122x3−a124a122x4x2=b21a221−a231a221x3−a241a221x4

y las sustituimos en las dos restantes, quedando un sistema de dos ecuaciones con dos incógnitas.a233x3+a234x4=b23a243x3+a244x4=b24a332x3+a342x4=b32a432x3+a442x4=b42

cona2ij=a1ij−a1i2a12ja122  b2i=b1i−a1i2b12a122  (i,j 3,4)aij2=aij1−ai21a2j1a221  bi2=bi1−ai21b21a221  (i,j 3,4)

Despejamos ahora, x3 de la primera ecuaciónx3=b23a233−a234a233x4x3=b32a332−a342a332x4

y la sustituimos en la ecuación restante,a344x4=b34a443x4=b43

cona3ij=a2ij−a2i3a23ja233  b3i=b2i−a2i3b23a233  (i,j 4)aij3=aij2−ai32a3j2a332  bi3=bi2−ai32b32a332  (i,j 4)

Por tanto, el proceso de resolver un sistema lineal de ecuaciones por el método de Gauss se reduce a la construcción de un sistema equivalente que tenga una matriz triangular.a11x1+a12x2+a13x3+a14x4=b1   a122x2+a123x3+a124x4=b12      a233x3+a234x4=b23         a344x4=b34a11x1+a12x2+a13x3+a14x4=b1   a221x2+a231x3+a241x4=b21      a332x3+a342x4=b32         a443x4=b43

Ahora vamos obteniendo las incógnitas empezando por la última ecuación y terminando en la primera.

Page 13: matlab Completo

x4=b34a344x3=b23−a234x4a233x2=b12−a123x3−a124x4a122x1=b1−a12x2−a13x3−a14x4a11x4=b43a443x3=b32−a342x4a332x2=b21−a231x3−a241x4a221x1=b1−a12x2−a13x3−a14x4a11

Sistema de n ecuaciones con n incógnitas

Sea un sistema de n ecuaciones con n incógnitas⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪a11x1+a12x2+a13x3+...+a1nxn=b1a21x1+a22x2+a23x3+...+a2nxn=b2....an1x1+an2x2+an3x3+...+annxn=bn{a11x1+a12x2+a13x3+...+a1nxn=b1a21x1+a22x2+a23x3+...+a2nxn=b2....an1x1+an2x2+an3x3+...+annxn=bn

que convertimos en el sistema equivalente⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪a11x1+a12x2+a13x3+...+a1nxn=b1   a122x2+a123x3+...+a12nxn=b12      a233x3+...+a23nxn=b23....    an−2n−1n−1xn−1+an−2n−1nxn=bn−2n−1         an−1nnxn=bn−1n{a11x1+a12x2+a13x3+...+a1nxn=b1   a221x2+a231x3+...+a2n1xn=b21      a332x3+...+a3n2xn=b32....    an−1n−1n−2xn−1+an−1nn−2xn=bn−1n−2         annn−1xn=bnn−1

dondea1ij=aij−ai1a11a1j b1i=bi−ai1a11b1 i,j=2...na2ij=a1ij−a1i2a122a12j b2i=b1i−a1i2a122b12 i,j=3...nakij=ak−1ij−ak−1ikak−1kkak−1kj bki=bk−1i−ak−1ikak−1kkbk−1k i,j=k...nk=1,2...n−1aij1=aij−ai1a11a1j bi1=bi−ai1a11b1 i,j=2...naij2=aij1−ai21a221a2j1 bi2=bi1−ai21a221b21 i,j=3...naijk=aijk−1−aikk−1akkk−1akjk−1 bik=bik−1−aikk−1akkk−1bkk−1 i,j=k...nk=1,2...n−1

Obtenemos las incógnitas xna x1

xn=bn−1nan−1nn xi=bi−1i−∑i+1nai−1ijxi−1jai−1ii i=n−1,n−2,...2,1xn=bnn−1annn−1 xi=bii−1−∑i+1naiji−1xji−1aiii−1 i=n−1,n−2,...2,1function 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); for j=k:n+1 Ab(i,j)=Ab(i,j)-factor*Ab(k,j); end end end %incógnitas x=zeros(n,1);

Page 14: matlab Completo

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 endend

Podemos abreviar el código suprimiendo el bucle de índice j y sustituyéndolo 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 %incógnitas 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); endend

Probamos la función gauss_ecuacion con los sistemas de ecuaciones⎧⎩⎨⎪⎪x1+2x2+3x3=62x1+2x2+3x3=7x1+4x2+4x3=9⎧⎩⎨⎪⎪x1+x2+x3=42x1+x2+3x3=73x1+x2+6x3=2{x1+2x2+3x3=62x1+2x2+3x3=7x1+4x2+4x3=9{x1+x2+x3=42x1+x2+3x3=73x1+x2+6x3=2>> 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

Page 15: matlab Completo

⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪a11x1+a12x2+a13x3+...+a1nxn=b1a21x1+a22x2+a23x3+...+a2nxn=b2....an1x1+an2x2+an3x3+...+annxn=bn{a11x1+a12x2+a13x3+...+a1nxn=b1a21x1+a22x2+a23x3+...+a2nxn=b2....an1x1+an2x2+an3x3+...+annxn=bn

El procedimiento de Gauss no se puede aplicar si a11 es nulo. La solución a este problema es intercambiar filas hasta conseguir que a11≠0. A este elemento a11 que aparece como denominador se le denomina elemento pivote. Si después de la primera iteración⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪a11x1+a12x2+a13x3+...+a1nxn=b1a122x2+a123x3+...+a12nxn=b12a132x2+a133x3+...+a13nxn=b13....a1n2x2+a1n3x3+...+a1nnxn=b1na122≠0{a11x1+a12x2+a13x3+...+a1nxn=b1a221x2+a231x3+...+a2n1xn=b21a321x2+a331x3+...+a3n1xn=b31....an21x2+an31x3+...+ann1xn=bn1a221≠0

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 método 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:a11,a122,a233...ak−1kk k=1,2,...n−1a11,a221,a332...akkk−1 k=1,2,...n−1

sean lo más grandes (en valor absoluto).

⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪0x1+4x2−2x3−2x4=−41x1+2x2+4x3−3x4=5−3x1−3x2+8x3−2x4=7−1x1+1x2+6x3−3x4=7{0x1+4x2−2x3−2x4=−41x1+2x2+4x3−3x4=5−3x1−3x2+8x3−2x4=7−1x1+1x2+6x3−3x4=7

Page 16: matlab Completo

Creamos el siguiente script para ver el proceso de intercambio de filas y de reducción 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 matrizend

En la ventana de comandos vemos lo siguiente:

%matriz ampliada Ab%El elemento pivote Ab(1,1) es ceroAb = 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 3Ab = -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,4Ab = -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,4intercambio fila 2 por fila 3Ab = -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 0 2.00 3.33 -2.33 4.67%se hacen ceros los elementos de la segunda columna de las filas 3,4Ab = -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

Page 17: matlab Completo

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 triangularAb = -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 función gauss_ecuacion para incluir la mejorafunction 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%incógnitas 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); endend

Llamamos a la función 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 linealesEn esta página se discute y se resuelve un sistema de ecuaciones lineales

Matriz inversa

Page 18: matlab Completo

Se denomina matriz identidad I a aquella matriz cuadrada de dimensiones m×m en la cual los elementos de la diagonal valen 1 y el resto de los elementos vale cero. MATLAB dispone de la función eye(m) para crear una matriz cuadrada de dimensión 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 AA=[a11a21a12a21a13a23]  I=⎡⎣⎢100010001⎤⎦⎥A*I=[a11a21a12a21a13a23]A=[a11a12a13a21a21a23]  I=[100010001]A*I=[a11a12a13a21a21a23]

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 funcióninv(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*Bans = 1.0000 0 0 -0.0000 1.0000 -0.0000 0 -0.0000 1.0000

Determinante

Un determinante es un número asociado a una matriz cuadrada. Para una matriz cuadrada de dimensión 2×2A=[a11a21a12a22]  |A|=a11a22−a12a21A=[a11a12a21a22]  |A|=a11a22−a12a21

El determinante de una matriz m×m se desarrolla en términos de una combinación de determinates de matrices de dimensión m-1×m-1 y así, sucesivamente, hasta llegar a los determinantes de matrices 2×2.

Page 19: matlab Completo

En MATLAB la función 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 máximo número de filas linealmente independientes. La función rank calcula el rango de una matriz. Sea la matriz A

A=⎡⎣⎢⎢⎢⎢0132−1−11−320221−10−1⎤⎦⎥⎥⎥⎥A=[0−1211−10−131202−32−1]>> 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 combinación lineal de la fila 1 y la fila 2:. a4j=a1j+2·a2j, j=1...4

División por la izquierda y por la derecha

La división por la izquierda se utiliza para resolver la ecuación AX=B. En esta ecuación X es el vector columna de las incógnitas, B es el vector columna de los términos independientes y A es una matriz cuadrada.a11x1+a12x2+a13x3=b1a21x1+a22x2+a23x3=b2a31x1+a32x2+a33x3=b3⎡⎣⎢a11a21a31a12a22a32a13a23a23⎤⎦⎥⎡⎣⎢x1x2x3⎤⎦⎥=⎡⎣⎢b1b2b3⎤⎦⎥AX=Ba11x1+a12x2+a13x3=b1a21x1+a22x2+a23x3=b2a31x1+a32x2+a33x3=b3[a11a12a13a21a22a23a31a32a23][x1x2x3]=[b1b2b3]AX=B

A-1AX=IX=X

De modo que

X=A-1B

En MATLAB esta última expresión se escribe utilizando el operador división por la izquierda

X=A\B

La división por la derecha se utiliza para resolver la ecuación XC=D. En esta ecuación X y D son vectores fila y C es una matriz cuadrada.

XCC-1=DC-1

Page 20: matlab Completo

X=DC-1 o bien, X=D/C (división por la derecha)

Sistema de ecuaciones lineales

Consideremos el sistema de ecuaciones lineales⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪a11x1+a12x2+.....+a1nxn=b1a21x1+a22x2+.....+a2nxn=b2...am1x1+am2x2+.....+amnxn=bm⎡⎣⎢⎢⎢⎢a11a21...am1a12a22...am2............a1na2n...amn⎤⎦⎥⎥⎥⎥⎡⎣⎢⎢⎢⎢x1x2...xn⎤⎦⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢b1b2...bm⎤⎦⎥⎥⎥⎥{a11x1+a12x2+.....+a1nxn=b1a21x1+a22x2+.....+a2nxn=b2...am1x1+am2x2+.....+amnxn=bm[a11a12...a1na21a22...a2n............am1am2...amn][x1x2...xn]=[b1b2...bm]

que podemos escribir Ax=b, donde A es una matriz de dimensión m×n, y x y b son dos vectores columna de longitudesn y m respectivamente. Tenemos un sistema de m ecuaciones con n incógnitas.

1. El sistema tiene solución 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 número n de incógnitas el sistema tiene una solución única. Sistema compatible determinado

3. Si el rango es menor que el número n de incógnitas entonces hay un número infinito de soluciones. Sistema compatible indeterminado.

Vamos a ver algunos ejemplos:

1.-Sea el sistema de tres ecuaciones con dos incógnitas⎧⎩⎨⎪⎪2x1+x2=32x1−x2=0x1−2x2=4{2x1+x2=32x1−x2=0x1−2x2=4

En forma matricial se escribe⎡⎣⎢2211−1−2⎤⎦⎥[x1x2]=⎡⎣⎢304⎤⎦⎥[212−11−2][x1x2]=[304]

La matriz A y la matriz ampliada A|b son respectivamente

A=⎡⎣⎢2211−1−2⎤⎦⎥ A∣∣∣∣b=⎡⎣⎢2211−1−2304⎤⎦⎥A=[212−11−2] A|b=[2132−101−24]>> 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)

Page 21: matlab Completo

ans = 2>> rank(Ab)ans = 3

El sistema no tiene solución (primer caso). Cada una de las ecuaciones del sistema representa una recta, identificamosx1con x y x2 con y. En la figura vemos la representación gráfica 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 incógnitas⎧⎩⎨⎪⎪2x1+x2=34x1+2x2=66x1+3x2=9⎡⎣⎢246123⎤⎦⎥[x1x2]=⎡⎣⎢369⎤⎦⎥{2x1+x2=34x1+2x2=66x1+3x2=9[214263][x1x2]=[369]>> A=[2 1; 4 2; 6 3];>> b=[3;6;9];>> Ab=[A b];>> rank(A)ans = 1>> rank(Ab)ans = 1

Page 22: matlab Completo

El sistema tiene solución, pero como el rango es menor que el número de incógnitas hay un número 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 solución del sistema de ecuaciones.

3.-Sea el sistema de tres ecuaciones con dos incógnitas y su representación matricial⎧⎩⎨⎪⎪2x1+x2=32x1−x2=5x1−2x2=4⎡⎣⎢2211−1−2⎤⎦⎥[x1x2]=⎡⎣⎢354⎤⎦⎥{2x1+x2=32x1−x2=5x1−2x2=4[212−11−2][x1x2]=[354]>> A=[2 1; 2 -1; 1 -2];>> b=[3;5;4];>> Ab=[A b];>> rank(A)ans = 2>> rank(Ab)

Page 23: matlab Completo

ans = 2

El sistema tiene solución única ya que el rango es igual al número de incógnitas (segundo caso).

>> X=A\bX = 2.0000 -1.0000

En la figura vemos la representación gráfica 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.

División por la izquierda \

Vamos a practicar la división por la izquierda \ resolviendo el sistema de tres ecuaciones con tres incógnitas:3x1−x2=5−2x1+x2+x3=02x1−x2+4x3=15⎡⎣⎢3−22−11−1014⎤⎦⎥⎡⎣⎢x1x2

Page 24: matlab Completo

x3⎤⎦⎥=⎡⎣⎢5015⎤⎦⎥AX=BX=A\B3x1−x2=5−2x1+x2+x3=02x1−x2+4x3=15[3−10−2112−14][x1x2x3]=[5015]AX=BX=A\B>> 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\bans = 2.0000 1.0000 3.0000>> inv(A)*bans = 2.0000 1.0000 3.0000

La función rref de MATLAB

Esta función nos puede ser útil para resolver sistemas de ecuaciones.

La matriz ampliada Ab del sistema de tres ecuaciones con tres incógnitas del apartado anterior es

Ab=⎛⎝⎜⎜3−22−11−10145015⎞⎠⎟⎟Ab=(3−10−2112−145015)>> 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 función rref de MATLAB y obtenemos la matriz ampliada R del sistema equivalente de ecuaciones

R=⎛⎝⎜⎜100010001213⎞⎠⎟⎟⎧⎩⎨⎪⎪x1=2x2=1x3=3R=(100010001213){x1=2x2=1x3=3 Sea ahora, el sistema de tres ecuaciones con tres incógnitas siguiente:⎧⎩⎨⎪⎪x1+x2+x3=−6x1−2x3=42x1+x2−x3=18{x1+x2+x3=−6x1−2x3=42x1+x2−x3=18

Creamos la matriz A de los coeficientes y la matriz ampliada Ab

>> A=[1 1 1;1 0 -2;2 1 -1];

Page 25: matlab Completo

>> 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⎧⎩⎨⎪⎪x1−2x3=0x2+3x3=00=1{x1−2x3=0x2+3x3=00=1

Se trata de un sistema incompatible, tal como podemos comprobar calculando el rango de la matriz A y de su ampliadaAb

>> rank(A)ans = 2>> rank(Ab)ans = 3

Finalmente, sea el sistema⎧⎩⎨⎪⎪x1+x2+x3=6x1−2x3=42x1+x2−x3=10{x1+x2+x3=6x1−2x3=42x1+x2−x3=10

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 0x1+0x2+0x3=0 se verifica para cualquier valor de x1, x2 y x3

El sistema equivalente es{x1−2x3=4x2+3x3=2{x1=4+2x3x2=2−3x3{x1−2x3=4x2+3x3=2{x1=4+2x3x2=2−3x3

Una solución sería por ejemplo, x1=4, x2=2 y x3=0.

>> rank(A)ans = 2>> rank(Ab)ans = 2

El sistema es compatible e indeterminado.

Page 26: matlab Completo

Valores y vectores propiosEl cálculo de los valores propios y de los vectores propios de una matriz simétrica tiene gran importancia en las matemáticas y en la ingeniería, entre los que cabe destacar, el problema de la diagonalización de una matriz, el cálculo de los momentos de inercia y de los ejes principales de inercia de un sólido rígido, o de las frecuencias propias de oscilación de un sistema oscilante.

Se denominan valores propios o raíces características de una matriz cuadrada A, a los valores de λ tales que.det(A−λE)=∣∣∣∣∣∣a11−λa21...an1a12a22−λ...an2...a1n...a2n...ann−λ∣∣∣∣∣∣=0det(A−λE)=|a11−λa12...a1na21a22−λ...a2n.........an1an2ann−λ|=0

Desarrollando el determinante tenemos un polinomio de grado n en λ. Trataremos de encontrar los coeficientes del polinomio y luego, aplicaremos un método de hallar las raíces del polinomio.

Una vez hallados los valores propios, para hallar el vector propio X correspondiente al valor propio λ es necesario resolver el sistema homogéneoAX=λXAX=λXdonde el vector X es  X={x1,x2,...xn}X={x1,x2,...xn} Siempre podemos tomar x1 como 1, y hallar las otras n-1 incógnitas. De las necuaciones podemos tomar n-1, y resolver el sistema lineal.(a22−λ)x2+a23x3+....+a2nxn=−a21a32x2+(a33−λ)x3+....+a3nxn=−a31...............................................an2x2+an3x3+....+(ann−λ)xn=−an1(a22−λ)x2+a23x3+....+a2nxn=−a21a32x2+(a33−λ)x3+....+a3nxn=−a31...............................................an2x2+an3x3+....+(ann−λ)xn=−an1

El polinomio característico

Dada una matriz cuadrada A de dimensión n. El polinomio característico de la matriz esp(λ)=λn+p1λn−1+p2λn−2+...pn−1λ+pnp(λ)=λn+p1λn−1+p2λn−2+...pn−1λ+pn

Los coeficientes se hallan mediante las siguientes relaciones:p1=−s1p2=−12(s2+p1s1)..........................pn=−1n(sn+p1sn−1+....+pn−1s1)⎫⎭⎬⎪⎪⎪⎪⎪⎪⎪⎪p1=−s1p2=−12(s2+p1s1)..........................pn=−1n(sn+p1sn−1+....+pn−1s1)} (1)

Page 27: matlab Completo

Los valores s1, s2, ... sn son las trazas de las potencias de la matriz cuadrada A.

s1=traza As2=traza A2....................sn=traza An⎫⎭⎬⎪⎪⎪⎪⎪⎪⎪⎪traza A=∑i=1i≤naiis1=traza As2=traza A2....................sn=traza An}traza A=∑i=1i≤naii

La aplicación de este método no reviste dificultad, se calculan:

Las potencias de la matriz A y la traza de cada una de ellas,

Los coeficientes pi del polinomio característico

Los valores propios o las raíces del polinomio mediante el comando roots

Conocidos los valores propios se calculan los vectores propios

Hallar el polinomio característico de la matriz⎛⎝⎜⎜⎜1234212332124321⎞⎠⎟⎟⎟(1234212332124321)

El desarrollo del determinante secular mediante el método de Leverrier conduce a la ecuaciónλ4−4λ3−40λ2−56λ−20=0λ4−4λ3−40λ2−56λ−20=0

Conocidos los coeficientes del polinomio característico, se determinan las raíces por algún procedimiento numérico, el mejor procedimiento es utilizar la función MATLAB roots que veremos con más detalle en el capítulo raíces de una ecuación.

Vectores propios

Conocidos los valores propios de una matriz simétrica A, se pueden calcular el vector propio X correspondiente a cada valor propio λ.

AX=λX

mediante el siguiente procedimiento. Supongamos una matriz simétrica A de dimensión 4.⎡⎣⎢⎢⎢⎢a11a21a31a41a12a22a32a42a13a23a33a43a14a24a34a44⎤⎦⎥⎥⎥⎥ ⎡⎣⎢⎢⎢⎢x1x2x3x4⎤⎦⎥⎥⎥⎥=λ⎡⎣⎢⎢⎢⎢x1x2x3x4⎤⎦⎥⎥⎥⎥⎡⎣⎢⎢⎢⎢a11−λa21a31a41a12a22−λa32a42a13a23a33−λa43a14a24a34a44−λ⎤⎦⎥⎥⎥⎥ ⎡⎣⎢⎢⎢⎢x1x2x3x4⎤⎦⎥⎥⎥⎥=0[a11a12a13a14a21a22a23a24a31a32a33a34a41a42a43a44] [x1x2x3x4]=λ[x1x2x3x4][a11−λa12a13a14a21a22−λa23a24a31a32a33−λa34a41a42a43a44−λ] [x1x2x3x4]=0

Page 28: matlab Completo

Conocido el valor propio λ, tenemos un sistema de ecuaciones homogéneo de 4 ecuaciones con 4 incógnitas. Le damos a x1 el valor arbitrario de 1 y lo convertimos en el sistema de tres ecuaciones con tres incógnitas⎧⎩⎨⎪⎪a21x1+(a22−λ)x2+a23x3+a24x4=0a31x1+a32x2+(a33−λ)x3+a34x4=0a41x1+a42x2+a43x3+(a44−λ)x4=0⎧⎩⎨⎪⎪(a22−λ)x2+a23x3+a24x4=−a21x1a32x2+(a33−λ)x3+a34x4=−a31x1a42x2+a43x3+(a44−λ)x4=−a41x1⎡⎣⎢(a22−λ)a32a42a23(a33−λ)a43a24a34(a44−λ)⎤⎦⎥ ⎡⎣⎢x2x3x4⎤⎦⎥=⎡⎣⎢−a21x1−a31x1−a41x1⎤⎦⎥{a21x1+(a22−λ)x2+a23x3+a24x4=0a31x1+a32x2+(a33−λ)x3+a34x4=0a41x1+a42x2+a43x3+(a44−λ)x4=0{(a22−λ)x2+a23x3+a24x4=−a21x1a32x2+(a33−λ)x3+a34x4=−a31x1a42x2+a43x3+(a44−λ)x4=−a41x1[(a22−λ)a23a24a32(a33−λ)a34a42a43(a44−λ)] [x2x3x4]=[−a21x1−a31x1−a41x1]

La función leverrier

A la función leverrier se le pasa la matriz cuadrada A de dimensión 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 función leverrier realiza dos tareas:

Calcula los valores propios

1. Calcula las potencias de la matriz A y sus trazas guardándolas en el vector s.

2. Calcula n coeficientes del polinomio característico de acuerdo con las fórmulas (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 característico es el vector ampliado [1 p] cuyo primer término es 1 y a continuación el resto de los coeficienetes calculados.

3. Calcula las raíces del polinomio, que son los valores propios empleando la función MATLAB roots, a la cual se le pasa el vector de los coeficientes y devuelve el vector (columna) de las raíces.

Page 29: matlab Completo

4. Creamos una matriz D de dimensión 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 dimensión 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 dimensión 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 incógnitas, mediante el operador división por la izquierda \ tal como hemos visto en la páginaVectores 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 incógnitas.

5. El vector propio S se normaliza (su módulo es la unidad). Recuérdese que el cuadrado del módulo 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 función MATLAB norm calcula el módulo de un vector.

Finalmente podemos comprobar que los resultados son correctos realizando el producto

V×D×V-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); %dimensión 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 dimensión 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

Page 30: matlab Completo

%calcula los coeficientes del polinomio característico 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 %raíces del polinomio característico 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); endend

Probamos la función 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.2706D = 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 función MATLAB eig

MATLAB dispone de la función eig que realiza las mismas tareas que la función leverrier.

Page 31: matlab Completo

>> 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.5468D = -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⎛⎝⎜11−1310210⎞⎠⎟  ⎛⎝⎜7−1−1−151−115⎞⎠⎟Integración numérica

Hay muchas situaciones en la que es preciso aplicar procedimientos numéricos para obtener la integral definida de una función. En este capítulo se explicarán dos procedimientos:

Método 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 cinemática.

http://www.sc.ehu.es/sbweb/fisica_/cinematica/rectilineo/rectilineo/rectilineo_3.html

Dada la velocidad de un móvil en función del tiempo v(t) calcular el desplazamiento x-x0 de dicho móvil entre los instantes t0 y t.

Page 32: matlab Completo

Dividimos el intervalo t0 a t en pequeños intervalos de tiempo Δti=ti-ti-1

En el instante ti-1 la velocidad del móvil es vi-1, en el instante ti la velocidad del móvil es vi. La velocidad media <vi> en el intervalo de tiempo Δti=ti-ti-

1 comprendido entre ti-1 y ti es<vi>=v(ti)+v(ti−1)2<vi>=v(ti)+v(ti−1)2

El desplazamiento del móvil durante el intervalo de tiempo Δti=ti-ti-

1 comprendido entre ti-1 y ti es aproximadamente el área del rectángulo <vi>·Δti. El desplazamiento total x-x0 entre el instante inicial t0, y el instante final t=tn es, aproximadamentex−x0≈∑i=1n<vi>Δtix−x0≈∑i=1n<vi>Δti

donde n es el número de intervalos

Si v=-t2+14t+21 (m/s) y tomamos n=10 intervalos iguales, entre el instante t0=0 y t=10 s el desplazamiento aproximado vale

ti-1 ti<vi>

<vi>·Δti

0 1 27.5 27.5

1 2 39.5 39.5

2 3 49.5 49.5

3 4 57.5 57.5

4 5 63.5 63.5

Page 33: matlab Completo

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 número de intervalos en los que se ha dividido un intervalo dado (t0, t) es muy grande Δti-->0, la velocidad media <vi> en el intervalo comprendido entre ti-1 y ti es la velocidad v en cada instante t. En el límite, el desplazamiento se expresa como

x−x0=∫t0tv⋅dtx−x0=∫t0tv·dt

Si v=-t2+14t+21 (m/s), el desplazamiento entre el instante t0=0 y t=10 s vale

x−x0=∫t0t(−t2+14t+21)⋅dt=−t33+7t2+21t∣∣∣100=17303=576.6667 mx−x0=∫t0t(−t2+14t+21)·dt=−t33+7t2+21t|010=17303=576.6667 mSe ha de tener en cuenta que los índices en MATLAB comienzan en uno no en cero. Creamos un función denominadaintegral_1 que realice las siguientes tareas:

1. Calcular la velocidad en el instante ti

2. Calcular la velocidad en el instante ti+1

3. Calcular la velocidad media vm del móvil en el intervalo de tiempo Δti=ti+1-ti

4. Calcular el desplazamiento aproximado en dicho intervalo de tiempo, vm·Δti.

5. Calcular el desplazamiento total aproximado x-x0 de dicho móvil entre los instantes t0 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; endend

En el script (más abajo), el vector t1 contiene n+1 datos comprendidos entre el tiempo inicial t0 y la final tf ambos incluidos, si el número de intervalos es n.

Page 34: matlab Completo

t0=input('tiempo inicial, t0: ');tf=input('tiempo final, tf: ');n=input('número intervalos, n: ');

vel=@(t) -t.^2+14*t+21; %función velocidadt1=linspace(t0,tf,n+1);res=integral_1(vel,t1); %calcula la integralfprintf('El desplazamiento es %3.2f: \n',res)

En la ventana de comandos corremos el script velocidad

>> velocidadtiempo inicial, t0: 0tiempo final, tf: 10número intervalos, n: 10El desplazamiento es: 575.00

Método del punto medio

El método del punto medio es muy fácil de entender, ya que aproxima la integral definida∫abf(x)dx∫abf(x)dx

por la suma de pequeños rectángulos. Como se ve en la figura el área de cada rectángulo es f(xm) ·Δxi, donde xm=(xi+1+xi)/2 es la posición intermedia entre xi y xi+1.

Definimos la función integral_2 para que realice las siguientes tareas:

1. Calcula la posición intermedia xm=(xi+1+xi)/2 entre xi y xi+1

2. Calcula el área del rectángulo f(xm) ·Δxi, donde Δxi=xi+1-xi

3. Calcula el área total aproximada en el intervalo a, b.function suma=integral_2(f,x)

Page 35: matlab Completo

suma=0; for i=1:length(x)-1 xm=(x(i+1)+x(i))/2; suma=suma+f(xm)*(x(i+1)-x(i)); endend

Escribimos el script velocidad_1

t0=input('tiempo inicial, t0: ');tf=input('tiempo final, tf: ');n=input('número intervalos, n: ');

vel=@(t) -t.^2+14*t+21; %función velocidadt1=linspace(t0,tf,n+1);res=integral_2(vel,t1); %calcula la integralfprintf('El desplazamiento es: %3.2f\n',res)

En la ventana de comandos corremos el script velocidad_1

>> velocidad_1tiempo inicial, t0: 0tiempo final, tf: 10número intervalos, n: 10El desplazamiento es: 577.50

Fórmula del trapecio

Para calcular la integral definida de la función f(x) en el intervalo comprendio entre x0 y x, dividimos este intervalo en pequeños intervalos de longitud h=xi+1-xi. Sustituimos la función por la recta que une los puntos (xi, yi) y (xi+1, yi+1). El área sombreada en la figura es la suma del área de un rectángulo más el área de un triángulo, vale

h⋅yi+12h⋅(yi+1−yi)=12h⋅(yi+1+yi)h·yi+12h·(yi+1−yi)=12h·(yi+1+yi)

El área total aproximada bajo la curva es

Page 36: matlab Completo

h2(y1+y2)+h2(y2+y3)+h2(y3+y4)+...+h2(yn−2+yn−1)+h2(yn−1+yn)=h2(y1+2y2+2y3+2y4+...+2yn−2+2yn−1+yn)h2(y1+y2)+h2(y2+y3)+h2(y3+y4)+...+h2(yn−2+yn−1)+h2(yn−1+yn)=h2(y1+2y2+2y3+2y4+...+2yn−2+2yn−1+yn)

Definimos en la función trapecio el procedimiento. Donde f es la función integrando, y x el vector de n+1 datos comprendidos entre la abscisa inicial x0 y la final xf ambas incluidas, si el número de intervalos es n.function sum=trapecio(f,x0, xf, nInterv) %el número de puntos es n intervalos más 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 función integrando f(x), calculamos la aproximación a la integral definida en el intervalo comprendido entre x0 yx, escribiendo el script velocidad_2.

x0=input('abscisa inicial, x0: ');xf=input('abscisa final, xf: ');n=input('número intervalos, n: ');

deriv=@(x) -x^2+14*x+21; %definición del integrando res=trapecio(deriv,x0,xf,n); %calcula la integralfprintf('El valor aproximado de la integral: %3.2f\n',res)

En la ventana de comandos corremos el script velocidad_2

>> velocidad_2abscisa inicial, x0: 0abscisa final, xf: 10número intervalos, n: 10El valor aproximado de la integral: 575.00

El método de Simpson (1/3)

En este procedimiento, se toma el intervalo de anchura 2h, comprendido entre xi y xi+2, y se sustituye la función f(x) por la parábola que pasa por tres puntos (xi, yi), (xi+1, yi+1), y (xi+2, yi+2).

Page 37: matlab Completo

Calculamos la contribución a la integral del primer intervalo (x0, x0+2h) y generalizaremos para el resto de los intervalos.

La ecuación de la parábola y=ax2+bx+c que pasa por los puntos (x0, y0), (x0+h, y1), (x0+2h, y2) esy0=ax20+bx0+cy1=a(x0+h)2+b(x0+h)+cy2=a(x0+2h)2+b(x0+2h)+cy0=ax02+bx0+cy1=a(x0+h)2+b(x0+h)+cy2=a(x0+2h)2+b(x0+2h)+c

Este sistema de tres ecuaciones con tres incógnitas, se reduce ay1=y0+2ax0h+ah2+bhy2=y0+4ax0h+4ah2+2bhy1=y0+2ax0h+ah2+bhy2=y0+4ax0h+4ah2+2bh

Despejamos el coeficiente a, y 2ax0+ba=y2−2y1+y02h2  2ax0+b=4y1−3y0−y22ha=y2−2y1+y02h2  2ax0+b=4y1−3y0−y22h

Sustituimos la curva por la porción de parábola en el intervalo (x0, x0+2h). La integral vale.I=∫x0x0+2h(ax2+bx+c)dx=a3(6x20+12x0h2+8h3)+b2(4x0h+4h2)+c(2h)=2h(ax20+bx0+c)+2(2ax0+b)h2+83ah3=h3(y0+4y1+y2)I=∫x0x0+2h(ax2+bx+c)dx=a3(6x02+12x0h2+8h3)+b2(4x0h+4h2)+c(2h)=2h(ax02+bx0+c)+2(2ax0+b)h2+83ah3=h3(y0+4y1+y2)

En general, el valor del área aproximada, en el intervalo (xi, xi+2h) sombreada en la figura, esh3(yi+4yi+1+yi+2)h3(yi+4yi+1+yi+2)

El área aproximada en el intervalo (a, b) es

Page 38: matlab Completo

∫abf(x)⋅dx≈h3(y0+4y1+y2)+h3(y2+4y3+y4)+....+h3(yn−2+4yn−1+yn)∫abf(x)·dx≈h3(y0+4y1+y2)+h3(y2+4y3+y4)+....+h3(yn−2+4yn−1+yn)

o bien, agrupando términos

∫abf(x)⋅dx≈h3((y0+yn)+4(y1+y3+....yn−1)+2(y2+y4+....yn−2))∫abf(x)·dx≈h3((y0+yn)+4(y1+y3+....yn−1)+2(y2+y4+....yn−2))

El primer paréntesis, contiene la suma de los extremos, el segundo, la suma de los términos de índice impar, y el tercero la suma de los términos de índice par. En el método de Simpson, el número de divisiones n debe de ser par.

Definimos en la función simpson el procedimiento. Donde f es la función integrando, y x el vector de n+1 datos comprendidos entre la abscisa inicial x0 y la final xf ambas incluidas, si el número de intervalos es n que tiene que ser un número PAR.function suma=simpson(f,x0,xf,n)%n número par de intervalos, n+1 número 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 función integrando f(x), calculamos la aproximación a la integral definida en el intervalo comprendido entre x0 yx, escribiendo el script velocidad_3

x0=input('abscisa inicial, x0: ');xf=input('abscisa final, xf: ');n=input('número intervalos (par), n: ');if rem(n,2)==1 disp('El número intervalos tiene que ser par '); breakend

deriv=@(x) -x^2+14*x+21; %definición del integrando res=simpson(deriv,x0,xf,n); %calcula la integralfprintf('El valor aproximado de la integral: %3.2f\n',res)

En la ventana de comandos corremos el script velocidad_3

>> velocidad_3abscisa inicial, x0: 0abscisa final, xf: 10

Page 39: matlab Completo

número intervalos, n: 10El valor aproximado de la integral: 576.67

Apreciamos la mejora en el resultado de la integral con el método de Simpson.

Existe una versión del método de Simpson denominada 3/8 en el que se emplea una ecuación cúbica para concectar cuatro puntos.

Integración numérica con funciones MATLAB

MATLAB dispone de las funciones denominadas quad y dblquad para las integrales simples y dobles

Integrales simples

La función quad(function, a, b);devuelve el resultado aproximado de la integral cuando se le pasa la función a integrar en el primer parámetro function, los límites a y b de la integral. Ejemplos:

∫010(−t2+14t+21)⋅dt=−t33+7t2+21t∣∣∣100=17303=576.6667 m∫010(−t2+14t+21)·dt=−t33+7t2+21t|010=17303=576.6667 m>> f=@(x) -x.^2+14*x+21;>> q=quad(f,0,10)q = 576.6667

Integrales dobles

Page 40: matlab Completo

Queremos calcular una integral doble de la función f(x,y) en la región rectangular de abscisas a y b y de ordenadas c y d, tal como se muestra en la figura

∫ba∫dcf(x,y)⋅dy⋅dx∫ab∫cdf(x,y)·dy·dx

MATLAB dispone de la función dblquad (se sustituye por integral2 en versiones más recientes de MATLAB) que realiza esta tarea. Supongamos que queremos calcular la integral doble

∫21∫30x2y⋅dy⋅dx∫12∫03x2y·dy·dx

Creamos el script integral_doble, en el que definimos la función anónima f(x,y) y llamamos a dblquad pasándole la función, los límites de integración de la variable x, y los límites de integración 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 fácilmente haciendo la integral doble.

Para calcular la integral doble de la función f(x,y) en la región no rectangular comprendida entre las curvas y=c(x),y=d(x) y las rectas x=a y x=b

[Math Processing Error]

Al integrar la función f(x,y) respecto de la variable y entre los límites c(x) y d(x) nos queda la función g(x) que integramos entre los límites a y b.

∫ba(∫d(x)c(x)f(x,y)⋅dy)dx=∫bag(x)⋅dx∫ab(∫c(x)d(x)f(x,y)·dy)dx=∫abg(x)·dx

Page 41: matlab Completo

Utilizamos la función MATLAB quad, para resolver ambas integrales, tal como vemos en el siguiente ejemplo.∫20∫x2+xx3−x(x3y4+xy2)⋅dy⋅dx=∫02(∫x2+xx3−x(x3y4+xy2)⋅dy)dx∫02∫x3−xx2+x(x3y4+xy2)·dy·dx=∫02(∫x3−xx2+x(x3y4+xy2)·dy)dx

Definimos la función g(x) del siguiente modofunction z=g(x) n=length(x); z=zeros(size(x)); for j=1:n %límites 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); endend

En el script integral_doble1 llamamos a la función 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:

∫0.10.5∫x3x2ey/xdy⋅dx≈0.0333∫01∫x2x(x2+y3)dy⋅dx≈1.0001∫0.10.5∫x3x2ey/xdy·dx≈0.0333∫01∫x2x(x2+y3)dy·dx≈1.0001

 Solución

Integral de pares de datos

Supongamos que en una experiencia hemos medido la velocidad de un móvil en función del tiempo,

t(s) 1 2 3 4 5 6 7 8 9 10v(m/s)

5.0

6.0

5.5

7.0

8.3

7.6

6.2

6.1

7.0

5.7

Page 42: matlab Completo

calcular el desplazamiento del móvil utilizando la función 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

Solución numérica de ecuaciones diferenciales (I)

Las leyes que gobiernan los fenómenos 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 ecuación diferencial de segundo orden, como lo es la ecuación que describe los sistemas oscilantes, la propagación de las ondas, la transmisión del calor, la difusión, el movimiento de partículas subatómicas, etc.

Pocas ecuaciones diferenciales tienen una solución analítica 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 péndulo, la amplitud de la oscilación ha de ser pequeña y el rozamiento ha de ser despreciable, para obtener una solución sencilla que describa aproximadamente su movimiento periódico.

Se estudia el procedimiento de Runge-Kutta que se aplica de forma directa a una ecuación diferencial de primer orden, pero veremos como se extiende a un sistema de ecuaciones de primer orden, a un ecuación diferencial de segundo orden y a un sistema de ecuaciones diferenciales de segundo orden.

El procedimiento de Runge-Kutta se puede programar fácilmente en los ordenadores y además, se emplea mucho en la práctica, debido a la su exactitud relativamente elevada de la solución aproximada de la ecuación diferencial. La justificación del procedimiento de Runge-Kutta no es sencilla, el lector interesado puede consultar algún libro de métodos numéricos de análisis.

Método de Euler

Vamos aresolver la ecuación diferencial de primer ordendxdt=f(t,x)dxdt=f(t,x)

Page 43: matlab Completo

con con la condición inicial de que en el instante t0 la posición es x0

La primera derivada nos permite conocer la posición xi+1 en el instante ti+1, a partir de la posición xi en el instante ti de acuerdo a la fórmula siguiente. La línea de color rojo es la tangente a la curva en el instante ti

xi+1=xi+f(ti,xi)h

El procedimiento de Euler produce un error que se acumula a cada paso h de integración, que es el segmento en color azul que une los dos puntos en la figura.

Escribimos una función denominada euler, a la que le pasaremos:

la función f(t,x),

la condición inicial de que en el instante t0 la posición es x0,

el instante final tf

el número de pasos de integración n

y nos devolverá un vector t y su correspondiente vector x.function [t,x] =euler(f,t0,tf,x0,n) 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; endend

Supongamos que queremos integrar la ecuación diferencialdxdt=costdxdt=cost

con las condición inicial t=0, x=0.

x−0=∫0tcost⋅dtx=sintx−0=∫0tcost·dtx=sint

Tomamos un intervalo h=π/6, y construimos la siguiente tabla

Page 44: matlab Completo

t dxdt=costdxdt=cost

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 método de Euler a una ecuación diferencial de primer orden. Para aplicar el método de Euler precisamos de un paso h pequeño, 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 función f(t,x), las condiciones iniciales y llamaremos a la función euler. Finalmente, representaremos gráficamente la solución exacta y la obtenida aplicando el método de Euler

tf=input('tiempo final, tf: ');n=input('número de pasos, n: ');f=@(t,x) cos(t); %condiciones inicialest0=0; x0=0;[t,x]=euler(f,t0,tf,x0,n);

hold onplot(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

Page 45: matlab Completo

tiempo final, tf: pinúmero de pasos, n: 40

Hay diferencia entre la solución exacta y la obtenida mediante integración numérica por el método de Euler

Método de Runge-Kutta

En esta sección vamos a estudiar la aplicación del método de Runge-Kutta a:

Una ecuación diferencial de primer orden

Un sistema de dos ecuaciones diferenciales de primer orden

Una ecuación difrencial de segundo orden

Un sistema de dos ecuaciones diferenciales de segundo orden

Page 46: matlab Completo

Ecuación diferencial de primer orden

Sea una ecuación diferencial de primer orden, con la condición inicial de que en el instante t0 el valor inicial de x es x0

Se elige una anchura de paso h y se calculan cuatro números k1, k2, k3, k4 de acuerdo con el procedimiento esquematizado en la tabla adjunta. Según el procedimiento ordinario de Runge-Kutta, a partir del valor de x en el instantet se determina el valor de x en el instante t+h mediante la fórmula que figura en la última fila de dicha tabla.

dxdt=f(t,x)dxdt=f(t,x)k1=h⋅f(t,x)k2=h⋅f(t+12h,x+12k1)k3=h⋅f(t+12h,x+12k2)k4=h⋅f(t+h,x+k3)k1=h·f(t,x)k2=h·f(t+12h,x+12k1)k3=h·f(t+12h,x+12k2)k4=h·f(t+h,x+k3)x(t+h)=x(t)+16(k1+2k2+2k3+k4)x(t+h)=x(t)+16(k1+2k2+2k3+k4)

Definimos la función rk_1 que resuelve la ecuación diferencial de primer orden, cuando le pasamos:

la función f(t,x),

la condición inicial de que en el instante t0el valor inicial es x0,

el instante final tf

el número de pasos de integración n comprendidos entre el instante inical t0 y final tf.

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; endend

Considérese 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 máxima, la corriente cesa en el circuito.

Page 47: matlab Completo

Rdqdt=Vε−qC∫0qdqCVε−q=1RC∫0tdt  q=CVε(1−exp(−tRC))Rdqdt=Vε−qC∫0qdqCVε−q=1RC∫0tdt  q=CVε(1−exp(−tRC))

Escribimos el script carga para que realice las siguientes tareas:

1. Establezca, mediante comandos input:

o La resistencia R del circuito

o La capacidad C del condensador

o El tiempo final, tf

o el número de pasos, n.

2. Fije las condiciones iniciales, en el instante inicial t=0, el condensador está descargado x=0.

3. Defina la función f(t,x),

4. Llame al procedimiento numérico rk_1

5. Mediante el comando plot realice una representación gráfica de la solución numérica

6. Realice una representación gráfica de la solución 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('número de pasos, n: ');

f=@(t,x) V0/R-x/(R*C); %condiciones iniciales

Page 48: matlab Completo

t0=0; x0=0; [t,x]=rk_1(f,t0,tf,x0,n);

hold onplot(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

>> cargaResistencia R: 2Capacidad C: 0.8tiempo final, tf: 10número de pasos, n: 50

No se aprecia diferencia entre la solución exacta y la numérica, aplicando el procedimiento de Runge_Kutta.

Page 49: matlab Completo

Sistema de dos ecuaciones diferenciales de primer orden

El procedimiento de Runge-Kutta es igualmente efectivo en la resolución de un sistema de dos ecuaciones diferenciales de primer orden.dxdt=f(t,x,y)  dydt=g(t,x,y) dxdt=f(t,x,y)  dydt=g(t,x,y) 

El procedimiento de aplicación del método de Runge-Kutta a cada una de las ecuaciones diferenciales, con las condición inicial siguiente, en el instante t0

el valor inicial de x es x0

el valor inicial de y es y0

se esquematiza en la tabla adjunta. Como vemos además de los cuatro números  k1, k2, k3, k4 para la primera ecuación diferencial precisamos otros cuatro números l1, l2, l3, l4 para la segunda ecuación 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 dey en el instante t+h mediante las fórmulas de la última fila de la tabla.

dxdt=f(t,x,y)dxdt=f(t,x,y) dydt=g(t,x,y) dydt=g(t,x,y) k1=h⋅f(t,x,y)k2=h⋅f(t+12h,x+12k1,y+12

l1,)k3=h⋅f(t+12h,x+12k2,y+12l2)k4=h⋅f(t+h,x+k3,y+l3)k1=h·f(t,x,y)k2=h·f(t+12h,x+12k1,y+12l1,)k3=h·f(t+12h,x+12k2,y+12l2)k4=h·f(t+h,x+k3,y+l3)

l1=h⋅g(t,x,y)l2=h⋅g(t+12h,x+12k1,y+12l1)l3=h⋅g(t+12h,x+12k2,y+12l2)l4=h⋅g(t+h,x+k3,y+l3)l1=h·g(t,x,y)l2=h·g(t+12h,x+12k1,y+12l1)l3=h·g(t+12h,x+12k2,y+12l2)l4=h·g(t+h,x+k3,y+l3)

x(t+h)=x(t)+16(k1+2k2+2k3+k4)x(t+h)=x(t)+16(k1+2k2+2k3+k4)

y(t+h)=y(t)+16(l1+2l2+2l3+l4)y(t+h)=y(t)+16(l1+2l2+2l3+l4)

Definimos la función rk_2_1 que resuelve el sistema de dos ecuaciones diferenciales de primer orden, cuando le pasamos:

las funciones f (t,x,y) y g(t,x,y)

las condiciones iniciales (x0,y0) en el instante t0

el número n de pasos de integración entre t0 y el tiempo final tf

Nos devuelve los vectores x e y para cada instante que se guarda en el vector t comprendido entre el instante inicial t0 y el final tf.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);

Page 50: matlab Completo

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; endend

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 analíticas son, respectivamente,dxdt=−ax  x=x0exp(−at)dydt=ax−by  y=ab−ax0(exp(−at)−exp(−bt))dxdt=−ax  x=x0exp(−at)dydt=ax−by  y=ab−ax0(exp(−at)−exp(−bt))

La solución analítica que aparece a la derecha, se ha obtenido con las condiciones iniciales t=0, x=x0 e y=0. La segunda solución se obtiene siempre que a sea distinto de b. En el caso de que a sea igual a b, la solución analítica para yes

y=x0aexp(−at)y=x0aexp(−at)

La interpretación del sistema de ecuaciones diferenciales no es complicada. En la unidad de tiempo, desaparecen axnúcleos de la sustancia A al desintegrarse (primera ecuación). En la unidad de tiempo, se producen ax núcleos de la sustancia B y a su vez desaparecen bx núcleos de la sustancia B, que al desintegrarse se transforman en núcleos de la sustancia C estable (segunda ecuación).

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 función rk_2_1

a=input('parámetro a: ');b=input('parámetro b: ');x0=input('valor inicial de x: ');y0=input('valor inicial de y: ');tf=input('tiempo final, tf: ');n=input('número de pasos, n: ');f=@(t,x,y) -a*x;

Page 51: matlab Completo

g=@(t,x,y) a*x-b*y;%condiciones inicialest0=0;

[t,x,y]=rk_2_1(f,g,t0,tf,x0,y0,n);hold onplot(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

>> radioactivoparámetro a: 0.1parámetro b: .2valor inicial de x: 100valor inicial de y: 0tiempo final, tf: 10número de pasos, n: 40

Page 52: matlab Completo

Ecuación diferencial de segundo orden

Existen muchas situaciones en las que es necesario resolver una ecuación diferencial de segundo orden.d2xdt2=f(t,x,v)d2xdt2=f(t,x,v)

con las condiciones inicialesx(t0)=x0   (dxdt)t0=v0x(t0)=x0   (dxdt)t0=v0

Una ecuación diferencial de segundo orden es equivalente a un sistema de dos ecuaciones diferenciales de primer orden, por lo que aplicaremos el mismo esquema.

dxdt=vdxdt=v dvdt=f(t,x,v)dvdt=f(t,x,v)k1=hvk2=h(v+12l1)k3=h(v+12l2)k4=h(v+l3)k1=hvk2=h(v+12l1)k3=h(v+

l1=h⋅f(t,x,v)l2=h⋅f(t+12h,x+12k1,v+12l1)l3=h⋅f(t+12

h,x+12k2,v+12l2)l4=h⋅f(t+h,x+k3,v+l3)l1=h·f(t,x,v)l

Page 53: matlab Completo

12l2)k4=h(v+l3) 2=h·f(t+12h,x+12k1,v+12l1)l3=h·f(t+12h,x+12k2,v+12l2)l4=h·f(t+h,x+k3,v+l3)

x(t+h)=x(t)+16(k1+2k2+2k3+k4)x(t+h)=x(t)+16(k1+2k2+2k3+k4)

v(t+h)=v(t)+16(l1+2l2+2l3+l4)v(t+h)=v(t)+16(l1+2l2+2l3+l4)

Definimos la función rk_2 que resuelve la ecuación diferencial de segundo orden, cuando le pasamos:

la función f (t,x,v)

las condiciones iniciales: posición inicial x0 y velocidad inicial v0 en el instante t0

el número n de pasos de integración entre t0 y el tiempo final tf

Nos devuelve los vectores de las posiciones x y las velocidades v para cada instante que se guarda en el vector tcomprendido entre el instante inicial t0 y el final tf.function [t,x,v] =rk_2(f,t0,tf,x0,v0,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) 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; endend

La ecuación diferencial que describe un  oscilador armónico amortiguado  y su solución para unas condiciones iniciales fijadas esd2xdt2+2γdxdt+ω20x=0ω=ω20−γ2−−−−−−√x=exp(−γt)(Asin(ωt)+Bcos(ωt))v=dxdt=−γexp(−γt)(Asin(ωt)+Bcos(ωt))+ωexp(−γt)(Acos(ωt)−Bsin(ωt))d2xdt2+2γdxdt+ω02x=0ω=ω02−γ2x=exp(−γt)(Asin(ωt)+Bcos(ωt))v=dxdt=−γexp(−γt)(Asin(ωt)+Bcos(ωt))+ωexp(−γt)(Acos(ωt)−Bsin(ωt))

Page 54: matlab Completo

Condiciones iniciales: en el instante t=0, la posición inicial es x0 y la velocidad inicial v0.t=0 {x0=Bv0=−γB+ωAx=exp(−γt)(v0+γx0ωsin(ωt)+x0cos(ωt))t=0 {x0=Bv0=−γB+ωAx=exp(−γt)(v0+γx0ωsin(ωt)+x0cos(ωt))

Escribimos el script oscilador en el que definiremos la función f(t,x,v), las condiciones iniciales y llamaremos a la funciónrk_2

w0=input('frecuencia angular w0: ');g=input('rozamiento, gamma: ');x0=input('posición inicial, x0: ');v0=input('velocidad inicial,v0: ');tf=input('tiempo final, tf: ');n=input('número de pasos, n: ');f=@(t,x,v) -2*g*v-w0*w0*x; %condiciones inicialest0=0;hold on%solución numérica[t,x,v]=rk_2(f,t0,tf,x0,v0,n);plot(t,x,'b')%solución analíticaw=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 onxlabel('t')ylabel('x');legend('aproximado','exacto')title('oscilador amortiguado')hold off

En la ventana de comandos corremos el script oscilador con distintas condiciones iniciales

>> osciladorfrecuencia angular, w0: 2rozamiento, gamma: 0.5posición inicial, x0: 1.5velocidad inicial, v0: 0tiempo final, tf: 8número de pasos, n: 100

Page 55: matlab Completo

No se aprecia tampoco diferencia entre la solución exacta y la numérica, aplicando el procedimiento de Runge_Kutta.

Solución numérica de ecuaciones diferenciales (II)

En esta página 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 numérico de Runge-Kutta puede aplicarse para resolver un sistema de dos ecuaciones diferenciales de segundo orden.

Page 56: matlab Completo

d2xdt2=f(t,x,vx,y,vy)  d2ydt2=g(t,x,vx,y,vy) d2xdt2=f(t,x,vx,y,vy)  d2ydt2=g(t,x,vx,y,vy) 

con las condiciones inicialesx(t0)=x0   (dxdt)t0=vx0  y(t0)=y0   (dydt)t0=vy0x(t0)=x0   (dxdt)t0=vx0  y(t0)=y0   (dydt)t0=vy0

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 ecuación diferencial de segundo orden, obtenemos el esquema descrito en la siguiente tabla

dxdt=vxdxdt=vx dvxdt=f(t,x,vx,y,vy)dvxdt=f(t,x,vx,y,vy)k1=hvxk2=h(vx+12l1)k3=h(vx+12l2)k4=h(vx+l3)k1=hvxk2=h(vx+12l1)k3=h(vx+12l2)k4=h(vx+l3)

l1=h⋅f(t,x,vx,y,vy)l2=h⋅f(t+12h,x+12k1,vx+12l1,y+12q1,vy+12m1)l3=h⋅f(t+12h,x+12k2,vx+12l2,y+12q2,vy+12m2)l4=h⋅f(t+h,x+k3,vx+l3,y+q3,vy+m3)l1=h·f(t,x,vx,y,vy)l2=h·f(t+12h,x+12k1,vx+12l1,y+12q1,vy+12m1)l3=h·f(t+12h,x+12k2,vx+12l2,y+12q2,vy+12m2)l4=h·f(t+h,x+k3,vx+l3,y+q3,vy+m3)

x(t+h)=x(t)+16(k1+2k2+2k3+k4)x(t+h)=x(t)+16(k1+2k2+2k3+k4)

vx(t+h)=vx(t)+16(l1+2l2+2l3+l4)vx(t+h)=vx(t)+16(l1+2l2+2l3+l4)

dydt=vydydt=vy dvydt=g(t,x,vx,y,vy)dvydt=g(t,x,vx,y,vy)q1=hvyq2=h(vy+12m1)q3=h(vy+12m2)q4=h(vy+m3)q1=hvyq2=h(vy+12m1)q3=h(vy+12m2)q4=h(vy+m3)

m1=h⋅g(t,x,vx,y,vy)m2=h⋅g(t+12h,x+12k1,vx+12l1,y+12q1,vy+12m1)m3=h⋅g(t+12h,x+12k2,vx+12l2,y+12q2,vy+12m2)m4=h⋅g(t+h,x+k3,vx+l3,y+q3,vy+m3)m1=h·g(t,x,vx,y,vy)m2=h·g(t+12h,x+12k1,vx+12l1,y+12q1,vy+12m1)m3=h·g(t+12h,x+12k2,vx+12l2,y+12q2,vy+12m2)m4=h·g(t+h,x+k3,vx+l3,y+q3,vy+m3)

y(t+h)=y(t)+16(q1+2q2+2q3+q4)y(t+h)=y(t)+16(q1+2q2+2q3+q4)

vy(t+h)=vy(t)+16(m1+2m2+2m3+m4)vy(t+h)=vy(t)+16(m1+2m2+2m3+m4)

Definimos la función rk_2_2 que resuelve el sistema de dos ecuaciones diferenciales de segundo orden, cuando le pasamos:

las funciones f(t,x,vx,y,vy) y g(t,x,vx,y,vy)

las condiciones iniciales: posición inicial (x0,y0) y velcidad inicial (vx0,vy0) en el instante t0

el número n de pasos de integración entreel instante inicial t0 y el final tf

Page 57: matlab Completo

Nos devuelve los vectores posición (x,y) y velocidad (vx,vy) para cada instante que se guarda en el vector tcomprendido entre el instante inicial t0 y el final tf.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; endend

Uno de los ejemplos más interesantes de resolución de un sistema de ecuaciones diferenciales de segundo orden es ladescripción del movimiento de los cuerpos celestes, el cual tiene una solución analítica sencilla en coordenadas polares. La trayectoria seguida por un planeta es una cónica, 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 también, se muestran sus componentes rectangulares

Page 58: matlab Completo

Teniendo en cuenta que la fuerza que ejerce el Sol sobre un planeta viene descrita por la ley de la Gravitación UniversalF=GMmr2F=GMmr2

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 aceleración del planeta seránax=−Fxm=−Fcosθm=−GMr3xay=−Fym=−Fsinθm=−GMr3yax=−Fxm=−Fcosθm=−GMr3xay=−Fym=−Fsinθm=−GMr3y

Uno de los problemas del tratamiento numérico con ordenador, es la de reducir el problema a números simples e inteligibles por el usuario de un vistazo. Las masa de los planetas y del Sol son números muy grandes: la masa de la Tierra es 5.98 1024 kg., y 1.98 1030 kg. la del Sol. La distancia media entre la Tierra y el Sol es también muy grande 1.49 1011m, y la constante G es muy pequeña 6.67 10-11 en el Sistema Internacional de Unidades.

Escalas

Antes de resolver el sistema de ecuaciones diferenciales por procedimientos numéricos, es conveniente prepararlas para que el ordenador no maneje números excesivamente grandes o pequeños.

Establecemos un sistema de unidades en el que la longitud se mide en unidades astronómicas, la distancia media entre el Sol y la Tierra. L=una UA=1.496·1011 m y el tiempo en unidades de año, P=un año= 365.26 días=3.156·107 s.

En el nuevo sistema de unidades x=Lx’, t=P·t’, la primera ecuación diferencial se escribe

Page 59: matlab Completo

d2x′dt'2LP2=−GM(x'2+y'2)3/2x'LL3d2x′dt'2=−GMP2L3x'(x'2+y'2)3/2d2x'dt'2LP2=−GM(x'2+y'2)3/2x'LL3d2x'dt'2=−GMP2L3x'(x'2+y'2)3/2

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 términoGMP2L3=4π2GMP2L3=4π2

Volviendo a la notación x e y para la posición y t para el tiempo en el nuevo sistema de unidades. El sistema de ecuaciones diferenciales se escribed2xdt2=−4π2x(x2+y2)3/2d2ydt2=−4π2y(x2+y2)3/2d2xdt2=−4π2x(x2+y2)3/2d2ydt2=−4π2y(x2+y2)3/2

Se resuelve por procedimientos numéricos con las condiciones iniciales siguientes: en el instante t=0, x=x0, y=0, vx=0,vy=v0y.

Principio de conservación de la energía

La energía total de la partícula es una constante del movimiento. La energía de la partícula de masa m en el instante inicialt=0 esE0=12mv20−GmMr0E0=12mv02−GmMr0

Cuando E0<0 la partícula permanece confinada en el espacio que rodea a los dos cuerpos. Cuando E0≥0 la partícula escapa al infinito

La energía de la partícula en el instante t es igual aE=12m(v2x+v2y)−GmMx2+y2−−−−−−√E=12m(vx2+vy2)−GmMx2+y2

En el nuevo sistema de unidades establecido

v=v’·L/P, x=x’·L, y=y’·L, d=d’·LEm=12v'2L2P2−GM1L1x'2+y'2√Em=12v'2L2P2−4π2L2P21x'2+y'2√e′=EmP2L2=12v'2−4π21x'2+y'2√Em=12v'2L2P2−GM1L1x'2+y'2Em=12v'2L2P2−4π2L2P21x'2+y'2e'=EmP2L2=12v'2−4π21x'2+y'2

Volviendo a la notación previa. Definimos una nueva energía e por unidad de masa en este sistema de unidadese=12(v2x+v2y)−4π21x2+y2−−−−−−√e=12(vx2+vy2)−4π21x2+y2

El programa evalúa el cociente∣∣∣e−e0e0∣∣∣⋅100|e−e0e0|·100

Page 60: matlab Completo

que denominaremos tanto por ciento de error. Cuando la energía e difiere apreciablemente de e0, la trayectoria calculada puede que se desvíe significativamente de la real, y esto suele ocurrir cuando la partícula está muy cerca del centro de fuerzas

Elaboramos el script orbita, para describir el movimiento de un cuerpo celeste.

x0=input('posición inicial x: ');vx0=input('velocidad incial x: ');y0=0;vy0=input('velocidad incial y: ');tf=input('tiempo final, tf: ');n=input('número 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 inicialest0=0; e0=(vx0*vx0+vy0*vy0)/2-4*pi*pi/sqrt(x0*x0+y0*y0); %energía 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')%energía finalm=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 relativofprintf('Error en energia %1.4f\n',abs((ef-e0)/e0))

En la ventana de comandos corremos el script orbita

>> orbitaposición inicial x: 1velocidad incial x: 0

velocidad incial y: 6.27tiempo final, tf: 1número de pasos, n: 40Error en energia 0.0000

Page 61: matlab Completo

Solución numérica de ecuaciones diferenciales mediante ode45

MATLAB dispone de varias funciones para resolver mediante procedimientos numéricos ecuaciones diferenciales:ode23, ode45, ode113, etc, (véase en el sistema de ayuda para qué tipos de problemas es más adecuado cada uno de los procedimientos). Eligiremos ode45 para resolver la mayor parte de los problemas.

La función ode45

Su sintaxis es la siguiente

[t,x]=ode45(odefun,tspan,x0, options, params)

Page 62: matlab Completo

x es una matriz donde cada columna corresponde a las variables dependientes y t es el vector tiempo.

odefun es el nombre de la función,

tspan especifica el intervalo de tiempo, un vector de dos números tspan=[ti,tf], tiempo inicial y final. Para obtener valores de las variables dependientes en instantes concretos t0, t1, t2, ... tn. se escribe tspan=[t0,t1....tn];

x0 es un vector que contiene los valores iniciales.

options es una estructura que se crea con la función odeset, que explicaremos al final de esta página ya que es un asunto bastante complicado.

params son parámetros que queremos pasar a la función odefun

En la mayor parte de los ejemplos, utilizaremos los tres primeros parámetros: llamaremos a la función ode45 y le pasaremos la función 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 capítulo mediante la función MATLAB ode45.

Ecuación diferencial de primer orden

Elaboramos el script titulado carga_1 para integrar la ecuación diferencial de primer orden que describe la carga de un condensador.dqdt=VεR−qRCdqdt=VεR−qRCV0=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

Page 63: matlab Completo

Resistencia R: 2Capacidad C: 0.8tiempo final, tf: 10

Sistema de dos ecuaciones diferenciales de primer orden

Elaboramos el script titulado radiactivo_1 para integrar el sistema de dos ecuaciones diferenciales de primer orden que describe la serie de desintagración radioactiva. A-->B-->C donde C es un elemento estable.{dxdt=−axdydt=ax−by{dxdt=−axdydt=ax−by

En la matriz x que devuelve la función 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 definición 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('parámetro a: ');b=input('parámetro b: ');%condiciones iniciales en el vector x0x0=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_1parámetro a: 0.1parámetro b: 0.2valor inicial de x: 100valor inicial de y: 0tiempo 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 parámetros a y b.function z=func_radioactivo(t,x,a,b)

Page 64: matlab Completo

z=[-a*x(1);a*x(1)-b*x(2)]; % x(1) es x, x(2) es yend

Elaboramos el script radioactivo_2 para establecer los valores de los parámetros a y b, las condiciones iniciales y llamar a la función que realiza la integración numérica ode45. El primer parámetro de ode45 es el handler (manejador de la función) 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 parámetros a y b. Hay dos formas de hacerlo. La más sencilla es definir una función anónima fg en términos 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);

Véase la misma situación en la llamada a función fzero al final de la página Raíces de una ecuación

a=input('parámetro a: ');b=input('parámetro b: ');%condiciones inicialesx0=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_2parámetro a: 0.1parámetro b: 0.2valor inicial de x: 100valor inicial de y: 0tiempo final, tf: 20

Ecuación 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 resolución de cualquier ecuación diferencial o sistema. Podemos definir las funciones de forma anónima o explícitamente en un fichero .M

Page 65: matlab Completo

dxdt=vdxdt=v dvdt=f(t,x,v)dvdt=f(t,x,v)

En este sistema de dos ecuaciones diferenciales de primer orden x(1) representará los sucesivos valores de la variable xy 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 página anterior.d2xdt2+2γdxdt+ω20x=0 {dxdt=vdvdt=−2γv−ω20xd2xdt2+2γdxdt+ω02x=0 {dxdt=vdvdt=−2γv−ω02x

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 ecuación de segundo grado que describe las oscilaciones amortiguadas

w0=input('frecuencia angular, w0: ');g=input('rozamiento, gamma: ');%condiciones inicialesx0=zeros(1,2);x0(1)=input('posición 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 onxlabel('t')ylabel('x');title('oscilador amortiguado')

Si en el comando plot ponemos plot(t,x), se representa la posición x(1) y la velocidad x(2) en función del tiempo (en dos colores asignados por MATLAB). Si solamente queremos representar la posición x(1) en función del tiempo t, se escribe plot(t,x(:,1)). Véase la página Vectores y matrices

En la ventana de comandos corremos el script oscilador_1

>> oscilador_1frecuencia angular w0: 2rozamiento, gamma: 0.5posición inicial, x0: 0velocidad inicial,v0: 10tiempo final, tf: 10

Page 66: matlab Completo

Sistema de dos ecuaciones diferenciales de segundo orden

En este caso tenemos un sistema de cuatro ecuaciones difrenciales de primer orden

dxdt=vxdxdt=vxdvxdt=f(t,x,vx,y,vy)dvxdt=f(t,x,vx,y,vy)

dydt=vydydt=vydvydt=g(t,x,vx,y,vy)dvydt=g(t,x,vx,y,vy)

En este sistema x(1) representará los sucesivos valores de la variable x y x(2) representará a la variable vx, x(3) a la variable y y x(4) a la variable vy. 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 satélite artificial alrededor de la Tierra.

d2xdt2=−4π2x(x2+y2)3/2 ⎧⎩⎨dxdt=vxdvxdt=−4π2x(x2+y2)3/2d2ydt2=−4π2y(x2+y2)3/2 ⎧⎩⎨⎪⎪dydt=vydvydt=−4π2y(x2+y2)3/2d2xdt2=−4π2x(x2+y2)3/2 {dxdt=vxdvxdt=−4π2x(x2+y2)3/2d2ydt2=−4π2y(x2+y2)3/2 {dydt=vydvydt=−4π2y(x2+y2)3/2

Elaboramos el script orbita_1 para resolver el sistema de dos ecuaciones de segundo grado que describe el movimiento de un cuerpo celeste.

%condiciones inicialesx0=zeros(1,4);x0(1)=input('posición 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 función del tiempo t, se escribe plot(t,x(:,1),x(:,3)).

En la ventana de comandos corremos el script orbita_1

Page 67: matlab Completo

>> orbita_1posición inicial x: 1velocidad incial x: 0velocidad incial y: 6.27tiempo final, tf: 1

Opciones de ode45

Imaginemos que estudiamos el movimiento de caída 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 integración numérica de la ecuación diferencial que describe el movimiento cuando la posición del móvil sea cero. La función MATLAB ode45 dispone de un parámetro adicional options donde podemos indicarlo, pero es bastante lioso e intentaremos explicarlo mediante ejemplos.

Volvemos a resolver la ecuación diferencial que describe las oscilaciones amortiguadas y detendremos el proceso de integración cuando el móvil alcance la posición máxima, su velocidad es nula.

Supongamos que el oscilador amortiguado estudiado anteriormente, de frecuencia natural ω0=2, constante de amortiguamiento γ=0.25, parte de la posición x0=2.5 con velocidad nula, queremos detener el proceso de integración cuando el móvil alcance la posición máxima, cuando su velocidad es nula, tal como se muestra en la figura, con lo que se completa un periodo.

Page 68: matlab Completo

Los pasos a seguir son los siguientes:

1.-Definimos la función cuyo nombre es opcion_ode45function [detect,stopin,direction]=opcion_ode45(t,x) detect=[x(1) x(2)]; %[posición, velocidad] stopin=[0 1]; % 1 indice que detiene la integración cuando la velocidad se hace cero direction=[0 -1]; % 1 crece, -1 decrece, 0 no importaend

2.-Creamos la estructura opts con la llamada a la función odeset

opts=odeset('events',@opcion_ode45);

Cuando se utiliza options la función ode45 devuelve los tiempos te en los cuales ocurren los 'eventos' y los correspondientes valores de las variables dependientes (posición, velocidad) en el vector xe. Finalmente, ie es un índice que es útil cuando se vigilan varios eventos.

3.-Le pasamos opts a la función ode45 en su cuarto parámetro

Page 69: matlab Completo

[t,x,te,xe,ie]=ode45(odefunc,tspan,x0,opts);

Escribimos el script oscilador_2 para resolver la ecuación diferencial de segundo orden y detener el proceso de integración de acuerdo con lo estipulado en el parámetro 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,ieplot(t,x(:,1),'r')grid onxlabel('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 Posición 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 posición 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 posición (índice ie=1), pero no se detiene ya que en stopin se ha puesto un cero.

Cuando la posición es x(1)=1.1322 detecta velocidad nula x(2)=0, (índice ie=2) y la integración numérica 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 oscilación, te=3.1662.

Se sugiere al lector, cambiar en la función opcion_ode45

direction=[0 1];

Page 70: matlab Completo

Vamos ahora a marcar en la representación gráfica de la oscilación amortiguada, las posiciones de máxima amplitudx(2)=0 y cuando pasa por el origen x(1)=0 sin detener el proceso de integración numérica.

Definimos una nueva versión de la función opcion1_ode45function [detect,stopin,direction]=opcion1_ode45(t,x) detect=[x(1) x(2)]; %[posición, velocidad] stopin=[0 0]; direction=[0 0]; end

Creamos la estructura opts mediante odeset y se la pasamos al procedimiento de integración 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);

Page 71: matlab Completo

[t,x,te,xe,ie]=ode45(f,tspan,x0,opts);

hold onplot(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 onxlabel('t')ylabel('x');title('oscilador amortiguado')hold off

Si solamente estamos interesados en los máximos definimos una nueva versión de la función opcion2_ode45function [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,iehold onplot(t,x(:,1),'r')plot(te(ie==1),xe(ie==1),'o','markersize',6,'markerfacecolor','b')grid onxlabel('t')ylabel('x');title('oscilador amortiguado')hold off

Corremos el script oscilador_4 en la ventana de comandos y observamos los resultados

Paso de parámetros a la función

Como hemos visto, a ode45 se le pasa la función (handle) a integrar en su primer argumento. Si la función contiene parámetros como la frecuencia angular ω0, no hay problema si la función se define como anónima, tal como se ha mostrado en los ejemplos previos. Si la función se define en un fichero entonces a la función se le pasan los valores de los parámetros en el quinto argumento params de ode45. Los pasos se explican en el siguiente ejemplo:

Page 72: matlab Completo

El sistema de ecuaciones de Lorentz es un sistema de tres ecuaciones diferenciales de primer ordendxdt=−σx+σydydt=ρx−y−xzdzdt=−βz+xydxdt=−σx+σydydt=ρx−y−xzdzdt=−βz+xy

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,x0=-8, y0=8 z0=27.

1. Escribir una función denominada lorentz(t,x,p) como fichero.M que contenga las tres ecuaciones y dependa de los tres parámetros σ=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 función MATLAB ode45, para resolver el sistema de ecuaciones diferenciales para las condiciones iniciales especificadas.

3. Pasar los parámetros σ, β y ρ como elementos de un vector p a la función ode45 para que a su vez se los pase a la función lorentz.

4. Dibujar el atractor de Lorentz de z en función de x hasta el instante tf=20 en una primera ventana gráfica.

5. Dibujar x, y y z en función del tiempo en tres zonas de una segunda ventana gráfica.

6. Examinar el comportamiento del sistema para otras condiciones iniciales, t=0, x0=1, y0=2 z0=3.

Definimos la función lorentz como fichero .Mfunction 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 inicialestspan=[0 20]; p=[10 8/3 28]; %parámetros%no pasamos nada [] en el parámetro options de ode45[t,x]=ode45(@lorentz,tspan,x0,[],p);figureplot(x(:,1),x(:,3),'r')

Page 73: matlab Completo

xlabel('x')ylabel('z');title('Atractor de Lorentz')

figuresubplot(3,1,1)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 gráficas, la primera con el atractor de Lorentz, la representación z(x) y la segunda ventana dividida en tres regiones que muestran x(t), y(t) y z(t)

InterpolaciónEn este capítulo se estudia la interpolación y la regresión.

La regresión es el ajuste de los datos experiementales a una función que describe el modelo físico particular. Por ejemplo, en un experiemento de movimiento rectilíneo uniforme, los datos experimentales (tiempo, posición del móvil) se ajustan a una línea recta, ya que la ecuación que describe el movimiento rectilíneo uniforme es x=x0+v·t.

En la interpolación la función pasa por todos los puntos.

Este pequeño programa muestra la diferencia

%datos experiementalesx=0.5:0.5:3;y=[0.7,1.2,1.3,1.2,0.8,0.3];hold onplot(x,y,'ro','markersize',4,'markerfacecolor','r')xx=linspace(0,3.1,100);

%regresiónp=polyfit(x,y,2); %polinomio de segundo gradoyy=polyval(p,xx);plot(xx,yy,'b')

%interpolaciónyy=spline(x,y,xx);

Page 74: matlab Completo

plot(xx,yy,'r')

hold offgrid onlegend('datos','regresión','interpolación')xlabel('x')ylabel('y');title('Interpolación, regresión')

En esta página, comenzamos el estudio de la interpolación lineal, continuamos por el método de Lagrange, pero veremos que la interpolación mediante "splines" es mucho más adecuada.

Interpolación lineal

La interpolación lineal es muy sencilla. Disponemos de pares de datos (xk,yk) k=1,2...n. Queremos conocer el valor de ypara un valor cualesquiera de x en el intervalo x1 a xn. Supongamos que x está en el intervalo (xk,xk+1) tal

Page 75: matlab Completo

como se muestra en la figura. Trazamos la recta que pasa por los puntos (xk,yk) y (xk+1,yk+1), cuya ecuación esy=(x−xk)yk+1−(x−xk+1)yk(xk+1−xk)y=(x−xk)yk+1−(x−xk+1)yk(xk+1−xk)

Creamos la función 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)); endend

Probamos la función 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 función MATLAB interp1, pasándole la opción linear en el último parámetro.

x=[0,pi/3,2*pi/3,pi]; %datosy=sin(x);xx=0:pi/90:pi; %funciónyy=sin(xx);x0=[pi/6,pi/2,5*pi/6]; %interpolación linealy0=interpola_lineal(x,y,x0);%y0=interp1(x,y,x0,'linear'); %esta es una función MATLABhold onplot(xx,yy,'b')plot(x,y,'r')plot(x,y,'bo','markersize',4,'markerfacecolor','b')plot(x0,y0,'ro','markersize',6,'markerfacecolor','r')hold offxlabel('x');ylabel('y')title('Interpolación lineal')

Page 76: matlab Completo

Discutiremos en la siguiente sección, la interpolación mediante un polinomio de mayor grado. Podemos calcular los coeficientes de un polinomio de tercer grado y=a1x3+a2x2+a3x+a4 que pase por los cuatro puntos. Obtenemos un sistema de cuatro ecuaciones con cuatro incógnitas.⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪a1x31+a2x21+a3x1+a4=y1a1x32+a2x22+a3x2+a4=y2a1x33+a2x23+a3x3+a4=y3a1x34+a2x24+a3x4+a4=y4⎛⎝⎜⎜⎜⎜x31x32x33x34x21x22x23x24x1x2x3x41111⎞⎠⎟⎟⎟⎟⎛⎝⎜⎜⎜a1a2a3a4⎞⎠⎟⎟⎟=⎛⎝⎜⎜⎜y1y2y3y4⎞⎠⎟⎟⎟{a1x13+a2x12+a3x1+a4=y1a1x23+a2x22+a3x2+a4=y2a1x33+a2x32+a3x3+a4=y3a1x43+a2x42+a3x4+a4=y4(x13x12x11x23x22x21x33x32x31x43x42x41)(a1a2a3a4)=(y1y2y3y4)x=[0,pi/3,2*pi/3,pi]; %datosy=sin(x);xx=0:pi/90:pi; %funciónyy=sin(xx);x0=[pi/6,pi/2,5*pi/6]; %interpolación linealA=vander(x);p=A\y'; %coeficientes del polinomiohold onplot(xx,yy,'b') %datos y función

Page 77: matlab Completo

plot(x,y,'bo','markersize',4,'markerfacecolor','b')yy=polyval(p,xx); %polinomioplot(xx,yy,'r')y0=polyval(p,x0); %valores interpoladosplot(x0,y0,'ro','markersize',6,'markerfacecolor','r')hold offxlabel('x');ylabel('y')title('Interpolación con un polinomio de tercer gardo')

Interpolación de Lagrange

Queremos encontrar los coeficientes de un polinomio de grado N

a1xN+a2xN-1+...+aNx+aN+1

que pase por todos los pares de datos (x1,y1), (x2,y2), ...(xN+1,yN+1). Los coeficientes se pueden obtener resolviendo el sistema de ecuaciones:⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪a1xN1+a2xN−11+aNx1+aN+1=y1a1xN2+a2xN−12+aNx2+aN+1=y2.....a1xNN

Page 78: matlab Completo

+1+a2xN−1N+1+aNxN+1+aN+1=yN+1{a1x1N+a2x1N−1+aNx1+aN+1=y1a1x2N+a2x2N−1+aNx2+aN+1=y2.....a1xN+1N+a2xN+1N−1+aNxN+1+aN+1=yN+1

En forma matricial⎛⎝⎜⎜⎜⎜xN1xN2...xNN+1xN−11xN−12...xN−1N+1............x1x2...xN+111...1⎞⎠⎟⎟⎟⎟⎛⎝⎜⎜⎜a1a2...aN+1⎞⎠⎟⎟⎟=⎛⎝⎜⎜⎜y1y2...yN+1⎞⎠⎟⎟⎟(x1Nx1N−1...x11x2Nx2N−1...x21...............xN+1NxN+1N−1...xN+11)(a1a2...aN+1)=(y1y2...yN+1)

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 número N+1 de datos es relativamente pequeño, las primeras columnas de la matriz A pueden guardar números muy grandes, los efectos del redondeo pueden afectar al valor de los coeficientes ai del polinomio.

Los valores del polinomio se puede obtener también utilizando la función polyfit que emplearemos más adelante en el ajuste por el procedimiento de mínimos 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); %número de pares de datos%A=vander(x);A=zeros(n); %líneas equivalentes a utilizar vander(x)for j=1:n A(:,j)=(x').^(n-j);endp=A\y'; %sistema de ecuaciones lineales, y' es vector columna

p=polyfit(x,y,n-1) %n-1 es el grado del polinomioxx=linspace(0.97,9.44,50); %interpolaciónyy=polyval(p,xx);hold onplot(x,y,'o','markersize',4,'markerfacecolor','r')plot(xx,yy,'b')xlabel('x')ylabel('y')title('Interpolación de Lagrange');hold off

Page 79: matlab Completo

Corremos el script interpola-1 en la ventana de comandos, obtenemos un aviso, los coeficientes del polinomio y la representación gráfica 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 LN(x) de grado N es la expresiónLN(x)=(x−x2)(x−x3)...(x−xN+1)(x1−x2)(x1−x3)...(x1−xN+1)y1+(x−x1)(x−x3)...(x−xN+1)(x2−x1)(x2−x3)...(x2−xN+1)y2+...+(x−x1)(x−x2)...(x−xN)(xN+1−x1)(xN+1−x2)...(xN+1−xN)yN+1LN(x)=(x−x2)(x−x3)...(x−xN+1)(x1−x2)(x1−x3)...(x1−xN+1)y1+(x−x1)(x−x3)...(x−xN+1)(x2−x1)(x2−x3)...(x2−xN+1)y2+...+(x−x1)(x−x2)...(x−xN)(xN+1−x1)(xN+1−x2)...(xN+1−xN)yN+1

Como puede probarse fácilmente este polinomio pasa por todos los puntos (xi,yi).

Page 80: matlab Completo

Podemos elaborar una función 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 (xi,yi) de los datosfunction 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 función 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];>> yy=lagrange_3(x,y,1.0)yy = 10.0725>> yy=lagrange_3(x,y,2.0)yy = -203.7000

Alternativamente, podemos elaborar una función denominada lagrange_p que devuelva los coeficientes del polinomio. El polinomio de Lagrange es la suma de N+1 términos. El numerador de cada término es el producto de N binomios (x-xi)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; endend

Para obtener el producto de los binomios del numerador de cada término, utilizamos la función conv, véase la páginaPolinomios. Por ejemplo, queremos multiplicar los polinomios p1=x3-2x-4 y p2=x2+3x+4

>> p1=[1 0 -2 -4];>> p2=[1 3 4];>> p=conv(p1,p2)p = 1 3 2 -10 -20 -16

Page 81: matlab Completo

Utilizamos la función 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 están 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 interpolación de Lagrange parece que no produce buenos resultados

Splines

Vamos a explicar mediante un ejemplo el procedimiento de interpolación denominado "splines", para generalizarlo después a cualquier conjunto de pares de datos.

Dado el conjunto de pares de datos (x1,y1), (x2,y2), (x3,y3), (x4,y4), (x5,y5) puntos de color rojo en la fihgura. Definimos la función S(x)

S(x)=⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪s1(x) x1≤x<x2s2(x) x2≤x<x3s3(x) x3≤x<x4s4(x) x4≤x<x5si(x)=ai(x−xi)3+bi(x−xi)2+ci(x−xi)+di 

Page 82: matlab Completo

i=1,2,3,4S(x)={s1(x) x1≤x<x2s2(x) x2≤x<x3s3(x) x3≤x<x4s4(x) x4≤x<x5si(x)=ai(x−xi)3+bi(x−xi)2+ci(x−xi)+di i=1,2,3,4

Cada una de las funciones si(x) en color azul en la figura, es un polinomio de tercer grado, cuya primera y segunda derivada esdsidx=3ai(x−xi)2+2bi(x−xi)+cid2sidx2=6ai(x−xi)+2bii=1,2,3,4dsidx=3ai(x−xi)2+2bi(x−xi)+cid2sidx2=6ai(x−xi)+2bii=1,2,3,4

Para calcular las 4×4=16 incógnitas a1,a2,a3,a4, b1,b2,b3,b4, c1,c2,c3,c4, d1,d2,d3,d4, se imponen las siguientes condiciones:

1. La función S(x) pasa por todos los puntos (xi,yi) Â i=1,2,3,4,5

si(xi)=yi⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪d1=y1d2=y2d3=y3d4=y4a4(x5−x4)3+b4(x5−x4)2+c4(x5−x4)+d4=y5si(xi)=yi{d1=y1d2=y2d3=y3d4=y4a4(x5−x4)3+b4(x5−x4)2+c4(x5−x4)+d4=y5

2. La función S(x) es continua en x2, x3, x4.

si−1(xi)=si(xi)⎧⎩⎨⎪⎪⎪⎪a1(x2−x1)3+b1(x2−x1)2+c1(x2−x1)+d1=d2a2(x3−x2)3+b2(x3−x2)2+c2(x3−x2)+d2=d3a3(x4−x3)3+b3(x4−x3)2+c3(x4−x3)+d3=d4si−1(xi)=si(xi){a1(x2−x1)3+b1(x2−x1)2+c1(x2−x1)+d1=d2a2(x3−x2)3+b2(x3−x2)2+c2(x3−x2)+d2=d3a3(x4−x3)3+b3(x4−x3)2+c3(x4−x3)+d3=d4

3. La derivada primera de la función S(x) es continua en x2, x3, x4.

s'i−1(xi)=s'i(xi)⎧⎩⎨⎪⎪⎪⎪3a1(x2−x1)2+2b1(x2−x1)+c1=c23a2(x3−x2)2+2b2(x3−x2)+c2=c33a3(x4−x3)2+2b3(x4−x3)+c3=c4s'i−1(xi)=s'i(xi){3a1(x2−x1)2+2b1(x2−x1)+c1=c23a2(x3−x2)2+2b2(x3−x2)+c2=c33a3(x4−x3)2+2b3(x4−x3)+c3=c4

4. Denominamos m1, m2, m3, m4, m5 al valor de la derivada segunda de si(x) en los puntos x1, x2, x3, x4, x5.

s''i(xi)=mi⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪2b1=m12b2=m22b3=m32b4=m46a4(x5−x4)+2b4=m5s''i(xi)=mi{2b1=m12b2=m22b3=m32b4=m46a4(x5−x4)+2b4=m5

5. La derivada segunda de S(x) es continua en los puntos x2, x3, x4

s''i−1(xi)=s''i(xi)⎧⎩⎨⎪⎪6a1(x2−x1)+2b1=2b26a2(x3−x2)+2b2=2b36a3(x4−x3)+2b3=2b4s''i−1(xi)=s''i(xi){6a1(x2−x1)+2b1=2b26a2(x3−x2)+2b2=2b36a3(x4−x3)+2b3=2b4

Supongamos que el espaciado entre dos puntos consecutivos es constante h=xi-xi-1, i=2,3,4,5.

Page 83: matlab Completo

Vamos a expresar las incógnitas a1,a2,a3,a4, b1,b2,b3,b4, c1,c2,c3,c4, d1,d2,d3,d4, en términos de h, el valor de las ordenadas yi y el valor de la derivada segunda de S(x), mi en cada punto xi, i=1,2,3,4,5.

De (4) y (5) expresamos a1,a2, a3, a4 en términos de m1, m2, m3, m4, m5.a1=m2−m16h a2=m3−m26h a3=m4−m36h a4=m5−m46ha1=m2−m16h a2=m3−m26h a3=m4−m36h a4=m5−m46h

Teniendo en cuenta (1) y (4), las ecuaciones (2) se expresan⎧⎩⎨⎪⎪⎪⎪m2−m16hh3+m12h2+c1h+y1=y2m3−m26hh3+m22h2+c2h+y2=y3m4−m36hh3+m3

2h2+c3h+y3=y4{m2−m16hh3+m12h2+c1h+y1=y2m3−m26hh3+m22h2+c2h+y2=y3m4−m36hh3+m32h2+c3h+y3=y4

Que nos permite despejar c1, c2, c3 en términos de m1, m2, m3, m4, y1, y2, y3, y4

c1=y2−y1h−m2+2m16hc2=y3−y2h−m3+2m26hc3=y4−y3h−m4+2m36hc1=y2−y1h−m2+2m16hc2=y3−y2h−m3+2m26hc3=y4−y3h−m4+2m36h

La última ecuación de (1) nos permite despejar c4

m5−m46hh3+m42h2+c4h+y4=y5c4=y5−y4h−m5+2m46hm5−m46hh3+m42h2+c4h+y4=y5c4=y5−y4h−m5+2m46h

Las ecuaciones (3) se expresan⎧⎩⎨⎪⎪⎪⎪⎪⎪3m2−m16hh2+m1h+y2−y1h−m2+2m16h=y3−y2h−m3+2m26h3m3−m26hh2+m2h+y3

−y2h−m3+2m26h=y4−y3h−m4+2m36h3m4−m36hh2+m3h+y4−y3h−m4+2m36h=y5−y4h−m5+2m46h⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪m1+4m2+m3=6h2(y1−2y2+y3)m2+4m3+m4=6h2(y2−2y3+y4)m3+4m4+m5=6h2(y3−2y4+y5){3m2−m16hh2+m1h+y2−y1h−m2+2m16h=y3−y2h−m3+2m26h3m3−m26hh2+m2h+y3−y2h−m3+2m26h=y4−y3h−m4+2m36h3m4−m36hh2+m3h+y4−y3h−m4+2m36h=y5−y4h−m5+2m46h{m1+4m2+m3=6h2(y1−2y2+y3)m2+4m3+m4=6h2(y2−2y3+y4)m3+4m4+m5=6h2(y3−2y4+y5)

Tenemos tres ecuaciones y cinco incógnitas m1, m2, m3, m4, m5

Fijamos los valores de la derivada segunda m1 y m5 en los puntos extremos. Supongamos que m1=0 y m5=0.

Hay otras posibilidades que se pueden consultar en el documentohttp://online.redwoods.edu/instruct/darnold/laproj/Fall98/SkyMeg/Proj.PDF

Despejamos m2, m3, m4 del sistema de tres ecuaciones

Page 84: matlab Completo

⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪m1+4m2+m3=6h2(y1−2y2+y3)m2+4m3+m4=6h2(y2−2y3+y4)m3+4m4+m5=6h2(y3−2y4+y5)⎛⎝⎜410141014⎞⎠⎟⎛⎝⎜m2m3m4⎞⎠⎟=6h2⎛⎝⎜y1−2y2+y3y2−2y3+y4y3−2y4+y5⎞⎠⎟{m1+4m2+m3=6h2(y1−2y2+y3)m2+4m3+m4=6h2(y2−2y3+y4)m3+4m4+m5=6h2(y3−2y4+y5)(410141014)(m2m3m4)=6h2(y1−2y2+y3y2−2y3+y4y3−2y4+y5)

Caso general

En general, con n pares de datos tendremos el sistema⎛⎝⎜⎜⎜⎜⎜⎜⎜⎜4100....01410...00141...00014.....................10000...4⎞⎠⎟⎟⎟⎟⎟⎟⎟⎟⎛⎝⎜⎜⎜⎜⎜⎜⎜⎜m2m3m4m5...mn−1⎞⎠⎟⎟⎟⎟⎟⎟⎟⎟=6h2⎛⎝⎜⎜⎜⎜⎜⎜⎜⎜y1−2y2+y3y2−2y3+y4y3−2y4+y5y4−2y5+y6....yn−2−2yn−1+yn⎞⎠⎟⎟⎟⎟⎟⎟⎟⎟(4100...01410...00141...00014...0...................000...14)(m2m3m4m5...mn−1)=6h2(y1−2y2+y3y2−2y3+y4y3−2y4+y5y4−2y5+y6....yn−2−2yn−1+yn)

Fijamos los valores de los extremos del vector de las incógnitas m: m1=0, mn-

1=0, a continuación, obtenemos mediante el operador división por la izquierda los valores de m2, m3, ...mn-2, finalmente, se calculan:

los coeficientes a1,a2,a3,...an-1.

a1=m2−m16h a2=m3−m26h a3=m4−m36h ....   an−1=mn−mn−16ha1=m2−m16h a2=m3−m26h a3=m4−m36h ....   an−1=mn−mn−16h los coeficientes b1,b2,b3,...bn-1.

b1=m12 b2=m22 b3=m32 ....  bn−1=mn−12 b1=m12 b2=m22 b3=m32 ....  bn−1=mn−12  los coeficientes c1,c2,c3,...cn-1.

c1=y2−y1h−m2+2m16hc2=y3−y2h−m3+2m26hc3=y4−y3h−m4+2m36h.....cn−1=yn−yn−1h−mn+2mn−16hc1=y2−y1h−m2+2m16hc2=y3−y2h−m3+2m26hc3=y4−y3h−m4+2m36h.....cn−1=yn−yn−1h−mn+2mn−16h los coeficientes d1,d2,d3,...dn-1.

d1=y1 d2=y2 d3=y3 ....  dn−1=yn−1d1=y1 d2=y2 d3=y3 ....  dn−1=yn−1

Codificación

En primer lugar, vamos a entender como trabaja la función diag de MATLAB. La función diag extrae vectores diagonales de la matriz A.

Page 85: matlab Completo

>> A=[1,2,3;4,5,6;7,8,9]A = 1 2 3 4 5 6 7 8 9>> diag(A) %diagonal principalans = 1 5 9>> diag(A,1) %diagonal superiorans = 2 6>> diag(A,-1) %diagonal inferiorans = 4 8

La función 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 función diff calcula la diferencia entre dos elementos consecutivos del vector yy=[y1,y2,y3,y4,y5]d1=diff(y)=[y2−y1,y3−y2,y4−y3,y5−y4]d2=diff(d1)=[y3−2y2−y1,y4−2y3−y2,y5−2y4−y3]y=[y1,y2,y3,y4,y5]d1=diff(y)=[y2−y1,y3−y2,y4−y3,y5−y4]d2=diff(d1)=[y3−2y2−y1,y4−2y3−y2,y5−2y4−y3]

El vector de los términos independientes se calcula aplicando dos veces la función diff al vector y de las ordenadas.

Estamos en condiciones de crear un script que calcule las incógnitas m2, m3, ... mn-1, aplicando el operador división por la izquierda.

x=-4:4;y=sin(x)./(1+x.^2);h=x(2)-x(1); %espaciado constante

n=length(x); %número de pares de datosA=diag(4*ones(n-2,1))+diag(ones(n-3,1),1)+diag(ones(n-3,1),-1); %matriz de dimensión n-2s=diff(diff(y))*6/h^2; %vector de los términos indpendientesmm=A\s'; %vector de las incógnitasm=[0;mm;0]; %ceros en los extremosfor i=1:n-1 a(i)=(m(i+1)-m(i))/(6*h); b(i)=m(i)/2;

Page 86: matlab Completo

c(i)=(y(i+1)-y(i))/h-(m(i+1)+2*m(i))*h/6; d(i)=y(i);end%dibuja los puntoshold onplot(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); %funciónyy=sin(xx)./(1+xx.^2);;plot(xx,yy,'g')hold offgrid onxlabel('x')ylabel('y')title('Interpolación por splines')

Si superponemos la función (en color verde)y=sin(x)x2+1y=sin(x)x2+1

con los nueve puntos unidos mediante polinomios de tercer grado (en color rojo) veremos que la curva interpolada y la exacta están próximas.

Page 87: matlab Completo

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.

Comparación

Función spline de MATLAB

Utilizamos la función spline de MATLAB, pero es posible que las condiciones en los extremos que en el ejemplo anterior se han establecido en m1=0, mn-1=0, sean ahora diferentes.

x=-4:4;y=sin(x)./(1+x.^2);%dibuja los puntoshold onplot(x,y,'o','markersize',4,'markeredgecolor','b','markerfacecolor','b')

Page 88: matlab Completo

xx=linspace(-4,4,300); yy=spline(x,y,xx); %interpolaciónplot(xx,yy, 'r')

yy=sin(xx)./(1+xx.^2);plot(xx,yy,'g') %funciónhold offgrid onxlabel('x')ylabel('y')title('Interpolación por splines de MATLAB')

Interplación de Lagrange

Ahora interpolamos mediante un polinomio de grado n-1 que pasa por los nueve puntos (xi,yi) del ejemplo anterior

x=-4:4;y=sin(x)./(1+x.^2);%dibuja los puntos

Page 89: matlab Completo

hold onplot(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 resultadoxx=linspace(-4,4,300); %superposición de la curvayy=polyval(p,xx);plot(xx,yy, 'r')

yy=sin(xx)./(1+xx.^2);plot(xx,yy,'g')hold offgrid onxlabel('x')ylabel('y')title('Interpolación por Lagrange')

El resultado deja mucho que desear principalmente, en el primer y último intervalo.

Aproximación de funciones

Page 90: matlab Completo

Muchas funciones matemáticas 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 rápidamente, tomando los primeros términos se puede aproximar la funciónf(x) por un polinomio de grado n no muy elevado.

Tomamos n valores de la función yi=f(xi) con i=1...n. y determinamos el polinomio de grado n-1 que pasa a través de los puntos (xi,yi). Sea la funcióny=1x2+1y=1x2+1

Tomamos diez abscisas xi espaciadas 0.8 en el intervalo [-4,4]. Representamos la función (en color rojo), los puntos (xi,yi) y el polinomio que pasa por dichos puntos (en color azul). Dado que la función es simétrica 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) %aproximación mediante el polinomio py2=f(x1); %funciónhold onplot(x1,y1,'b')plot(x1,y2,'r')plot(xx(xx>=0),yy(xx>=0),'ro','markersize',2,'markerfacecolor','r')hold offxlabel('x')ylabel('y')title('Interpolación de una función')

Page 91: matlab Completo

Sorprendentemente, si los puntos no están igualmente espaciados, podemos obtener una mejor aproximación. Si tomamos los puntos en el intervalo [a,b] espaciados de acuerdo a la fórmula denominada puntos de Chebyshev, que se estudiará en la próxima página.xi=a+b2+a−b2cos(πn(i−12)) 1≤i≤nxi=a+b2+a−b2cos(πn(i−12)) 1≤i≤n

La función linspace, nos crea un vector de abscisas xi igualmente espaciados entre a y b. La función que hemos denominado lincheby crea un vector de abscisas xi, espaciados de acuerdo a la fórmula 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);

Page 92: matlab Completo

x1=linspace(0,b,100);y1=polyval(p,x1); %aproximación mediante el polinomio py2=f(x1); %funciónhold onplot(x1,y1,'b')plot(x1,y2,'r')plot(xx(xx>=0),yy(xx>=0),'ro','markersize',2,'markerfacecolor','r')hold offxlabel('x')ylabel('y')title('Interpolación de una función')

Como podemos apreciar la mejora es importante

Ajuste de datosEn esta página, estudiaremos la regresión lineal, es decir la determinación de la ecuación de la recta que mejor ajusta a una distribución bidimensional de datos. Se explicará el método de los mínimos cuadrados para aproximar un polinomio a un conjunto de datos experimentales.

Page 93: matlab Completo

Regresión lineal

http://www.sc.ehu.es/sbweb/fisica_/cinematica/rectilineo/regresion/regresion.html

Abordaremos en esta página las distribuciones bidimensionales. Las observaciones se dispondrán 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 producción agrícola (efecto). O bien, el aumento del precio de un bien, da lugar a una disminución de la cantidad demandada del mismo.

Si utilizamos un sistema de coordenadas cartesianas para representar la distribución bidimensional, obtendremos un conjunto de puntos conocido con el diagrama de dispersión, cuyo análisis permite estudiar cualitativamente, la relación entre ambas variables. El siguiente paso, es la determinación de la dependencia funcional entre las dos variables x e y que mejor ajusta a la distribución bidimensional. Se denomina regresión lineal cuando la función es lineal, es decir, requiere la determinación de dos parámetros: la pendiente y la ordenada en el origen de la recta de regresión, y=ax+b.

La regresión nos permite además, determinar el grado de dependencia de las series de valores X e Y, prediciendo el valor y estimado que se obtendría para un valor x que no esté en la distribución.

Vamos a determinar la ecuación de la recta que mejor ajusta a los datos representados en la figura. Se denomina error εia la diferencia yi-y, entre el valor observado yi, y el valor ajustado y= axi+b, tal como se ve en la figura inferior. El criterio de ajuste se toma como aquél en el que la desviación cuadrática media sea mínima, es decir, debe de ser mínima la sumaE=∑1nε2i=∑1n(yi−(axi+b))2E=∑1nεi2=∑1n(yi−(axi+b))2

Page 94: matlab Completo

El extremos de una función: máximo o mínimo 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 incógnitas del que se despeja a y b.∂E∂a=0  ∂E∂b=0a=n∑1nxiyi−(∑1nxi)(∑1nyi)n∑1nx2i−(∑1nxi)2   b=∑1nyi−a∑1nxin∂E∂a=0  ∂E∂b=0a=n∑1nxiyi−(∑1nxi)(∑1nyi)n∑1nxi2−(∑1nxi)2   b=∑1nyi−a∑1nxin

Expresiones más elaboradas nos permiten determinar el error de a, Δa y el error de b,  ΔbΔa=n√⋅σn∑1nx2i−(∑1nxi)2⎷  σ=∑1n(yi−axi−b)2n−2−−−−−−−−−−√Δb=Δa⋅∑1nx2in−−−−√Δa=n⋅σn∑1nxi2−(∑1nxi)2  σ=∑1n(yi−axi−b)2n−2Δb=Δa⋅∑1nxi2n

La pendiente de la recta se escribirá a±Δa, y la ordenada en el origen b±Δb. Véase las reglas para expresar una medida y su error de una magnitud.

El coeficiente de correlación es otro parámetro para el estudio de una distribución bidimensional, que nos indica el grado de dependencia entre las variables X e Y. El coeficiente de correlación r es un número que se obtiene mediante la fórmula.r=∑1n(xi−<x>)(yi−<y>)∑1n(xi−<x>)2−−−−−−−−−−−−−√∑1n(yi−<y>)2−−−−−−−−−−−−−√r=∑1n(xi−<x>)(yi−<y>)∑1n(xi−<x>)2∑1n(yi−<y>)2

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 cuadráticas medias de X y de Y.

Page 95: matlab Completo

El coeficiente de correlación puede valer cualquier número comprendido entre -1 y +1.

Cuando r=1, la correlación lineal es perfecta, directa.

Cuando r=-1, la correlación lineal es perfecta, inversa

Cuando r=0, no existe correlación alguna, independencia total de los valores X e Y

Ejemplo

Un vehículo 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) Posición x (m)

17.6 0

40.4 900

67.7 1800

90.1 2700

Ajustar los datos a la línea recta

x=x0+vt

y estimar el mejor valor de la velocidad v aplicando el procedimiento de mínimos cuadrados

Utilizando el applet de la página Regresión lineal, obtenemos los siguientes valores: la pendiente es a=36.71 y el error de la pendiente Δa=1.001. La velocidad se escribe (véase la página Errores en las medidas)

v=37±1 m/sfunction [a b]=regresion(x,y) n=length(x); a=zeros(2,1); b=zeros(2,1); %pendiente de la recta de regresión, a a(1)=(n*sum(x.*y)-sum(x)*sum(y))/(n*sum(x.^2)-sum(x)*sum(x)); %ordenada en el origen, b

Page 96: matlab Completo

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(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 dimensión 2 hemos guardado la pendiente en a(1) y su error en a(2)

En el vector b de dimensión 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 regresión, su error Δa, la ordenada en el origen by 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));

%gráficaplot(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]); %rectaxlabel('t')ylabel('x')title('Regresión lineal')

En la ventana de comandos corremos el script datos_1

>> datos_1pendiente a= 36.710, error 1.001ordenada b= -630.509, error 60.580

Page 97: matlab Completo

Queda como trabajo al lector calcular el coeficiente de correlación. Solución r=0.99926

La función potencial

y=c·xa

Se puede trasformar en

log y=a·log x+log c

Si usamos las nuevas variables X=log x e Y=log y, obtenemos la relación lineal

Y=aX+b.

Donde b=log c

Ejemplo:

Page 98: matlab Completo

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 logarítmico 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('Función potencial')

Para determinar la recta de regresión, 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

Page 99: matlab Completo

Y=log y 0.025 0.124 0.182 0.225 0.258 0.281 0.303 0.324

Calculamos mediante la función regresion los parámetros 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));

%gráficahold onplot(x,y,'ro','markersize',8,'markerfacecolor','r')z=(10^b(1))*x.^a(1);plot(x,z,'b')xlabel('x')ylabel('y')title('Regresión potencial')hold off

Corremos el script datos_2 en la ventana de comandos

>> datos_2exponente a= 0.331coeficiente c = 0.495

Page 100: matlab Completo

Función exponencial

y=c·eax

Tomando logaritmos neperianos en los dos miembros resulta

ln y=ax+ln c

Si ponemos ahora X=x, e Y=ln y, obtenemos la relación 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

Page 101: matlab Completo

Representamos estos datos en un diagrama semilogarítmico 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('Función exponencial')grid on

Para determinar la recta de regresión, 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

Page 102: matlab Completo

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)));

%gráficoshold onplot(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('Regresión exponencial')hold off

Corremos el script datos_3 en la ventana de comandos

>> datos_3exponente a= -0.005coeficiente c = 1036.896

Page 103: matlab Completo

Polinomio aproximador

Supongamos que hemos medido un conjunto de pares de datos (xi, yi) en una experiencia, por ejemplo, la posición de un móvil en ciertos instantes de tiempo.

Queremos obtener una función y=f(x) que se ajuste lo mejor posible a los valores experimentales. Se pueden ensayar muchas funciones, rectas, polinomios, funciones potenciales o logarítmicas.

Una vez establecido la función a ajustar se determinan sus parámetros, en el caso de un polinomio, serán los coeficientes del polinomio de modo que los datos experimentales se desvíen lo menos posible de la fórmula empírica. La función más sencilla es la función lineal y=ax+b, que hemos descrito en la sección anterior

Queremos aproximar un polinomio de grado n, a un conjunto de m pares de datos (xi, yi) de modo que n<m. Sea el polinomio

P(x)=a1xn+a2xn-1+...anx+an+1

Se calcula la cantidadS=∑j=1m(P(xi)−yi)2=∑j=1m(a1xnj+a2xn−1j+anxj+an+1−yi)2S=∑j=1m(P(xi)−yi)2=∑j=1m(a1xjn+a2xjn−1+anxj+an+1−yi)2

Para obtener los valores de los coeficientes del polinomio aproximador se tienen que determinar los valores de los coeficientes a1, a2, a3, ...an, an+1 de forma que la cantidad S tome un valor mínimo.

Hagamos las derivadas parciales de S respecto de a1, a2, a3, ...an, an+1 iguales a cero12∂S∂a1=∑j=1m(a1xnj+a2xn−1j+anxj+an+1−yi)xnj12∂S∂a2=∑j=1m(a1xnj+a2xn−1j+anxj+an+1−yi) xn−1j....................................12∂S∂an=∑j=1m(a1xnj+a2xn−1j+anxj+an+1−yi) xj12∂S∂an+1=∑j=1m(a1xnj+a2xn−1j+anxj+an+1−yi)12∂S∂a1=∑j=1m(a1xjn+a2xjn−1+anxj+an+1−yi)xjn12∂S∂a2=∑j=1m(a1xjn+a2xjn−1+anxj+an+1−yi) xjn−1....................................12∂S∂an=∑j=1m(a1xjn+a2xjn−1+anxj+an+1−yi) xj12∂S∂an+1=∑j=1m(a1xjn+a2xjn−1+anxj+an+1−yi)

Obtenemos un sistema de n+1 ecuaciones con n+1 incógnitas, a1, a2, a3, ...an, an+1

(∑j=1mx2nj)a1+(∑j=1mx2n−1j)a2+...+(∑j=1mxn+1j)an+(∑j=1mxnj)an+1=∑j=1myjxnj(∑j=1mx2n−1j)a1+(∑j=1mx2n−2j)a2+...+

Page 104: matlab Completo

(∑j=1mxnj)an+(∑j=1mxn−1j)an+1=∑j=1myjxn−1j.........(∑j=1mxnj)a1+(∑j=1mxn−1j)a2+...+(∑j=1mxj)an+man+1=∑j=1myj(∑j=1mxj2n)a1+(∑j=1mxj2n−1)a2+...+(∑j=1mxjn+1)an+(∑j=1mxjn)an+1=∑j=1myjxjn(∑j=1mxj2n−1)a1+(∑j=1mxj2n−2)a2+...+(∑j=1mxjn)an+(∑j=1mxjn−1)an+1=∑j=1myjxjn−1.........(∑j=1mxjn)a1+(∑j=1mxjn−1)a2+...+(∑j=1mxj)an+man+1=∑j=1myj

que podemos escribir, altenativamente⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪s1a1+s2a2+....snan+sn+1an+1=t1s2a1+s3a2+....sn+1an+sn+2an+1=t2.......sn+1a1+sn+2a2+....s2nan+s2n+1an+1=tn+1sk=∑j=1mx2n+1−kj k=1...2n+1tk=∑j=1myjxn+1−kj k=1...n+1{s1a1+s2a2+....snan+sn+1an+1=t1s2a1+s3a2+....sn+1an+sn+2an+1=t2.......sn+1a1+sn+2a2+....s2nan+s2n+1an+1=tn+1sk=∑j=1mxj2n+1−k k=1...2n+1tk=∑j=1myjxjn+1−k k=1...n+1function 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 términos independientes for k=1:n+1 t(k)=sum(y.*x.^(n+1-k)); end %elementos de la matriz A de las incógnitas 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 función 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 función calcula los elementos de la matriz A de las incógnitas, el vector t de los términos independientes y resuelve el sistema de n+1 ecuaciones con n+1 incógnitas mediante el operador división por la izquierda.

Ejemplo

Una experiencia que se puede llevar a cabo con la ayuda de un cronómetro es la de establecer una relación entre la lectura n del contador del reproductor de la casete y el tiempo t transcurrido. Vamos a comprobar que esta relación no es lineal

Page 105: matlab Completo

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 gráfica semejante a la figura más 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

744 2786

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

7.44 46.43

Ajustar el conjunto de pares de datos de la tabla de la derecha a un polinomio de segundo grado a1x2+a2x+a3.

Creamos el script datos_5 con los datos y llamamos a la función 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)

%gráficoshold onplot(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 a1,a2, a3del polinomio

Page 106: matlab Completo

>> datos_5p = 0.3446 3.7004 -0.1188

Ajuste de datos con MATLABMATLAB dispone de la función polyfit para ajustar datos a un polinomio de grado n. También tiene la posibilidad de ajustar los datos de forma interactiva en la ventana gráfica (Figure Windows) seleccionado en el menú Tools/Basic Fitting.

Ajuste de datos con el operador, división por la izquierda \.

Page 107: matlab Completo

Conocidos los n pares de datos (xi,yi) i=1,2...n resolvemos el sistema de n ecuaciones para determinar las incógnitas, los coeficientes a1,a2, a3 del polinomio que mejor ajustay=a1x2+a2x+a3⎛⎝⎜⎜⎜y1y2...yn⎞⎠⎟⎟⎟=⎛⎝⎜⎜⎜⎜x21x22...x2nx1x2...xn11...1⎞⎠⎟⎟⎟⎟⎛⎝⎜a1a2a3⎞⎠⎟y=a1x2+a2x+a3(y1y2...yn)=(x12x11x22x21.........xn2xn1)(a1a2a3)

Tenemos n=9 pares de datos (xi,yi). Por lo que tenemos un sistema de nueve ecuaciones con tres incógnitas, que podemos resolver con el operador \ (división 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 onplot(x,y,'ro','markersize',8,'markerfacecolor','r')x=(0:0.1:max(x))';y=[x.^2,x,ones(size(x))]*a; %evalúa el polinomio para cada valor de xplot(x,y,'b')xlabel('x')ylabel('y')title('Polinomio aproximador')hold off

En la ventana de comandos vemos los coeficientes a1,a2, a3 como elementos del vector a. En la ventana gráfica 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 función 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.

Page 108: matlab Completo

Para n=1 tenemos la regresión lineal. Si m es el número de datos, el polinomio pasa a través 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 función MATLAB polyfit en vez de apol_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=polyfit(x,y,2)

%gráficoshold onplot(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 a1,a2, a3del polinomio

>> datos_6p = 0.3446 3.7004 -0.1188

También se puede utilizar polyfit para realizar ajustes a una función potencial, exponencial, logarítmica, etc, tal como se muestra en el siguiente cuadro

Función Llamada a polyfit

y=c·xa p=polyfit(log(x), log(y),1)

y=c·eax p=polyfit(x, log(y),1)

y=a·ln(x)+c p=polyfit(log(x),y,1)

y=1ax+cy=1ax+c p=polyfit(x,1./y,1)

El primer elemento del vector p devuelto por polyfit, p(1) guarda el parámetro a y el segundo elemento, p(2) guarda el parámetro c.

Renombramos el script datos_2 como datos_7 para cambiar la llamada a la función MATLAB polyfit en vez deregresion.

Page 109: matlab Completo

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 onplot(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('Regresión potencial')hold off

Corremos el script datos_7 en la ventana de comandos

>> datos_7exponente a= 0.331coeficiente c = 0.495

Renombramos el script datos_3 como datos_8 para cambiar la llamada a la función MATLAB polyfit en vez deregresion.

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 onplot(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('Regresión exponencial')hold off

Corremos el script datos_8 en la ventana de comandos

>> datos_8exponente a= -0.005coeficiente c = 1036.896

Ajuste de forma interactiva

Determinar la recta de regresión 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

Page 110: matlab Completo

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 onxlabel('x'), ylabel('y'), title('ajuste con polyfit')legend('datos originales','mejor ajuste','Location','SouthEast')

Corremos el script en la ventana de comandos

>> datos_9p = 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 representación gráfica de los puntos con el símbolo +

Page 111: matlab Completo

Seleccionamos en el menú Tools/Basic Fitting, y activamos la casilla linear (polinomio de grado 1) yquadratic(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

Page 112: matlab Completo

Ampliamos el cuadro de diálogo pulsando en el botón 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.17286Norm 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.046071Norm of residuals = 0.045696

Page 113: matlab Completo

Pulsamos el botón con la flecha --> para ampliar otra vez el cuadro de diálogo, podemos introducir un valor o una expresión para ser evaluada pulsando el botón 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).