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 función: 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');
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
7. a=input('Ingrese el intervalo inferior : ');
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.
En la solución de este problema con el método de la bisección se utilizó el error aproximado:
En el método de la bisección el error en cada iteración se calcula de la siguiente manera:
𝑏−𝑎
𝑒𝑟𝑟𝑜𝑟 =
2
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
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
Al ejecutar el programa bisección2.m obtenemos:
Cálculo de la raíz de una ecuación por método de Bisección
Ingrese la función: 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
1 11.0000000000 12.0000000000 11.5000000000 0.5000000000
2 11.5000000000 12.0000000000 11.7500000000 0.2500000000
3 11.7500000000 12.0000000000 11.8750000000 0.1250000000
4 11.7500000000 11.8750000000 11.8125000000 0.0625000000
5 11.8125000000 11.8750000000 11.8437500000 0.0312500000
6 11.8437500000 11.8750000000 11.8593750000 0.0156250000
7 11.8593750000 11.8750000000 11.8671875000 0.0078125000
8 11.8593750000 11.8671875000 11.8632812500 0.0039062500
9 11.8593750000 11.8632812500 11.8613281250 0.0019531250
10 11.8613281250 11.8632812500 11.8623046875 0.0009765625
11 11.8613281250 11.8623046875 11.8618164062 0.0004882812
La raíz exacta es: 11.8618
Numero de iteraciones: 11
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
Graficamos la ecuación usando el Octave:
>> x=-5:0.1:5
>> y=x.^2-cos(x)-1
>> plot(x,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
>> 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
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
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
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. 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
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
3 0.5671432 0.1467287
4 0.5671433 0.0000221
John Ledgard Trujillo Trejo – Johnny Avendaño Quiroz Pag. No. 16
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
La raíz exacta es: 0.567143
Numero de iteraciones: 4
Problema 05. Resolver el problema 01 con el método de Newton-Raphson empleando como
valor inicial xo = 11
𝑦 = 2552 − 30𝑑2 + 𝑑3
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: 11
Ingrese el porcentaje de error: 0.0005
Ingrese la función: x^3-30*x^2+2552
Ingrese la derivada de la función: 3*x^2-60*x
i raiz(i) Error aprox (i)
0 11.0000000 100.0000000
1 11.8518519 7.1875000
2 11.8614997 0.0813377
3 11.8615015 0.0000151
La raíz exacta es: 11.8615
Numero de iteraciones: 3
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. 17