Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


Ejercicios computación científica resueltos, Ejercicios de Física

Ejercicios resueltos bucles matlab

Tipo: Ejercicios

2019/2020

Subido el 02/11/2020

javilonxi
javilonxi 🇪🇸

1 documento

1 / 9

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
Laboratorio de Computación Cienfica
Seminario 1
Alicia R ey Alonso - alire y@ucm.es Octubre 2020
1. A partir de cierta matriz, selecciona las filas impares de la misma.
>> B=rand(5,5) %El comando rand(m,n) genera una matriz de valores
%aleatorios entre 0 y 1 de dimensión m x n
B =
0.4733 0.9172 0.5678 0.9340 0.3371
0.3517 0.2858 0.0759 0.1299 0.1622
0.8308 0.7572 0.0540 0.5688 0.7943
0.5853 0.7537 0.5308 0.4694 0.3112
0.5497 0.3804 0.7792 0.0119 0.5285
>> B(1:2:length(B),:)
ans =
0.4733 0.9172 0.5678 0.9340 0.3371
0.8308 0.7572 0.0540 0.5688 0.7943
0.5497 0.3804 0.7792 0.0119 0.5285
Para este caso en concreto, el comando da el resultado correcto, puesto que length(A) nos da la dimensión
más grande de A. Si A es cuadrada, esa dimensión es la misma. Sin embargo, en el caso de que la matriz NO
sea cuadrada, y la dimensión mayor no sea la de las filas, como nos pasó en el seminario, length no nos
devolverá la dimensión de las filas, sino de las columnas, por lo que fallará (probadlo en MATLAB para ver el
problema). La forma correcta de asegurarnos de que utilizamos las filas cuando queramos las filas, y las
columnas cuando queramos columnas, es usando size(A,dim), donde dim=1 proporcionará las filas y dim=2
las columnas:
>> A=rand(4,5) %matriz no cuadrada
A =
0.5472 0.8407 0.9293 0.6160 0.5853
0.1386 0.2543 0.3500 0.4733 0.5497
0.1493 0.8143 0.1966 0.3517 0.9172
0.2575 0.2435 0.2511 0.8308 0.2858
>> Impar=A(1:2:size(A,1),:) %size(A,1) nos da el número de filas totales
Impar =
0.5472 0.8407 0.9293 0.6160 0.5853
0.1493 0.8143 0.1966 0.3517 0.9172
pf3
pf4
pf5
pf8
pf9

Vista previa parcial del texto

¡Descarga Ejercicios computación científica resueltos y más Ejercicios en PDF de Física solo en Docsity!

Laboratorio de Computación Científica

Seminario 1

Alicia Rey Alonso- [email protected] Octubre 2020

1. A partir de cierta matriz, selecciona las filas impares de la misma.

B=rand(5,5) %El comando rand(m,n) genera una matriz de valores %aleatorios entre 0 y 1 de dimensión m x n B = 0.4733 0.9172 0.5678 0.9340 0. 0.3517 0.2858 0.0759 0.1299 0. 0.8308 0.7572 0.0540 0.5688 0. 0.5853 0.7537 0.5308 0.4694 0. 0.5497 0.3804 0.7792 0.0119 0. B(1:2:length(B),:) ans = 0.4733 0.9172 0.5678 0.9340 0. 0.8308 0.7572 0.0540 0.5688 0. 0.5497 0.3804 0.7792 0.0119 0. Para este caso en concreto, el comando da el resultado correcto, puesto que length(A) nos da la dimensión más grande de A. Si A es cuadrada, esa dimensión es la misma. Sin embargo, en el caso de que la matriz NO sea cuadrada, y la dimensión mayor no sea la de las filas, como nos pasó en el seminario, length no nos devolverá la dimensión de las filas, sino de las columnas, por lo que fallará (probadlo en MATLAB para ver el problema). La forma correcta de asegurarnos de que utilizamos las filas cuando queramos las filas, y las columnas cuando queramos columnas, es usando size(A,dim), donde dim=1 proporcionará las filas y dim= las columnas: A=rand(4,5) %matriz no cuadrada A = 0.5472 0.8407 0.9293 0.6160 0. 0.1386 0.2543 0.3500 0.4733 0. 0.1493 0.8143 0.1966 0.3517 0. 0.2575 0.2435 0.2511 0.8308 0. Impar=A(1:2:size(A,1),:) %size(A,1) nos da el número de filas totales Impar = 0.5472 0.8407 0.9293 0.6160 0. 0.1493 0.8143 0.1966 0.3517 0.

