comenzando con matlab
DESCRIPTION
Aqui encontraras algunos metodos como es el metodo LU, gauss jacobi y runge kutta orden 4 aplicados en matlabTRANSCRIPT
-
COMENZANDO CON MATLAB
Entorno de trabajo
Lo primero al abrir Matlab es como se muestra a continuacin:
Entorno de Matlab
o Command Window
Aqu es donde empezaremos a escribir nuestros comandos.
o Workspace
Se muestran las variables que se estn utilizando en el momento.
o Command History
Historial de los comandos usados. Al salir del programa estos quedan guardados,
se pueden utilizar haciendo clic sobre alguno de ellos.
-
2
Herramientas Bsicas
exit/quit
Provoca la salida y cierre de Matla.
>>exit
>>quit
clc
Limpia la ventana de comandos (Commando Windows).
>>clc
help
Muestra la ayuda en la ventana de comandos de la funcin especificada.
>>help funcin
doc
Similar a help pero muestra la documentacin de la funcin en el buscador
del help. Abre una ventana con un ejemplo.
>>doc funcin
format
Cambia la cantidad de decimales que se muestran por variable, ejemplos:
>>format long muestra 14 decimales
>>pi
ans = 3.141592653589793
>>format bank muestra 2 decimales
>>pi
ans = 3.14
>>format short e notacin cientfica
>>pi
ans =
3.1416e+00
>>format long e notacin cientfica con 14 decimales
>>pi
ans =
3.141592653589793e+00
>>format short muestra 4 decimales, formato de matlab
>>pi
ans =
3.1416
-
3
clear
Borra todas las variables creadas o alguna especificada.
>>clear
>>clear variable1 variable2
who
Muestra las variables que han sido creadas.
>>who
whos
Similar a who pero muestra ms informacin de las variables.
>>whos
save
Guarda todas las variables del espacio de trabajo o solo las variables que se
especifiquen en un archivo.
>>save(nombre_del_archivo)
>>save(nombre del archivo,variable1,variable2,)
Matrices
Sistema de ecuaciones lineales
(SEL)
Es un sistema de ecuacin de la forma:
AX=B
Donde:
A: Matriz de orden m*n, llamada matriz coeficiente.
X: Matriz de orden n*1, llamada matriz incgnita.
B: Matriz de orden m*1, llamada matriz trminos constantes.
El sistema tiene las siguientes soluciones:
o Rango(A)=Rango(A:B)
Tiene al menos una solucin.
o Rango(A)Rango(A:B)
No existe solucin.
o Rango(A)=Rango(A:B)=N de incgnitas
Solucin nica.
o Rango(A)=Rango(A:B)
-
4
Ejemplos:
Se tiene el siguiente SEL:
x + y 2z = 4
2x y + z = 2
-x + 2y -3z = 2
Expresado de forma matricial quedara:
1 1 22 1 1
1 2 3
=
422
Ver las soluciones de la matriz:
X=A-1B
Como se vera esto en Matlab:
Para escribir una matriz en Matlab se hace de la siguiente forma:
>>A=[ 1Fila ; 2Fila ; 3 Fila ; .]
Si no queremos que nos muestre el resultado agregamos al final del
comando un ;
Inversa de la matriz:
>>inv(A);
Rango de la matriz:
>>Rank(A)
Para hacer un comentario en alguna lnea de comando basta con escribir
%escriben_su_comentario
Ingresando el ejercicio anterior en Matlab
>> A=[1 1 -2;2 -1 1;-1 2 -3] %Nos muestra la variable
A =
1 1 -2
2 -1 1
-1 2 -3
>> B=[4;2;2]; %No nos muestra la variable
-
5
>> X=inv(A)*B
Warning: Matrix is singular to working precision.
X =
Inf
Inf
Inf
Se puede ver que tenemos infinita solucin.
Rango de la matriz:
>> AB=[A,B]
AB =
1 1 -2 4
2 -1 1 2
-1 2 -3 2
>> rank(A)
ans =
2
>> rank(AB)
ans =
2
Rango de A igual a Rango de A:B y menor N de incognitas. Infinitas soluciones
Mtodo directo LU
Se tiene el siguiente SEL
20 10 4 = 26 10 25 5 = 0 4 5 + 20 = 7
En forma matricial quedara:
(20 10 4
10 25 54 5 20
) (
) = (2607
)
-
6
Matlab
>> A=[20 -10 -4;-10 25 -5;-4 -5 20]
A =
20 -10 -4
-10 25 -5
-4 -5 20
>> B=[26;0;7]
B =
26
0
7
>> [l,u,p]=lu(A)
l =
1.0000 0 0
-0.5000 1.0000 0
-0.2000 -0.3500 1.0000
u =
20.0000 -10.0000 -4.0000
0 20.0000 -7.0000
0 0 16.7500
p =
1 0 0
0 1 0
0 0 1
Z=L-1 * B Z=L-1 * P-1 * B
P=Matriz identidad PMatriz identidad X=U-1 * Z X=U-1 * Z
>> Z=inv(l)*B
Z =
26.0000
13.0000
16.7500
>> X=inv(u)*Z
X =
2
1
1
X=2 ; y=1 ; z=1
-
7
1) Resolver el siguiente SEL mediante el mtodo LU:
652
64
642
63
64
54321
4321
5432
4321
5321
xxxxx
xxxx
xxxx
xxxx
xxxx
Mtodo Gauss-Jacobi
Se tiene la matriz:
AX=B
La cual debe quedar:
A=D+L+U
D=diagonal de A
L=matriz inferior de A
U=matriz superior de A
dCXX
BDXULDX
BDXULDX
nn
d
n
C
n
)1()(
1
)1(
1
)(
11
)(
)(
Para poder usar este mtodo se debe crear el cdigo en un script, ya que hay que
hacer varias iteraciones. Para esto veremos los siguientes cdigos a tener en
cuenta:
if
Si la condicin se cumple se ejecuta el cdigo contenido, si no, salta.
>>if condicin
>>cdigo
>>end
else-if
Igual que if solo que si no cumple la condicin va al otro cdigo.
>>if condicin
>>cdigo cuando se cumple la condicin
>>else
>>cdigo cuando no se cumple la condicin
>>end
-
8
for
Ejecuta el cdigo en un ciclo determinado de veces.
>>for variable=inicio:incremento:final
>>cdigo
>>end
while
Ejecuta el cdigo mientras la condicin sea verdadera
>>while condicin
>>cdigo
>>end
El siguiente cdigo servir para realizar una operacin mediante el mtodo de Gauss-
Jacobi
clear all clc
%Definimos variables A=input('Introdusca la matriz A: ') B=input('Introdusca la matriz B: ') ite=input('Introdusca cantidad de iteraciones a realizar: ');
[f,c]=size(A); %tamao de la matriz, filas, columnas l=tril(A); %matriz triangular inferior u=triu(A); %matriz triangular superior m=diag(A);
x0=zeros(f,1);
%creamos matriz triangular inferior y superior while diag(l)>0 for i=1:f l(i,i)=0; %ponemos la cero la fila y columna i u(i,i)=0; end end
D=zeros(f,c);
%creamos matriz diagonal de A while diag(D)==0 for i=1:f D(i,i)=m(i,1); end end
%variables para la solucion C=-inv(D)*(l+u); d=inv(D)*B; xn=x0; k=0; clc fprintf('Las soluciones son: \n'); fprintf('\n');
-
9
%soluciones for i=1:ite xi=C*xn+d; xn=xi; k=k+1; fprintf('x(%d)',k); fprintf('%10.4f',xi); fprintf('\n'); end
fprintf('\n Analisis de convergencia\n'); %***Definicion de variables*** AC=diag(A); contador=0;
%diagonal dominante for i=1:c ai=A(:,i); %separar en columnas ai(i,i)=0; sum_ai=sum(abs(ai)); %sumar el valor absoluto de la columna for j=1:f acj=AC(j,1); if sum_ai
-
10
2) Resolver mediante el mtodo de Gauss-Jacobi:
652
64
642
63
64
54321
4321
5432
4321
5321
xxxxx
xxxx
xxxx
xxxx
xxxx
-
11
Mtodo Mnimos Cuadrados
Dados (n+1) puntos (Xi,Yi) i=0,1,.,n. Se determina la funcin:
m
i
ii xfxf0
)()(
Tal que su error sea:
n
i
ii xfy0'
2))((
Usando la forma compacta se tiene:
xi x0 x1 .. xn yi y0 y1 .. yn
Ajustar por:
)()()()( 1100 xfxfxfxf mm
Para obtener m ,...,, 10 se forma el siguiente SEL (sistema de ecuaciones lineales):
Ax=B
1)1(
1
0
1)1(
1
0
)1()1(
10
11110
00100
)()()(
)()()(
)()()(
xnB
n
xmX
m
mxnA
nmnn
m
m
y
y
y
xfxfxf
xfxfxf
xfxfxf
Ejemplo: Ajustar los datos por una funcin lineal baxxf )( donde:
x 0.0 1.0 2.0 2.5 3.0
y 2.9 3.7 4.1 4.4 5.0
Se tiene 1*)( baxxf dnde xxf )(0 ; 1)(1 xf
Las matrices asociadas son:
*
13
15.2
12
11
10
0.5
4.4
1.4
7.3
9.2
b
a
-
12
Se normaliza el SEL multiplicando por la matriz A transpuesta, lo cual quedara:
BAAAxBAxAA TTTT 1
Resolviendo en Matlab
>> A=[0 1 2 2.5 3;1 1 1 1 1]' %Definimos matriz A
A =
0 1.0000
1.0000 1.0000
2.0000 1.0000
2.5000 1.0000
3.0000 1.0000
>> B=[2.9 3.7 4.1 4.4 5]' %Definimos matriz B
B =
2.9000
3.7000
4.1000
4.4000
5.0000
>> x=(inv(A'*A))*(A'*B)
x =
0.6431
2.9267
9267.26431.0)( xxf
Usando comandos en Matlab
Definimos los valores de la tabla
>> xi=[0 1 2 2.5 3]
xi =
0 1.0000 2.0000 2.5000 3.0000
>> yi=[2.9 3.7 4.1 4.4 5];
Usamos comando polyfit el cual forma el polinomio de interpolacin, y el 1 ya
que queremos un polinomio de grado 1 de la forma baxxf )(
>> f=polyfit(xi,yi,1)
f =
0.6431 2.9267
9267.26431.0)( xxf
-
13
Graficando los valores
>> plot(xi,yi,'r*') %usamos r* para obtener una grfico
con * en rojo
Ahora generaremos una recta para visualizar el error
o linspace(inicio,fin,espaciado)
>> x=linspace(0,5,20); %vamos desde 1 hasta 5
espaciado 20 veces
o polyval(funcin, valores), evaluamos el polinomio con valores
>> y=polyval(f,x);
>> hold on %Para conservar el grafico anterior
>> plot(x,y)
Para saber el error se utilizan los siguientes comandos:
>> fxi=polyval(f,xi); %evaluamos la funcin encontrada
9267.26431.0)( xxf con los valores de
xi
>> error=sum((yi-fxi)^.2) %sumamos los valores
error =
0.0692
0 0.5 1 1.5 2 2.5 32.5
3
3.5
4
4.5
5
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 52.5
3
3.5
4
4.5
5
5.5
6
6.5
-
14
Ejercicios
1. Dado
x 0.05 0.12 0.15 0.3 0.45 0.7 0.84 1.05
y 0.957 0.851 0.832 0.72 0.583 0.378 0.295 0.156
Ajustar los datos a un polinomio cubico.
2. Dado
x 0 8 16 24 32 40
y 14.621 11.843 9.87 8.418 7.305 6.413
Ajustar los datos a un polinomio de cuarto grado.
-
15
Metodo Runge-Kutta de Orden 4
Este mtodo se utiliza para resolver Problemas Valor Inicial (PVI) con la siguiente forma:
Dado el PVI:
00 )(
),('
yxy
yxfy
Hallar )(xy con ah en el intervalo ],[ cb
Para resolver este tipo de problemas existen varios mtodos pero nosotros estudiaremos
el mtodo de Runge-Kutta orden 4:
)22( 432161
1 kkkkyy nn
);(*
);(*
);(*
);(*
34
223
222
1
2
1
kyhxfhk
yxfhk
yxfhk
yxfhk
donde
nn
k
nh
n
k
nh
n
nn
Para aplicar este mtodo en Matlab se utilizara el siguiente cdigo:
clc clear all fprintf('METODO DE RUNGE-KUTTA ORDEN 4')
%****Para poder ingresar "x" e "y" de forma simbolica syms x syms y %************
fprintf('\n'); %para obtener un espacio
f=inline(input('Ingrese la derivada de primer orden: ','s')); %inline para poder evaluar la funcin mas adelante % se debe ingresar : "2*x+y" ; para tener y'=2x+y x=input('\nIngrese el valor de Xo: '); y=input('\nIngrese el valor de Yo: '); h=input('\nIngrese el valor de h: '); n=input('\nIngrese numero de iteraciones:'); %Si se desea de [0,2] serian 3 iteraciones, ya que comienza con cero, todo %depende del valor de Xo inicial clc fprintf(' ite x k1 k2 k3 k4 y');
%creamos un ciclo "for" para realizar las iteraciones necesarias
for i=1:n k1=h*(feval(f,x,y)); %feval : evaluamos f en x e y
z=x+(h/2);
-
16
w=y +(k1/2); k2=h*(feval(f,z,w));
w=y+(k2/2); k3=h*(feval(f,z,w));
z=x+h; w=y+k3; k4=h*(feval(f,z,w));
fprintf('\n %0.0f %10.1f %10.4f %10.4f %10.4f %10.4f
%10.4f',i,x,k1,k2,k3,k4,y); x=x+h; y=y+((1/6)*(k1+2*k2+2*k3+k4)); end
fprintf('\n');
Este cdigo nos mostrara en columnas los valores correspondientes a cada iteracin
realizada.
Ejemplo: Resolver el siguiente PVI.
1
5.0)0(
2'
h
y
xxyy
En el intervalo [0,2]
Lo cual al ingresar bien los datos Matlab nos entregara:
ite x k1 k2 k3 k4 y
1 0.0 0.0000 1.0000 1.5000 5.0000 0.5000
2 1.0 5.3333 16.0000 32.0000 138.6667 2.1667
3 2.0 170.6667 640.0000 1813.3333 11136.0000 42.1667
Del cual podemos obtener si se desea y(1) o y(2)
Resolver el siguiente ejercicio: Obtener y(1.5) con h=0.1
Ingresando bien los datos en Matlab, el resultado de este ejercicio es y(1.5)=3.4902
1)1(
2'
y
xyy