Documentos de Académico
Documentos de Profesional
Documentos de Cultura
• En algunas cuestiones planteadas se da la respuesta (en color azul). El texto en azul son sentencias de MATLAB.
Podéis ejecutarlas en la ventana de comandos con un cortar y pegar.
• Las respuestas a las preguntas en color rojo se deberán incluir en la Hoja de Entrega.
• La entrega será individual en el plazo de una semana.
_________________________________________________________________________________________________
1. Dar el comando >> edit fun1 para crear la siguiente función fun1.
La función recibe como argumentos de entrada un número x y un entero k y devuelve el valor de cos(k*x).
Para x=2, n=3 se ejecuta con el comando >> p = fun1(2,3). Comprobar que el resultado es el correcto.
function p = fun1(x,k)
p= cos(k*x);
return
2. Escribir una función que reciba como argumentos de entrada un número x y un entero n y devuelva el valor
de la n-ésima potencia de x (x^n). El segundo argumento puede ser opcional. Si se omite debe tomarse
como n=2 (valor por defecto), devolviendo el cuadrado de x.
clear;
x=0.5,n=5,y=potencia(x,n),n=1/5,y=potencia(x,n)
3. Modificar la función del apartado anterior, y=potencia(x,n), para que la variable de entrada x pueda ser un
vector.
Modificar el script ejer2 anterior para ejecutar 4 veces la función potencia con x=[-1:0.01:1], para n=1,2,3,4,
haciendo un plot de las 4 salidas en una sola Figura (superponiendo las funciones en el mismo gráfico con
el comando hold on). Obtener una gráfica similar a la siguiente:
1
ALGORÍTMICA NUMÉRICA Ejercicios computacionales 0.2
Potencias x 1, x 2, x 3 y x 4
1
0.8
0.6
0.4
0.2
-0.2
-0.4
-0.6
-0.8
-1
-1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1
4. Escribir una función llamada y =cosn(x,n) que reciba dos argumentos x (vector) y n (número) y devuelva el
vector y = cos n ( x) . Crear el script para ejecutar 3 veces la función cosn con x=-pi:0.1:pi; para n=5, 7, 9, y
almacenar el resultado en una tabla. Hacer un plot de las 3 salidas en una sola Figura.
a) Usar bucles anidados asignando a cada elemento de A el valor 0.2 si el valor original era menor o
igual a 0.4 y 0.7 si era mayor que 0.4:
x=zeros(51,1);
for k=1:50,
x(k+1)=cos(x(k));
end
plot(x,'.')
x(end)
b) Utilizando un número x.
2
ALGORÍTMICA NUMÉRICA Ejercicios computacionales 0.2
Repetir el apartado anterior, donde x en lugar de una tabla sea un escalar. En cada iteración hacer un
plot con hold on.
2. Con el comando subplot(132) mostrar el valor del error relativo, respecto de las iteraciones,
Erel s xn s
3. Con el comando subplot(133) mostrar el número de cifras de precisión, respecto de las iteraciones,
En los tres casos utilizar los ejes adecuados. La figura resultante debe ser similar a esta:
0.5 10 0 15
0.45
-2
10
0.4
-4
10
0.35
10
-6
10
0.3
0.25 -8
10
0.2
10 -10
5
0.15
10 -12
0.1
10 -14
0.05
0 10 -16 0
0 20 40 60 0 20 40 0 20 40
8. Utilizar la relación
1 1 1
e = 1+ + + + ...
1! 2! 3!
3
ALGORÍTMICA NUMÉRICA Ejercicios computacionales 0.2
para estimar el valor del número e (en Matlab exp(1)), sumando los primeros 30 términos de la serie.
Calculamos la estimación de 5 formas distintas, unas más eficientes que otras, respecto del coste
computacional (la más eficiente es la que menos operaciones utiliza).
a) Utilizando los comandos .*, ./, .^ (poco eficiente, recalcula el factorial para cada valor de n).
n=[0:29]; fact=factorial(n); s=sum(1./fact)
Sabiendo que e=exp(1) ¿Cuál es el error cometido con la estimación?.
c) Modificando el bucle anterior para sea más eficiente (calcula el factorial iterativamente).
s=1; temp=1; for k=1:29, temp=temp/k; s=s+temp; end
¿Hay alguna diferencia con la solución anterior?.
d) Repetir el bucle anterior pero de forma que el bucle termine (break) si el término a sumar es menor que
10^(-18). ¿Cuántas iteraciones del bucle se hacen? ¿Hay diferencias entre ambas soluciones?
s=1; temp=1; for k=1:29, temp=temp/k; s=s+temp; if temp<1e-18; break; end; end
¿Cuántas iteraciones del bucle se hacen? ¿Por qué motivo se impone que el bucle termine si el término
a sumar es menor que 10^(-18)?
e) Implementar de forma más elegante el problema anterior usando un bucle while, con la condición de
que el término a sumar sea mayor que 10^(-18). Calcular el número de iteraciones.
s=0; temp=1; k=1; while(temp>1e-18), s=s+temp; temp=temp/k; k=k+1; end
f) Modificar el comando for del apartado c) anterior para añadir en cada iteración el cálculo del
Error= e − s y volcar por pantalla con un fprintf la siguiente información:
g) Modificar el comando while del apartado e) anterior para dibujar en una gráfica el error. En cada
iteración utilizar el comando semilogy para mostrar el error, respecto del número de iteración (con hold
on). ¿Cuántas iteraciones son necesarias para alcanzar 10 cifras de precisión? ¿y 15?
x0 = 1
2 + xn
x + =
1 + xn
n 1
¿Cuánto difiere la última iteración de s?. A partir de los resultados numéricos obtenidos ¿converge la sucesión
a s?.
4
ALGORÍTMICA NUMÉRICA Ejercicios computacionales 0.2
b) Modificar el script anterior. En cada iteración del bucle usar el comando fprintf() para volcar por pantalla los
siguientes datos: Número de iteración (%2d), Estimación de sqrt(2) (%.15f) y El Error relativo (%.2e).
Erel s xn s
¿Cuál es la precisión de la máquina? ¿Cuántas iteraciones son necesarias para alcanzar dicha precisión?
c) Modificar el script anterior. Definir la tabla x=zeros(31,1). Repetir el bucle for anterior, almacenando el
resultado en la tabla x.
A partir de la tabla x, con operaciones punto a punto, calcular las tablas Erel y Ncifras.
Dibujar una figura con 2 gráficas: la estimación y el número de cifras de precisión, respecto de las
iteraciones. Utilizar el comando subplot y los ejes adecuados.
¿Cuál es la pendiente (aproximada) de las cifras de precisión, respecto de las iteraciones? ¿Están
dibujados en la gráfica todos los valores de Ncifras? ¿Porqué?.