2. Construye por concatenación y haciendo uso de funciones como zeros, ones y diag, la

matriz:

[

]

x=ones(4,1) x = 1 1 1 1 y=zeros(1,3) y = 0 0 0 z=diag([3,-2,7],0) %Usamos diag(v,0) para colocar el vector v %en la diagonal principal de una matriz de %tamaño length(v) x length(v) z = 3 0 0 0 - 2 0 0 0 7 yz=[y;z] %Concatenamos la fila y con la matriz z , usando ; yz = 0 0 0 3 0 0 0 - 2 0 0 0 7 xyz=[x,yz] %Concatenamos la columna x con la matriz y z , usando , xyz = 1 0 0 0 1 3 0 0 1 0 - 2 0 1 0 0 7

4. (Test 1 2018-19) Dado el sistema, El movimiento de un cuerpo sobre una esfera de radio

unitario, viene descrito, en función del tiempo, por las siguientes ecuaciones:

𝑥 = 𝑐𝑜𝑠(𝛼 1 𝑡^2 + 𝜔 1 𝑡 + 𝜑 0 ) · 𝑐𝑜𝑠(𝛼 2 𝑡^2 + 𝜔 2 + 𝜃 0 )

𝑦 = 𝑐𝑜𝑠(𝛼 1 𝑡^2 + 𝜔 1 𝑡 + 𝜑 0 ) · 𝑠𝑖𝑛(𝛼 2 𝑡^2 + 𝜔 2 + 𝜃 0 )

𝑧 = 𝑠𝑖𝑛(𝛼 1 𝑡^2 + 𝜔 1 𝑡 + 𝜑 0 )

a) Escribe un programa que tome como variables de entrada: α 1 , α 2 , ω 1 , ω 2 , φ 0 , ϴ 0 y un

valor para el tiempo final, tf, devuelva tres vectores x, y, z con los valores sucesivos de la

posición del cuerpo, calculados a intervalos regulares de 0,01 segundos.

function [x,y,z]=sem1esfera(a1,a2,w1,w2,phi,theta,tf) t=[0:0.01:tf]; x=cos(a1t.^2+w1t+phi).cos(a2t.^2+w2+theta); %componente a y=cos(a1t.^2+w1t+phi).sin(a2t.^2+w2+theta); %componente,. z=sin(a1t.^2+w1t+phi);

b) Añade al programa las líneas de código necesarias para que dibuje en una misma figura,

los valores de x, y, z frente al tiempo. Añade etiquetas a los ejes indicando las variables

representadas.

function [x,y,z]=sem1esfera(a1,a2,w1,w2,phi,theta,tf) t=[0:0.01:tf]; x=cos(a1t.^2+w1t+phi).cos(a2t.^2+w2+theta); %componente a y=cos(a1t.^2+w1t+phi).sin(a2t.^2+w2+theta); %componente,. z=sin(a1t.^2+w1t+phi); plot(t,x,t,y,t,z) %dibujamos las 3 variables respecto ylabel('Distancia') %a t, plot(x1,y1,x2,y2,x3,y3,…) xlabel('Tiempo') legend('x','y','z')

c) Añade el código necesario para que dibuje, en un segundo gráfico, la trayectoria (x,y,z)

en tres dimensiones, en color negro. Dibuja además el punto inicial, y el final,

representándolos mediante el símbolo o. Emplea el color azul para el punto inicial y el

rojo para el punto final

function [x,y,z]=sem1esfera(a1,a2,w1,w2,phi,theta,tf) t=[0:0.01:tf]; x=cos(a1t.^2+w1t+phi).cos(a2t.^2+w2+theta); %componente a y=cos(a1t.^2+w1t+phi).sin(a2t.^2+w2+theta); %componente,. z=sin(a1t.^2+w1t+phi); subplot(2,1,1) %añadimos esta instrucción de cara a %generar el segundo gráfico plot(t,x,t,y,t,z) %dibujamos las 3 variables respecto ylabel('Distancia') %a t, plot(x1,y1,x2,y2,x3,y3,…) xlabel('Tiempo') legend('x','y','z') subplot(2,1,2) %cambiamos de subplot en uso plot3(x(1),y(1),z(1),'bo') %pintamos el primer punto de la hold on %trayectoria, y le pedimos que no se

