Está en la página 1de 15

Departamento Académico de Ciencias de la Computación - UNMSM

Escuela Académica de Ingeniería de Sistemas - FISI


CURSO: MÉTODOS NUMERICOS

Programación con Octave

Laboratorio 02
Programación en Octave

Objetivo: El estudiante reconoce el lenguaje de programación M que usa Octave, donde es


posible programar y desarrollar algoritmos de ciencias e ingeniería, el lenguaje está orientado
al cálculo numérico y cuenta con una extensa biblioteca de funciones que cubren casi todas
las disciplinas de la Ciencia y la Ingeniería.

Duración de la Práctica: 2 Horas.

Lugar de realización: Laboratorio de cómputo.


El conocimiento requerido para realizar esta práctica es que el estudiante haya hecho uso de
algún lenguaje de programación.

MOTIVACIÓN:
Consideremos el problema físico1 de hallar la porción de una esfera de radio r queda
sumergida al meter la esfera en agua. Supongamos que la esfera está construida con una
variedad de pino que tiene una densidad de ρ = 0.638 gr/cm3 y que su radio mide r = 10 cm.
¿Cuánto vale la profundidad d a la que está sumergido el polo sur de la esfera?.

SOLUCIÓN:
La masa Ma de agua desplazada cuando la esfera se sumerge es

1
Mathews John H., Fink Kurtis D. Métodos numéricos con Matlab. Prentice Hall . Madrid 2000.

John Ledgard Trujillo Trejo – Johnny Avendaño Quiroz Pag. No. 1


Departamento Académico de Ciencias de la Computación - UNMSM
Escuela Académica de Ingeniería de Sistemas - FISI
CURSO: MÉTODOS NUMERICOS

Programación con Octave

Y la masa de la esfera es Me = 4πr3ρ/3

Aplicando el principio de Arquímedes Ma = Me, obtenemos la siguiente ecuación que


debemos resolver:

en nuestro caso (con r = 10 y ρ = 0.638) la ecuación es

Graficando la función polifónica cúbica con Octave, vemos que tiene tres raíces.

Por ejemplo podríamos usar el método de la bisección para obtener las tres raíces:
d1 = -8.17607212, d2 = 11.86150151 y d3 = 26.31457061.

d1 no es solución aceptable del problema porque d no puede ser negativo


d3 no es solución aceptable del problema porque d es mayor que el diámetro de la esfera.
d2 = 11.86150151 está en el intervalo [0, 20], es la solución adecuada.

John Ledgard Trujillo Trejo – Johnny Avendaño Quiroz Pag. No. 2


Departamento Académico de Ciencias de la Computación - UNMSM
Escuela Académica de Ingeniería de Sistemas - FISI
CURSO: MÉTODOS NUMERICOS

Programación con Octave

1.1. PROGRAMANDO CON OCTAVE


Octave tiene un entorno de programación en el que se pueden escribir programas conteniendo
sentencias, expresiones y estructuras de control como condicionales y de tipo bucle. La
sintaxis del lenguaje de programación del Octave es idéntico al lenguaje de programación C.
Los programas en Octrave se escriben en un archivo de texto (archivos ASCII) cuya extensión
es .m . Se pueden escribir cualquier en cualquier editor de texto, pero es preferible utilizar el
editor de texto integrado en el Octave.
Para llamar al editor de texto en Octave se puede hacer de dos maneras:

1. A través de la ventana de comandos con el comando edit


>>edit

2. A través de la Interfaz gráfica del editor escogiendo el icono New script . También
pueden usar la combinación de teclas: Ctrl-N.

Al abrirse el editor lo hace con el nombre de Untitled1, y para guardar el programa se hace
con el icono Save File que abrirá una ventana en donde podrá ponerle el nombre del
archivo y buscar la ubicación donde guardarlo con la extensión .m .
.

Hay dos tipos de archivos M: de script(guion) y de función.


 Los archivos M de script no tienen argumentos de entrada ni de salida, en ellas se
pueden escribir bloques de instrucciones y cálculos que deben efectuarse
repetidamente y operar sobre datos ya existentes en el espacio de trabajo o sobre
datos que se introduzcan por el teclado o algún otro medio, las variables creadas
(variables globales) permanece en el espacio de trabajo una vez que finaliza su lectura.

 Los archivos M de función aceptan argumentos de entrada y salida, sirven para


extender el lenguaje de Octave creando funciones definidas por el usuario, tienen su
propio espacio de trabajo reservado, donde pueden definirse variables propias
(locales) que no afectan al espacio de trabajo general.

