% Al guardar un script (conjunto de instrucciones secuenciales; también % llamado “programa”) escrito en Octave, TENER MUY PRESENTE que deben ser % nombres sin espacios y sin símbolos (por ej.: “:”, “-“, “&”, “’”, % etc., no están permitidos en los nombres de scripts). Ejemplos válidos % de nombres de scripts: crecimientoaritmetico, crecimiento_exponencial, % ecuacion_logistica, etc. % -> Se emplea este símbolo (porcentaje) para escribir comentarios en un % script (todo lo que se halla luego de este símbolo, Octave lo “pasa por % alto”). clc % Borra el contenido de la “Command Window”. clear all % Borra todos los comandos empleados hasta el momento de % ejecutar esta instrucción. close all % Borra todos las "ventanas" (por ejemplo, gráficos) empleados hasta el momento de % ejecutar esta instrucción. format loose % Inserta líneas en blanco en las “salidas” (resultados). % Operadores Aritméticos % + adición o suma % – sustracción o resta % * multiplicación % ' transpuesta % ^ potenciación % \ división-izquierda % / división-derecha % .* producto elemento a elemento % ./ y .\ división elemento a elemento % .^ elevar a una potencia elemento a elemento % Estos operadores se aplican también a las variables o valores % escalares, aunque con algunas diferencias. % Todos estos operadores son coherentes con las correspondientes % operaciones matriciales: no se puede por ejemplo sumar matrices que no % sean del mismo tamaño. Si los operadores no se usan de modo correcto se % obtiene un mensaje de error. % Diversas formas de generar vectores % disp muestra en pantalla lo que se escribe entre paréntesis y comillas % simples. disp('Diversas formas de generar vectores _______________________________') disp('x = [10 20 30]') x=[10 20 30] % Vector fila. disp('y = [11; 12; 13]') y=[11; 12; 13] % Vector columna. x_transpuesto=x' % Transpuesto de x. y_transpuesto=y' % Transpuesto de y. disp('x = 1:10') x=1:10 disp('x = 1:2:10') x=1:2:10 disp('x = 1:1.5:10') x=1:1.5:10 disp('x = 10:-1:1') x=10:-1:1 disp('___________________________________________________________________') % Operaciones con vectores disp('Operaciones con vectores __________________________________________') disp('x = 10:-1:1') x=10:-1:1 dos_mas_x=2+x x_mas_dos=x+2 dos_por_x=2.*x x_por_dos=x.*2 dos_div_x=2./x dos_div_x=x.\2 x_div_dos=x./2 x_div_dos=2.\x dos_ele_x=2.^x x_ele_dos=x.^2 Dimension_x=size(x) % Dimensión del vector x. disp('___________________________________________________________________') % Diversas formas de generar Matrices y operar con ellas disp('Diversas formas de generar matrices y de operar con ellas _________') A=[1 4 -3; 2 1 5; -2 5 3] % Matriz cuadrada. A_transpuesta=A' % Transpuesta de A. B=A' B_por_A=B*A disp('B = inv(A)') B=inv(A) % Inversa de A. disp('B * A') invA_por_A=B*A % inv(A)*A. disp('___________________________________________________________________') disp('eye(4)') Identidad_4=eye(4) % Crea la matriz Identidad de tamaño (4×4). disp('magic(4)') Magica_4=magic(4) % Crea una matriz (4×4) con los números 1, 2, ... 4*4, % con la propiedad de que todas las filas y columnas suman lo mismo. disp('rand(3)') Rand_3=rand(3) % Crea una matriz de números aleatorios entre 0 y 1, con % distribución uniforme, de tamaño (3×3). disp('rand(2,5)') Rand_2_5=rand(2,5) % Idem de tamaño (2×5). disp('___________________________________________________________________') % Acceso a los elementos de una Matriz disp('Acceso a los elementos de una matriz ______________________________') A=magic(6) % Recuérdese que Octave accede a los elementos de una matriz por medio de % los índices de fila y de columna encerrados entre paréntesis y % separados por una coma. Por ejemplo: disp('A(2,3)') Parte_A=A(2,3) % El siguiente comando extrae los 4 primeros elementos de la 6ª fila: disp('A(6, 1:4)') Parte_A=A(6, 1:4) % Los dos puntos aislados representan "todos los elementos". Por ejemplo, % el siguiente comando extrae todos los elementos de la 3ª fila: disp('A(3, :)') Parte_A=A(3, :) % Para acceder a la última fila o columna puede utilizarse la palabra % end, en lugar del número correspondiente. % Por ejemplo, para extraer la sexta fila (la última) de la matriz: disp('A(end, :)') Parte_A=A(end, :) % El siguiente comando extrae todos los elementos de las filas 3, 4 y 5: disp('A(3:5,:)') Parte_A=A(3:5,:) % Se pueden extraer conjuntos disjuntos de filas utilizando corchetes [ % ]. Por ejemplo, el siguiente comando extrae las filas 1, 2 y 5: disp('A([1 2 5],:)') Parte_A=A([1 2 5],:) Dimension_A=size(A) % Dimensión de la matriz A. % Suma de los elementos de una Matriz G=magic(4) Suma_Columnas=sum(G) Suma_Filas=sum(G)' disp('___________________________________________________________________') disp('Cambios del órden de los elementos en vectores y matrices _________') % Para invertir el orden de los elementos de un vector: x=rand(1,5) disp('x=x(5:-1:1)') x=x(5:-1:1) % Desde el valor posición 5, decrementar el valor de posición % en 1 unidad hasta el valor posición 1. % Para invertir el orden de las columnas de una matriz se puede hacer lo % siguiente: A=magic(3) disp('A(:,3:-1:1)') Cambio_A=A(:,3:-1:1) % Desde el valor columna 3, decrementar el valor % columna en 1 unidad hasta el valor columna 1. disp('A(3:-1:1,:)') Cambio_A=A(3:-1:1,:) % Desde el valor fila 3, decrementar el valor fila % en 1 unidad hasta el valor fila 1. disp('___________________________________________________________________') % Operadores Relacionales disp('Operadores Relacionales ___________________________________________') % < menor que. % > mayor que. % <= menor o igual que. % >= mayor o igual que. % == igual que. % ~= distinto que. A=[1 2;0 3],B=[4 2;1 5] disp('A == B') Iguales=A==B disp('A ~= B') Distintos=A~=B disp('___________________________________________________________________') %__________________________________________________________________________ % HACIENDO GRÁFICOS % clc disp('3 gráficos con distintos estilos de puntos ________________________') clear all x=(-5:0.5:5); y=x; z=2.*x; figure plot(x,y,'--r',x,z,'--g') grid on; axis('normal') title('1 -> (--, axis normal) Función y = x -en rojo- & Función y = 2*x -en verde-') xlabel('x') ylabel('y') figure plot(x,y,'-+r',x,z,'-+g') grid on; axis('normal') title('2 -> (-+, axis normal) Función y = x -en rojo- & Función y = 2*x -en verde-') xlabel('x') ylabel('y') figure plot(x,y,'-sr',x,z,'-sg') grid on; axis('normal') title('3 -> (-s, axis normal) Función y = x -en rojo- & Función y = 2*x -en verde-') xlabel('x') ylabel('y') %__________________________________________________________________________ % Script de un gráfico % clc disp('Un solo gráfico de la función seno ________________________________') clear all x=0:0.1:10; y=sin(x+pi); disp('y = sin(x+pi)') figure plot(x,y); grid on; xlabel('Valores x') ylabel('Valores y') title('Un solo gráfico de la función seno') disp('___________________________________________________________________') %__________________________________________________________________________ %__________________________________________________________________________ % FOR % Ejemplo de for con la suma de 1 a 5 % clc clear all disp('Ejemplo de for con la suma de 1 a 5') c=0; for i=1:5 disp('i = ') disp(i) i=i+1; c=c+(i-1); disp('c = ') disp(c) end disp('___________________________________________________________________') % Factorial de n de 2 formas: % Forma 1 % clc % clear all % fac=1; % n = input('Nº a factorizar: '); % for i=1:n % fac=fac*i; % end % disp(fac) % Forma 2 % clc disp('Factorial de n ____________________________________________________') clear all fac=1; n=input('Nº a factorizar (n): '); for i=n:-1:1 fac=fac*i; end disp('fac= ') disp(fac) disp('___________________________________________________________________') % Script de varios gráficos con FOR % clc disp('Varios gráficos de la función seno ________________________________') clear all disp('y = sin(x+pi*i)') x=0:0.1:10; figure for i=0.1:0.1:1 y=sin(x+pi*i); hold on plot(x,y); grid on; hold off; end xlabel('Valores x') ylabel('Valores y') title('Varios gráficos de la función seno') disp('___________________________________________________________________') %__________________________________________________________________________ %__________________________________________________________________________ % IF y BUCLES ANIDADOS % Script que entrega el Nº de valores mayores a 0.5 en la matriz Cuadrada % M. % clc disp('Nº de valores mayores a 0.5 en la matriz M ________________________') clear all n=input ('Ingrese la dimensión (n) de la Matriz M: '); c=0; M=rand(n) for i=1:n for j=1:n if M(i,j)>0.5 c=c+1; end end end disp('c = ') disp(c) disp('___________________________________________________________________') %__________________________________________________________________________ %__________________________________________________________________________ % % MI PRIMERA FUNCIÓN % clc disp('Función que calcula el factorial de n _____________________________') clear all n=input('n = '); funcionfac(n); % Se debe escribir lo que sigue a continuación, en un script aparte. % Esto representa a la "funcionfac" [el script de esta función que se % invoca en "funcionfac(n)", más arriba (ver línea 313)]. Necesariamente % debe existir esta función, en el mismo directorio (carpeta) en el que % se halle el script “MI PRIMERA FUNCIÓN”, o este mismo script, % antes de poder ejecutar “MI PRIMERA FUNCIÓN”. % En otro caso, recibiremos un mensaje de error. % Lo que sigue representa el script de la “funcionfac” (nombre del % script, en este caso una función, “funcionfac”): % function [ output_args ] = funcionfac( n ) % Calcula el factorial de un número dado (en este caso, el número “n” % dado por nosotros) % fac=1; % for i=n:-1:1 % fac=fac*i; % end % disp('fac= '); % disp(fac); %__________________________________________________________________________ disp('___________________________________________________________________') format loose %__________________________________________________________________________ % ECUACIONES DIFERENCIALES % Ecuación Diferencial de 1er. Orden (Carga de un Condensador) % clc % clear all disp('Ecuación Diferencial de 1er. Orden (Carga de un Condensador)') disp('...................................................................') disp('Ecuación: ') disp('dq/dt = V0/R - q/RC') disp('...................................................................') disp('Valores por defecto:') disp('FEM V0: 10') disp('Resistencia R: 2') disp('Capacidad C: 0.8') disp('tiempo final, tf: 10') disp('___________________________________________________________________') V0=10; % Voltaje de la FEM R=input('Resistencia R: '); C=input('Capacidad C: '); tf=input ('tiempo final, tf: '); f=@(t,q) V0/R-q/(R*C); % Se define la función "f" -> Ecuación Diferencial Lineal de 1er. Orden % (Carga del Condensador) % Variable independiente -> t (tiempo) % Variable dependiente -> q (Carga) tspan=[0 tf]; q0=0; % Carga inicial del Condensador [t,q]=ode45(f,tspan,q0); figure plot(t,q,'r') grid on; xlabel('t'); ylabel('q'); title('Carga del Condensador') %__________________________________________________________________________ % Sistema de 2 Ecuaciones Diferenciales de 1er. Orden % Desintegración Radiactiva. A->B->C, donde C es un elemento estable % clc % clear all disp('Sistema de 2 Ecuaciones Diferenciales de 1er. Orden') disp('Desintegración Radiactiva. A->B->C, donde C es un elemento estable') disp('...................................................................') disp('Ecuaciones: ') disp('dx/dt = -ax') disp('dy/dt = ax - by') disp('...................................................................') disp('Valores por defecto:') disp('parámetro a: 0.1') disp('parámetro b: 0.2') disp('valor inicial de x: 100') disp('valor inicial de y: 0') disp('tiempo final, tf: 60') disp('___________________________________________________________________') a=input('parámetro a: '); b=input('parámetro b: '); disp('-------------------------------------------------------------------') disp('Condiciones Iniciales en el vector z0: ') z0=zeros(1,2); z0(1)=input('valor inicial de x: '); z0(2)=input('valor inicial de y: '); tf=input('tiempo final, tf: '); % z(1) representará los sucesivos valores de la variable "x" % z(2) representará los sucesivos valores de la variable "y" tspan=[0 tf]; fg=@(t,x) [-a*x(1);a*x(1)-b*x(2)]; [t,x]=ode45(fg,tspan,z0); figure plot(t,x) grid on; xlabel('t') ylabel('x (azul), y (verde)'); title('dx/dt = -ax, dy/dt = ax - by') %__________________________________________________________________________ format loose % Ecuación Diferencial de 2do. Orden (Oscilaciones Amortiguadas) % clc % clear all disp('Ecuación Diferencial de 2do. Orden (Oscilaciones Amortiguadas)') disp('...................................................................') disp('Ecuaciones: ') disp('d^2x/dt^2 + 2*gamma*(dx/dt) + (w0^2)*x = 0') disp('dx/dt = v') disp('dv/dt = -2*gamma*v - (w0^2)*x') disp('...................................................................') disp('Valores por defecto:') disp('frecuencia angular w0: 2') disp('rozamiento, gamma: 0.5') disp('posición inicial, x0: 0') disp('velocidad inicial, v0: 10') disp('tiempo final, tf: 20') disp('___________________________________________________________________') w0=input('frecuencia angular, w0: '); g=input('rozamiento, gamma: '); disp('-------------------------------------------------------------------') disp('Condiciones Iniciales: ') z0=zeros(1,2); z0(1)=input('posición inicial, x0: '); z0(2)=input('velocidad inicial, v0: '); tf=input('tiempo final, tf: '); % z(1) representará los sucesivos valores de la variable "x" % z(2) representará los sucesivos valores de la variable "v" f=@(t,x) [x(2);-2*g*x(2)-w0*w0*x(1)]; tspan=[0 tf]; [t,x]=ode45(f,tspan,z0); figure plot(t,x(:,1),'r') grid on xlabel('t'); ylabel('x'); title('Oscilador Amortiguado'); %__________________________________________________________________________ disp('___________________________________________________________________') % Sistema de 2 Ecuaciones Diferenciales de 2do. Orden % Movimiento de un planeta alrededor del Sol o de un satélite artificial alrededor de la Tierra % clc % clear all disp('Sistema de 2 Ecuaciones Diferenciales de 2do. Orden') disp('Movimiento de un planeta alrededor del Sol o de un satélite artificial alrededor de la Tierra') disp('...................................................................') disp('Ecuaciones: ') disp('d^2x/dt^2 = -4*Pi^2 * x/(x^2+y^2)^3/2)') disp('dx/dt = vsubx') disp('dvx/dt = -4*Pi^2 * x/(x^2+y^2)^3/2)') disp('d^2y/dt^2 = -4*Pi^2 * y/(x^2+y^2)^3/2)') disp('dy/dt = vsuby') disp('dvy/dt = -4*Pi^2 * y/(x^2+y^2)^3/2)') disp('...................................................................') disp('Valores por defecto:') disp('posición inicial, x: 1') disp('velocidad inicial, x: 0') disp('velocidad inicial, y: 6.27') disp('tiempo final, tf: 1') disp('-------------------------------------------------------------------') disp('Condiciones Iniciales: ') z0=zeros(1,4); z0(1)=input('posición inicial, x: '); z0(2)=input('velocidad inicial, x: '); z0(3)=0; z0(4)=input('velocidad inicial, y: '); % z(1) representará los sucesivos valores de la variable "x" % z(2) representará los sucesivos valores de la variable "vx" % z(3) representará los sucesivos valores de la variable "y" % z(4) representará los sucesivos valores de la variable "vy" 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,z0); figure plot(x(:,1),x(:,3),'r') grid on; xlabel('x'); ylabel('y'); title('Órbita de un Planeta'); disp('___________________________________________________________________') %__________________________________________________________________________ disp('Este script ha terminado')