Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Laboratorio 02
Programación en Octave
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.
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.
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 .
.
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.
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
El comando fprintf se utiliza para visualizar salidas del programa (texto y datos)
con ciertos formatos en la ventana de comandos.
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.
4. Estructuras de control
La instrucción SWITCH
switch condición
case valor1,
instrucciones
case valor2,
instrucciones
...
otherwise,
instrucciones
end
La instrucción FOR
La instrucción WHILE
while expresión
sentencia 1
sentencia 2
-----------
sentencia n
end
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.
SOLUCION
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
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.
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.
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]:
>> (1^2-cos(1)-1)*(2^2-cos(2)-1)
ans = -1.8458
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
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:
3 0.5671432 0.1467287
4 0.5671433 0.0000221
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