John Ledgard Trujillo Trejo – Johnny Avendaño Quiroz Pag. No. 3


Departamento Académico de Ciencias de la Computación - UNMSM
Escuela Académica de Ingeniería de Sistemas - FISI
CURSO: MÉTODOS NUMERICOS

Programación con Octave

Un archivo M de guion (Script) sería el programa principal y los archivos M de función, las
subrutinas que son llamadas desde el programa principal.

1.2. ELEMENTOS DE UN PROGRAMA EN OCTAVE

1. % (comentarios). Para incluir comentarios que aclaren el contenido del programa,


estas deben de ir precedidos del símbolo % (tanto por ciento).

%esto es un comentario en Octave

2. Entrada de datos (input). La sentencia input se puede usar de dos maneras:

 Nombrevariable = input(‘mensaje’) , muestra una cadena de texto (mensaje)


en la ventana de comandos y espera la introducción de datos para asignarlos
a la variable.
Ejemplo:
>> a=input('ingrese dato 1:')
ingrese dato 1:4
a= 4

 Nombrevariable = input(‘mensaje’,’s’) , ‘s’ significa que se introducirán


caracteres en la entrada.
Ejemplo:
>> b=input('Ingrese la ecuación: ','s')
Ingrese la ecuación: x^2+1
b = x^2+1

3. Mostrar datos (disp y fprintf). El comando disp., muestra un mensaje o el


contenido de una variable en la ventana de comandos.

disp(‘mensaje’) o disp(nombrevariable).

Ejemplo:
>> a=[1 2 3;4 5 6;7 8 9];
>> disp('El valor de a es :')
El valor de a es :
>> disp(a)
1 2 3
4 5 6
7 8 9

John Ledgard Trujillo Trejo – Johnny Avendaño Quiroz Pag. No. 4


Departamento Académico de Ciencias de la Computación - UNMSM
Escuela Académica de Ingeniería de Sistemas - FISI
CURSO: MÉTODOS NUMERICOS

Programación con Octave

El comando fprintf se utiliza para visualizar salidas del programa (texto y datos)
con ciertos formatos en la ventana de comandos.

fprintf(´texto1 formato1, texto2 formato2 ….’, variable1, variable2, …)

 formato: nos brinda información sobre los datos a mostrar, se inicia con el
símbolo % (porcentaje):
Flag o bandera: - (signo menos) justificación izquierda del número dentro del
campo, + (signo mas) visualiza el carácter del signo ( + o -) delante del número.
Y 0 (cero) añade ceros si el número es más pequeño que el campo.
Ancho del campo y precisión: está formado por dos números unidos por un
punto (.). El primer número es el ancho del campo, si el número que se visualiza
es menor que el ancho del campo, se añadirán ceros o espacios delante del
número en cuestión. El segundo número indica la precisión y especifica el
número de dígitos decimales.
Formato de conversión: es obligatorio, indica el tipo de número que la variable
va a mostrar.
e Notación exponencial en minúsculas (ej. 1.709098e+001),
E Notación exponencial en mayúsculas (ej. 1.709098E+001).
f Notación de punto fijo (ej. 17.090980).
g Representación en formato corto de las notaciones e o f.
G Representación en formato corto de las notaciones E o f,
i Entero.

Ejemplo: %-7.5f, - alineación a la izquierda, 7 número de espacios totales


incluido el punto decimal, 5 dígitos decimales después del punto y f notación de
punto fijo.
Puede también contener caracteres de escape que represente caracteres no
imprimibles tales como salto de línea (’\n’) o tabulación (’\t’).

4. Estructuras de control

 Condicional: La sintaxis general es


if condición
sentencia(s)
else
sentencia(s)
end

Si no hay sentencias para la opción falsa


if condición
sentencia(s)
end

John Ledgard Trujillo Trejo – Johnny Avendaño Quiroz Pag. No. 5


Departamento Académico de Ciencias de la Computación - UNMSM
Escuela Académica de Ingeniería de Sistemas - FISI
CURSO: MÉTODOS NUMERICOS

Programación con Octave

Si no hay sentencias para la opción verdadera


if condición
;
else
sentencia(s)
end

 La instrucción SWITCH

switch condición
case valor1,
instrucciones
case valor2,
instrucciones
...
otherwise,
instrucciones
end

 La instrucción FOR

for variable = x1:inc:x2


sentencia 1
sentencia 2
-----------
sentencia n
end