%borre cuando comience el bucle for i=1:length(t) %generamos un bucle con el vector tiempos x2(i)=cos(a1t(i)^2+w1t(i)+phi)cos(a2t(i)^2+w2+theta); y2(i)=cos(a1t(i)^2+w1t(i)+phi)sin(a2t(i)^2+w2+theta); z2(i)=sin(a1t(i)^2+w1t(i)+phi); %calculamos cada elemento de los vectores x,y,z uno a uno, no %hace falta. plot3(x2,y2,z2,'k-') pause(0.001) %pause para que no dibuje todo de golpe xlim([min(x)-0.25,max(x)+0.25]) %establecemos límites ylim([min(y)-0.25,max(y)+0.25]) %para que los ejes no zlim([min(z)-0.25,max(z)+0.25]) %se muevan end plot3(x2(length(x2)),y2(length(y2)),z2(length(z2)),'ro') %trazamos el último punto de la trayectoria

Utilizamos un bucle junto con el comando pause para que veamos cómo se dibuja la

trayectoria en el gráfico. Dado que vamos componente a componente gracias al contador i , no

estamos operando vectores dentro del bucle, por lo que no necesitamos hacer uso del

operador. que nos indica operaciones componente a componente.

d) Aplica el programa realizado para las siguientes entradas:

π 2 , φ 0 = π 2 , α 2 = π, ω 2 = 0, θ 0 = π 4 En la ventana de comandos, introducimos:

a1=0; w1=pi/2; phi=pi/2; a2=pi; w2=0; theta=pi/4; [x,y,z]=sem1esfera(a1,a2,w1,w2,phi,theta,10); Este comando nos genera los vectores solución x,y,z, que para nuestra elección arbitraria de tf=10 tienen dimensión 1x1001, y dos gráficos:

hold on plot3(x(1),y(1),z(1),'bo') hold on for i=1:length(t) x2(i)=cos(a1t(i)^2+w1t(i)+phi).cos(a2t(i).^2+w2+theta); y2(i)=cos(a1t(i).^2+w1t(i)+phi).sin(a2t(i).^2+w2+theta); z2(i)=sin(a1t(i).^2+w1t(i)+phi); plot3(x2,y2,z2,'k-') pause(0.001) xlim([min(x)-0.25,max(x)+0.25]) ylim([min(y)-0.25,max(y)+0.25]) zlim([min(z)-0.25,max(z)+0.25]) if z2(i)<0 %establecemos la condición que finaliza el bucle break end end plot3(x2(length(x2)),y2(length(y2)),z2(length(z2)),'ro') Observamos que ha aparecido nuestra esfera, y que el gráfico se ha detenido una vez ha atravesado el ecuador. El punto de finalizado no se ve, pues la esfera es opaca. Si giramos el gráfico, nuestro código habrá marcado en rojo el punto final sobre el ecuador.

5. Crea un script que, al ejecutarlo, nos pida un número. A continuación, el script calculará los términos de Fibonacci hasta encontrarse con los dos más próximos a dicho número (el que está por encima, y el que está por debajo del valor dado). Seguidamente, el script debe preguntar si queremos que nos indique el término menor más próximo, o el mayor más próximo. Si como parámetro inicial recibe un número negativo, el programa debe dar un mensaje de error, indicando que la serie de Fibonacci no contiene números negativos. Si el número dado pertenece a la serie de Fibonacci, el programa debe indicárnoslo con un mensaje por pantalla. n=input('Dame un número\n'); if n<0 %Antes de operar, establecemos el error de números< error('La serie de Fibonacci no tiene números negativos') elseif n== fprintf('El 0 es e primer término de la serie de Fibonacci\n') return %Dado que el 0 es el 1er término, no necesitamos el bucle end F(1)=0; %primeros términos de la serie F(2)=1; i=2; while F(i)<n %Cálculo de Fib hasta que el término sea mayor o igual que n i=i+1; F(i)=F(i-1)+F(i-2); end Fmayor=F(i); %Definimos el superior y el inferior a n Fmenor=F(i-1); if F(i)==n %Si n pertenece a la serie fprintf('%d Es un número de la serie de Fibonacci\n',n) else %Si n no pertenece a la serie, debemos distinguir entre menor y %mayor b=input('Si quieres el menor más próximo, pulsa 1, si quieres el mayor más próximo, pulsa 2 \n'); if b==1; fprintf('El número de la serie de Fibonacci menor que %d más proximo es %d\n',n,Fmenor) elseif b==2; fprintf('El número de la serie de Fibonacci mayor que %d más proximo es %d\n',n,Fmayor) else %En caso de que no seleccionen ninguna de las opciones correctas fprintf('Ese no es un número válido') end end