x1: Valor inicial del conteo


inc: Valor con el que se incrementa el conteo
x2: Valor final del conteo

 La instrucción WHILE

while expresión
sentencia 1
sentencia 2
-----------
sentencia n
end

John Ledgard Trujillo Trejo – Johnny Avendaño Quiroz Pag. No. 6


Departamento Académico de Ciencias de la Computación - UNMSM
Escuela Académica de Ingeniería de Sistemas - FISI
CURSO: MÉTODOS NUMERICOS

Programación con Octave

1.3. EJERCICIOS RESUELTOS

Problema 01. Para el problema de motivación de hallar la porción de una esfera de radio r
queda sumergida al meter la esfera en agua. Viendo el gráfico de la función
𝑦 = 2552 − 30𝑑2 + 𝑑3
>> x=-20:0.1:30;
>> y=x.^3-30*x.^2+2552;
>> plot(x,y)
>> hold on
>> fplot('0*x', [-20,30])

La solución se encuentra en el intervalo [11, 12]. Hacer un programa en Octave del método
de la bisección para encontrar las raíces de una ecuación no lineal.

John Ledgard Trujillo Trejo – Johnny Avendaño Quiroz Pag. No. 7


Departamento Académico de Ciencias de la Computación - UNMSM
Escuela Académica de Ingeniería de Sistemas - FISI
CURSO: MÉTODOS NUMERICOS

Programación con Octave

SOLUCION

John Ledgard Trujillo Trejo – Johnny Avendaño Quiroz Pag. No. 8


Departamento Académico de Ciencias de la Computación - UNMSM
Escuela Académica de Ingeniería de Sistemas - FISI
CURSO: MÉTODOS NUMERICOS

Programación con Octave

Al ejecutar el programa bisección.m obtenemos:

Calculo de la raíz de una ecuación por método de Bisección

Ingrese la funcion : x^3-30*x^2+2552


Ingrese el intervalo inferior : 11
Ingrese el intervalo superior : 12
Ingrese el porcentaje de error : 0.0005

a b Raiz Error
11.0000000000 12.0000000000 11.5000000000 100.0000000000
11.5000000000 12.0000000000 11.7500000000 2.1276595745
11.7500000000 12.0000000000 11.8750000000 1.0526315789
11.7500000000 11.8750000000 11.8125000000 0.5291005291
11.8125000000 11.8750000000 11.8437500000 0.2638522427
11.8437500000 11.8750000000 11.8593750000 0.1317523057
11.8593750000 11.8750000000 11.8671875000 0.0658327847
11.8593750000 11.8671875000 11.8632812500 0.0329272308
11.8593750000 11.8632812500 11.8613281250 0.0164663264
11.8613281250 11.8632812500 11.8623046875 0.0082324854
11.8613281250 11.8623046875 11.8618164062 0.0041164121
11.8613281250 11.8618164062 11.8615722656 0.0020582484
11.8613281250 11.8615722656 11.8614501953 0.0010291348
11.8614501953 11.8615722656 11.8615112305 0.0005145648
11.8614501953 11.8615112305 11.8614807129 0.0002572830

La raíz exacta es: 11.8615


Numero de iteraciones: 16
BREVE EXPLICACIÓN ACERCA DEL CÓDIGO USADO EN EL EJEMPLO
Para comprender mejor el lenguaje, iremos línea a línea analizando qué significa y cómo se
utilizó el OpenGL en el problema anterior.

2. clear;
3. clc;

Las líneas 2 y 3, clear borra todos los datos del espacio de trabajo (Workspace) del Octave,
clc borra todo lo escrito en la ventana de comandos.

5. fprintf('\nCálculo de la raíz de una ecuación por método de Bisección\n\n');


6. y=input('Ingrese la función : ','s');
7. a=input('Ingrese el intervalo inferior : ');

John Ledgard Trujillo Trejo – Johnny Avendaño Quiroz Pag. No. 9


Departamento Académico de Ciencias de la Computación - UNMSM
Escuela Académica de Ingeniería de Sistemas - FISI
CURSO: MÉTODOS NUMERICOS

Programación con Octave

8. b=input('Ingrese el intervalo superior : ');


9. tolerancia=input('Ingrese el porcentaje de error : ');
10. fprintf('\n\n a b Raiz Error\n')

Las líneas del 4 al 10 tienen las sentencias de entrada y salida de datos, fprintf visualiza los
datos de salida en la ventana de comandos, input recibe datos del teclado a través de la
ventana de comandos y lo asigna a una variable; en el caso de la línea 5 se ingresa la función
como cadena y lo asigna a la variable y.

12. xi=0;
13. error=100;
14. numter=1;

En las líneas del 12 al 14 se inicializan las variables, el error en 100 considerando que es el
máximo error y el número de términos numter en 1.

16. x=a;
17. fa=eval(y);
18. x=b;
19. fb=eval(y);

En las líneas del 16 al 19 con la sentencia eval se evalúa la variable y asignándola luego a
otra variable el valor obtenido, es calcular la función ingresada en la línea 5 con el valor de x.

21. if (fa*fb>0)
22. fprintf('\nLos intervalos que ha ingresado para hacer el calculo de la raiz\n');
23. fprintf('de la ecuacion no son los adecuados por no existir una raíz entre \n');
24. fprintf('estos, Ejecute de nuevo el programa, por favor.\n');
25. break
26. end

En las líneas del 21 al 26 se valida el ingreso del intervalo [a,b] donde a<b.

28. while error>tolerancia


29. raiz=(a+b)/2;
30. x=a;
31. fa=eval(y);
32. x=raiz;
33. fr=eval(y);
34. error=abs((raiz-xi)/raiz)*100;
35. fprintf('%15.10f %15.10f %15.10f %15.10f\n',a,b,raiz,error)

John Ledgard Trujillo Trejo – Johnny Avendaño Quiroz Pag. No. 10


Departamento Académico de Ciencias de la Computación - UNMSM
Escuela Académica de Ingeniería de Sistemas - FISI
CURSO: MÉTODOS NUMERICOS

Programación con Octave

37. if fa*fr<0
38. b=raiz;
39. else
40. a=raiz;
41. end

43. if fa*fr==0
44. fprintf('\n\n\n\nLa raíz exacta es: %d',raiz)
45. fprintf('\n\nNumero de iteraciones: %d',numter);
46. break
47. end

49. xi=raiz;
50. numter=numter+1;

51. end

53. if error<tolerancia
54. fprintf('\nLa raíz exacta es: %d',raiz)
55. fprintf('\nNumero de iteraciones: %d',numter);
56. end

En las líneas del 28 al 51 se entra en un loop while para ir obteniendo la raíz mientras el error
calculado sea mayor que el error porcentual ingresado (tolerancia). En la línea 29 se calcula
el punto medio del intervalo [a, b]. En el 34 se calcula el primer error obtenido por la primera
raíz. Todos los valores de salida son del formato “%15.10f”, el ancho del campo es de 15 y
con 10 dígitos decimales y son punto flotante. En las líneas del 37 al 41 se obtiene el nuevo
intervalo para obtener la nueva raíz.

Problema 03. Hacer un programa en Octave del método de la bisección para encontrar las
raíces de una ecuación no lineal. Aplicar dicho método a la ecuación x2 = cos(x) + 1 en el
intervalo [1,2].

SOLUCION
Reescribiendo la ecuación obtenemos: x2 - cos(x) – 1 = 0, entonces f(x) = x2 - cos(x) – 1.
Verificando la existencia de una raíz en [1, 2]:

f(1)*f(2) = -1.8458 < 0, entonces tiene una raíz en [1, 2].

>> (1^2-cos(1)-1)*(2^2-cos(2)-1)
ans = -1.8458

John Ledgard Trujillo Trejo – Johnny Avendaño Quiroz Pag. No. 11


Departamento Académico de Ciencias de la Computación - UNMSM
Escuela Académica de Ingeniería de Sistemas - FISI
CURSO: MÉTODOS NUMERICOS

Programación con Octave

Graficamos la ecuación usando el Octave:


>> x=-5:0.1:5
>> y=x.^2-cos(x)-1
>> plot(x,y)
>> hold on
>> fplot('0*x',[-5,5])
>> xlabel('X')
>> ylabel('Y')

Al ejecutar el programa bisección.m obtenemos:

Cálculo de la raíz de una ecuación por método de Bisección

Ingrese la función: x^2-cos(x)-1


Ingrese el intervalo inferior: 1
Ingrese el intervalo superior: 2
Ingrese el porcentaje de error: 0.0005

John Ledgard Trujillo Trejo – Johnny Avendaño Quiroz Pag. No. 12


Departamento Académico de Ciencias de la Computación - UNMSM
Escuela Académica de Ingeniería de Sistemas - FISI
CURSO: MÉTODOS NUMERICOS

Programación con Octave

a b Raiz Error
1.0000000000 2.0000000000 1.5000000000 100.0000000000
1.0000000000 1.5000000000 1.2500000000 20.0000000000
1.0000000000 1.2500000000 1.1250000000 11.1111111111
1.1250000000 1.2500000000 1.1875000000 5.2631578947
1.1250000000 1.1875000000 1.1562500000 2.7027027027
1.1562500000 1.1875000000 1.1718750000 1.3333333333
1.1718750000 1.1875000000 1.1796875000 0.6622516556
1.1718750000 1.1796875000 1.1757812500 0.3322259136
1.1757812500 1.1796875000 1.1777343750 0.1658374793
1.1757812500 1.1777343750 1.1767578125 0.0829875519
1.1757812500 1.1767578125 1.1762695312 0.0415110004
1.1762695312 1.1767578125 1.1765136719 0.0207511932
1.1762695312 1.1765136719 1.1763916016 0.0103766732
1.1763916016 1.1765136719 1.1764526367 0.0051880674
1.1764526367 1.1765136719 1.1764831543 0.0025939664
1.1764831543 1.1765136719 1.1764984131 0.0012969664
1.1764984131 1.1765136719 1.1765060425 0.0006484790
1.1764984131 1.1765060425 1.1765022278 0.0003242405

La raíz exacta es: 1.1765


Numero de iteraciones: 19

Problema 04. Hacer un programa en Octave del método de Newton-Raphson para encontrar
las raíces de una ecuación no lineal. Aplicar dicho método a la ecuación f(x) = e-x – x empleando
como valor inicial x0 = 0 .

SOLUCION:

Graficamos la función f(x) con Octave


>> x=-2:0.1:2
>> y=exp(-x)-x;
>> plot(x,y)
>> hold on
>> fplot('x*0',[-2,2])
>> xlabel('X')
>> ylabel('Y')

John Ledgard Trujillo Trejo – Johnny Avendaño Quiroz Pag. No. 13


Departamento Académico de Ciencias de la Computación - UNMSM
Escuela Académica de Ingeniería de Sistemas - FISI
CURSO: MÉTODOS NUMERICOS

Programación con Octave

El programa en Octave es la siguiente:

Al ejecutar el programa NewtonRaphson.m obtenemos:

Cálculo de la raíz de una ecuación por método de Newton-Raphson

Ingrese el valor inicial: 0


Ingrese el porcentaje de error: 0.0005
Ingrese la función: exp(-x)-x
Ingrese la derivada de la función: -exp(-x)-1

i raiz(i) Error aprox (i)


0 0.0000000 100.0000000
1 0.5000000 100.0000000
2 0.5663110 11.7092910

John Ledgard Trujillo Trejo – Johnny Avendaño Quiroz Pag. No. 14


Departamento Académico de Ciencias de la Computación - UNMSM
Escuela Académica de Ingeniería de Sistemas - FISI
CURSO: MÉTODOS NUMERICOS

Programación con Octave

3 0.5671432 0.1467287
4 0.5671433 0.0000221

La raíz exacta es: 0.567143


Numero de iteraciones: 4

EJERCICIOS PROPUESTOS

Problema 01. Hacer un programa en Octave del método de Regula falsi para encontrar las
raíces de una ecuación no lineal. Aplicar dicho método a la ecuación f(x) = e-x – ln(x) en el
intervalo [1,2].

Problema 02. Hacer un programa en Octave del método de la secante para encontrar las
raíces de una ecuación no lineal. Aplicar dicho método a la ecuación f(x) = e-x + x - 2 . Tome
como valores iniciales a x0 = 0 x1 = 1.

1.4. BIBLIOGRAFIA

1. Sandeep Nagar. Introduction to Octave: For Engineers and Scientists. Library of


Congress Control Number: 2017960430. New York, USA. 2018.
2. A. Quarteroni, F. Saleri. Cálculo Científico con MATLAB y Octave. Springer-Verlag
Italia, Milano 2006.
3. Moore, Holly. MATLAB para ingenieros. PEARSON EDUCACION DE MEXICO; 1st.
edition (2014).
4. Gilat Amos. Matlab. Una introducción con ejemplos prácticos. Editorial Reverte;
Edición: 1 (5 de agosto de 2006). España.
5. Perez Marques Maria. MATLAB para Ingenieros y Cientificos. Editorial:
CreateSpace Independent Publishing Platform, 2013. United States.

John Ledgard Trujillo Trejo – Johnny Avendaño Quiroz Pag. No. 15

También podría gustarte