• No se han encontrado resultados

Programación y Métodos Numéricos Solución a los ejercicios Enero Junio 2018

N/A
N/A
Protected

Academic year: 2021

Share "Programación y Métodos Numéricos Solución a los ejercicios Enero Junio 2018"

Copied!
13
0
0

Texto completo

(1)

Programación y Métodos Numéricos

Solución a los ejercicios Enero – Junio 2018

EJERCICIO 1

En cada caso, evaluar la expresión dada, realizando las operaciones paso a paso de acuerdo al orden de precedencia de los operadores aritméticos.

1 - 2 * 3 / 4 + 5

1 - 6 / 4 + 5

1 - 1.5 + 5

= 4.5

1 / 3 * 3 ^ 3 + 1

1 / 3 * 27 + 1

0.33333 * 27 + 1

9 + 1 = 10

6 * 3 / 2 * 5

18 / 2 * 5

9 * 5

45

(6 * 3) / (2 * 5)

18 / 10

1.8

(2 + 1) * 3 + 4 * (2 ^ 2 - 1)

3 * 3 + 4 * (4 - 1)

3 * 3 + 4 * 3

9 + 12

21

EJERCICIO 2

Determinar si cada una de las expresiones booleanas siguientes da un resultado verdadero (V) o falso (F), considerando que los valores de las variables son w = 3, x = 1, y = 4, z = -2.

x > 1

1 > 1

F

1 >= 1

x >= 1

V

z < x

-2 < 1

V

4 == 3 + 1

y == w + x

V

~(x <> (y - w))

~(1 <> (4 - 3))

~(1 <> 1)

~(F)

V

(2 * x - z) == y

(2 * 1 –(-2)) == 4

(2 + 2) == 4

4 == 4

V

(w > 0) | (z > 0)

(3 > 0) | (-2 > 0)

(V) | (F)

V

(w > 0) & (z > 0)

(3 > 0) & (-2 > 0)

(V) & (F)

F

((x + y) == (w - z)) & (4 * x <= y)

((1 + 4) == (3 – (-2))) & (4 * 1 <= 4)

(5 == 5) & (4 <= 4)

(V) & (V)

V

(2)

EJERCICIO 3

Escribir un programa en Scilab que calcule el área lateral y el área total de un cilindro. El programa debe pedir al usuario los datos de radio y longitud del cilindro. Como valores para la corrida de prueba, tomar 2.7 cm de radio y 12.4 cm de longitud.

CÓDIGO DEL PROGRAMA

// Programación y Métodos Numéricos // Ejercicio 3

// 15-FEB-2018

disp("Cálculo de área lateral y total de un cilindro.") r=input("Radio del cilindro (cm)? ");

l=input("Longitud del cilindro (cm)? "); area_lateral=2*%pi*r*l;

area_base=%pi*r^2;

area_total=area_lateral+2*area_base;

disp("El área lateral es " + string(area_lateral) + " cm^2") disp("El área total es "+ string(area_total)+ " cm^2")

CORRIDA DE PRUEBA

--> exec("Ejercicio3.sce");

Cálculo de área lateral y total de un cilindro. Radio del cilindro (cm)? 2.7

Longitud del cilindro (cm)? 12.4 El área lateral es 210.36104 cm^2 El área total es 256.16546 cm^2 EJERCICIO 4

Escribir un programa en Scilab que calcule el radio de una esfera a partir de su volumen (proporcionado por el usuario). Como valor para la corrida de prueba, emplear 435 cm³.

CÓDIGO DEL PROGRAMA

// Programación y Métodos Numéricos // Ejercicio 4

// 1°-MAR-2018

disp("Cálculo del radio de una esfera a partir de su volumen") V=input("Volumen de la esfera (cm³)? ");

r=((3*V)/(4*%pi))^(1/3);

disp("El radio de la esfera es " + string(r) + " cm") CORRIDA DE PRUEBA

--> exec("Ejercicio4.sce");

Cálculo del radio de una esfera a partir de su volumen Volumen de la esfera (cm³)? 435

(3)

EJERCICIO 5 - OPCIONAL

En Termodinámica, se estudia la ecuación de estado de Van der Waals:

(

)

2 a P v b RT v+ =    

en donde P es la presión (atm), v es el volumen específico (L/mol), T es la temperatura absoluta (K), R es la constante universal de los gases (0.082057 atm·L/mol·K), y los parámetros a y b se pueden estimar a partir de los datos del punto crítico empleando las fórmulas:

2 2 27 64 c c R T a P = 8 cc RT b P =

donde Tc es la temperatura crítica (K) y Pc es la presión crítica (atm).

Escribir un programa en Scilab que calcule la presión empleando la ecuación de estado de Van der Waals. El programa debe solicitar al usuario como datos la temperatura, el volumen específico, la temperatura crítica y la presión crítica (en las unidades indicadas anteriormente). El programa no debe pedir el valor de la constante de los gases, éste debe ser incorporado directamente en el programa.

Emplear los siguientes valores para la corrida de prueba: T = 298 K, v = 0.6 L/mol, Tc = 304.12 K, Pc = 72.78 atm.

CÓDIGO DEL PROGRAMA

// Programación y Métodos Numéricos // Ejercicio 5

// 2-MAR-2017

disp("Cálculo de la presión con la ecuación de Van der Waals") // Valor de la constante de los gases (atm·L/mol·K)

R=0.082057; // Datos

T=input("Temperatura (K)? ");

v=input("Volumen específico (L/mol)? "); Tc=input("Temperatura crítica (K)? "); Pc=input("Presión crítica (atm)? ");

// Cálculo de los parámetros de Van der Waals a=(27*R^2*Tc^2)/(64*Pc);

b=(R*Tc)/(8*Pc);

// Cálculo de la presión P=(R*T)/(v-b)-a/v^2;

disp("La presión es " + string(P) + " atm") CORRIDA DE PRUEBA

--> exec("Ejercicio5.sce");

Cálculo de la presión con la ecuación de Van der Waals Temperatura (K)? 298

Volumen específico (L/mol)? 0.6 Temperatura crítica (K)? 304.12

(4)

Presión crítica (atm)? 72.78 La presión es 33.862801 atm EJERCICIO 6

Cada uno de los siguientes fragmentos de código Scilab tiene al menos un error. Señalar los errores y explicar la razón por la cual es un error.

CÓDIGO EXPLICACIÓN DE LOS ERRORES

1 exec"(MiPrograma.sce)"; Las comillas deben encerrar el nombre del archivo (porque es un texto) y eso debe ir dentro del paréntesis.

2 lado=5;

volumen=Lad0^3; Los nombres de variables distinguen entre mayúsculas y minúsculas, por lo que lado y Lado

son dos variables diferentes. Además, en la segunda instrucción, se usó cero en vez de la “o” minúscula.

3 disp(Este programa calcula la velocidad) El texto en la instrucción disp debe estar encerrado

entre comillas.

4 // El lado de un cubo se calcula como // la raíz cúbica de su volumen

lado=volumen^1/3

De acuerdo al orden de ejecución de los operadores, la exponenciación se realiza antes que la división, por lo que el volumen se está elevando a la potencia uno, y luego se está dividiendo entre tres. Lo correcto es encerrar el exponente entre paréntesis:

volumen^(1/3)

5 input("Distancia en metros "}; No se está asignando el resultado de la instrucción input en ninguna variable, debería ser algo como:

d = input(… Además, el paréntesis para cerrar )

está cambiado por una llave }. 6 // Cálculo de la presión empleando

// la ecuación de gas ideal P=nRT/V

La multiplicación siempre se debe indicar con el operador * por lo que debería ser P=n*R*T/V

7 m=imput("Valor de la masa (kg) "); Está mal escrita la instrucción, debe ser input.

8 energia potencial=masa*gravedad*altura; Un nombre de variable no puede contener espacios en blanco.

9 perimetro=%PI*diametro No puede ser con mayúsculas porque la constante predefinida π es %pi.

(5)

CÓDIGO EXPLICACIÓN DE LOS ERRORES

10 Juan Pérez

Programación y Métodos Numéricos Cálculo del tiempo de caída libre h=input(“Altura de caída en metros?”); g=9.81;

t=(2h/g)^0.5;

disp("El tiempo es "+string(t)+" s")

Las tres primeras líneas deben comenzar con //

porque aparentemente son comentarios.

En el texto de la instrucción input, se usaron comillas tipográficas (“”) en vez de comillas rectas ("").

En la fórmula para calcular el tiempo, la multiplicación debe indicarse con * por lo que debe

ser 2*h/g.

EJERCICIO 7

Desarrollar un programa en Scilab para uno de los casos de resolución de triángulos: cuando se conoce la longitud de dos lados a y b, así como el ángulo γ entre ellos. El tercer lado se puede encontrar entonces aplicando la ley del coseno:

c = a2 +b2 2 cosab γ

Luego, uno de los ángulos se obtiene también de la ley del coseno:

α 2 2 2

2

arccosb +cbca

=

 

Finalmente, el tercer ángulo se obtiene por diferencia, dado que α β γ 180+ + = °. Para la corrida de prueba, emplear los valores a = 3.20, b = 9.55 y γ = 85°.

CÓDIGO DEL PROGRAMA

// Programación y Métodos Numéricos // Ejercicio 7

// 6-MAR-2018

disp("Resolución de triángulo") // Datos

a=input("Longitud del lado a? "); b=input("Longitud del lado b? ");

ang_gamma=input("Ángulo gamma (en grados)? "); // Cálculos

c=sqrt(a^2+b^2-2*a*b*cosd(ang_gamma)); ang_alfa=acosd((b^2+c^2-a^2)/(2*b*c)); ang_beta = 180-ang_alfa-ang_gamma;

disp("Longitud del lado c = " + string(c))

disp("Ángulo alfa = " + string(ang_alfa) + " grados") disp("Ángulo beta = " + string(ang_beta) + " grados")

a

b

c

γ

(6)

CORRIDA DE PRUEBA

--> exec("Ejercicio7.sce"); Resolución de triángulo Longitud del lado a? 3.20 Longitud del lado b? 9.55 Ángulo gamma (en grados)? 85 Longitud del lado c = 9.8038534 Ángulo alfa = 18.975282 grados Ángulo beta = 76.024718 grados EJERCICIO 8

Escribir un programa en Scilab que genere un número entero aleatorio entre 1 y 5. El programa debe luego pedir al usuario que adivine el número, y mostrar una respuesta apropiada dependiendo de si el usuario adivinó o no. Como corridas de prueba, incluir al menos una en la que sí se haya adivinado y una en la que no.

CÓDIGO DEL PROGRAMA

// Programación y Métodos Numéricos // Ejercicio 8

// 20-MAR-2018 x=int(5*rand())+1;

disp("Estoy pensando un número del 1 al 5") y=input("Cuál crees que es? ");

if x==y then

disp("Adivinaste! Es el "+string(x)) else

disp("No! Era el "+string(x)) end

CORRIDA DE PRUEBA

--> exec("Ejercicio8.sce");

Estoy pensando un número del 1 al 5 Cuál crees que es? 5

No! Era el 1

--> exec("Ejercicio8.sce");

Estoy pensando un número del 1 al 5 Cuál crees que es? 2

(7)

EJERCICIO 9

Adaptado de Gilat (2006), “Matlab: una introducción con ejemplos prácticos”, Editorial Reverté.

La serie de Leibniz es la sumatoria:

( )

0 1 2 1 n m n= n − +

que converge al valor de π /4 cuando m es un número muy grande. Escribir un programa en Scilab que emplee un ciclo for para calcular el valor de la sumatoria de acuerdo al valor de m dado por el usuario. Correr el programa para

m = 10 y para m = 500. Comparar estos resultados con el valor verdadero de π /4 (0.78539816…)

CÓDIGO DEL PROGRAMA

// Programación y Métodos Numéricos // Ejercicio 9 // 23-MAR-2018 disp("Serie de Leibniz") m=input("m? "); suma=0; for n=0:m suma=suma+(-1)^n/(2*n+1); end disp("Sumatoria = " + string(suma)) CORRIDA DE PRUEBA --> exec("Ejercicio9.sce"); Serie de Leibniz m? 10 Sumatoria = 0.8080790 --> exec("Ejercicio9.sce"); Serie de Leibniz m? 500 Sumatoria = 0.7858972 EJERCICIO 10

Emplear un ciclo for para obtener la suma de los cubos de los primeros n números naturales (enteros positivos). Como corrida de prueba, tomar n =21.

CÓDIGO DEL PROGRAMA

// Programación y Métodos Numéricos // Ejercicio 10

// 10-ABR-2018

disp("Suma de los primeros n números naturales al cubo") n=input("Cuál es el valor final? ");

suma=0; for x=0:n

(8)

end

disp("La suma es " + string(suma)) CORRIDA DE PRUEBA

--> exec("Ejercicio10.sce");

Suma de los primeros n números naturales al cubo Cuál es el valor final? 21

La suma es 53361 EJERCICIO 11

El factorial de un número entero es el producto de todos los enteros positivos desde 1 hasta ese número. Escribir un programa en Scilab que calcule !n empleando un ciclo for, de acuerdo al valor de n indicado por el usuario. Probar el programa con n =3, n =9 y n =13.

CÓDIGO DEL PROGRAMA

// Programación y Métodos Numéricos // Ejercicio 11

// 10-ABR-2018

disp("Cálculo del factorial empleando ciclo for") n=input("Cuál es el valor de n? "); producto=1; for x=1:n producto=producto*x; end disp("n! = " + string(producto)) CORRIDA DE PRUEBA --> exec("Ejercicio11.sce");

Cálculo del factorial empleando ciclo for Cuál es el valor de n? 3

n! = 6

--> exec("Ejercicio11.sce");

Cálculo del factorial empleando ciclo for Cuál es el valor de n? 9

n! = 362880

--> exec("Ejercicio11.sce");

Cálculo del factorial empleando ciclo for Cuál es el valor de n? 13

(9)

EJERCICIO 12 – OPCIONAL

La matriz de Hilbert H es una matriz cuadrada cuyos elementos están dados por: 1 1 ij H i j = + − donde i es el número de renglón y j es el número de columna.

Emplear un ciclo for anidado (es decir, un ciclo dentro de otro ciclo) para generar la matriz de Hilbert de acuerdo al

valor de n proporcionado por el usuario. Como corrida de prueba, generar la matriz de Hilbert para n = . 4 RESULTADO: 1 1 1 2 3 4 1 1 1 1 2 3 4 5 1 1 1 1 3 4 5 6 1 1 1 1 4 5 6 7 1 H       =        

CÓDIGO DEL PROGRAMA

// Programación y Métodos Numéricos // Ejercicio 12

// 10-ABR-2018

disp("Matriz de Hilbert")

n=input("Tamaño de la matriz? ");

// Primero crear una matriz de ceros del tamaño necesario H=zeros(n,n);

// El ciclo externo da valores a i, para indicar el renglón // El ciclo interno da valores a j, para indicar la columna for i=1:n

for j=1:n

H(i,j)=1/(i+j-1); end

end

// "disp" no funciona con matrices, usar sólo H // sin punto y coma para mostrar el resultado disp("La matriz de Hilbert es")

H CORRIDA DE PRUEBA --> exec("Ejercicio12.sce"); Matriz de Hilbert Tamaño de la matriz? 4 La matriz de Hilbert es H = 1. 0.5 0.3333333 0.25 0.5 0.3333333 0.25 0.2 0.3333333 0.25 0.2 0.1666667 0.25 0.2 0.1666667 0.1428571

(10)

EJERCICIO 13

(A) En tres dimensiones, la distancia entre un punto P de coordenadas

(

P P Px, ,y z

)

y un punto Q de coordenadas

(

Q Q Qx, ,y z

)

está dada por:

(

)

2

(

)

2

(

)

2

x x y y z z

d = PQ + PQ + PQ

Escribir una función en Scilab que calcule la distancia entre dos puntos, dadas sus coordenadas como parámetros de entrada.

(B) El área de un triángulo se puede calcular a partir de las longitudes de los lados a, b y c mediante la fórmula:

(

)(

)(

)

A= s s a s b s c− − − donde

2

a b c

s= + + es el semiperímetro

A su vez, la longitud de cada lado del triángulo es la distancia que hay entre los vértices del triángulo,

(

x y z , 1, ,1 1

)

(

x y z y 2, ,2 2

)

(

x y z . 3, ,3 3

)

Escribir un programa en Scilab que calcule el área de un triángulo, dadas las coordenadas tridimensionales de sus vértices. La distancia entre los vértices debe calcularse usando la función definida en el inciso (A). Para la corrida de prueba, usar los puntos

(

1 5 4 3 5. , , . ,

)

(

6 5 9 5 5. , . , y

)

(

8 1 5 0 5, . , . .

)

RESULTADO: 27.853.

CÓDIGO DEL PROGRAMA

// Programación y Métodos Numéricos // Ejercicio 13

// 12-ABR-2018

function d=distancia(Px,Py,Pz,Qx,Qy,Qz) d=sqrt((Px-Qx)^2+(Py-Qy)^2+(Pz-Qz)^2) endfunction

disp("Este programa calcula el área de un triángulo dadas") disp("las coordenadas tridimensionales de sus vértices") // Crear vectores del tamaño adecuado para las coordenadas x=[0 0 0];

y=[0 0 0]; z=[0 0 0];

// Usar un ciclo para pedir las coordenadas de los tres puntos for i=1:3

disp("Proporcione las coordenadas del vértice "+string(i)) x(i)=input("x"+string(i)+"? ");

y(i)=input("y"+string(i)+"? "); z(i)=input("z"+string(i)+"? "); end

// Llamar a la función "distancia" para calcular los tres lados // pasando como datos las coordenadas de cada par de puntos a=distancia(x(1),y(1),z(1),x(2),y(2),z(2));

b=distancia(x(2),y(2),z(2),x(3),y(3),z(3)); c=distancia(x(3),y(3),z(3),x(1),y(1),z(1));

// Ya con las tres distancias, calcular el semiperímetro y el área s=(a+b+c)/2;

(11)

// Finalmente reportar el área

disp("El área es "+string(A)+ " unidades cuadradas") CORRIDA DE PRUEBA

--> exec("Ejercicio13.sce");

Este programa calcula el área de un triángulo dadas las coordenadas tridimensionales de sus vértices Proporcione las coordenadas del vértice 1

x1? 1.5 y1? 4 z1? 3.5

Proporcione las coordenadas del vértice 2 x2? 6.5

y2? 9.5 z2? 5

Proporcione las coordenadas del vértice 3 x3? 8

y3? 1.5 z3? 0.5

El área es 27.853130 unidades cuadradas EJERCICIO 14

Se tiene un tanque vertical de altura total H , de forma cilíndrica con fondo hemisférico, que se llena parcialmente con un líquido. El volumen de líquido en el tanque se puede calcular mediante la siguiente función definida por partes:

(

)

(

)

π π π 2 1 3 3 2 2 3 si si 3 h r h h r V r r h r h r  − <  =  + − ≥ 

donde r es el radio del tanque en metros, h es el nivel (o altura) del líquido medido desde el fondo del tanque, también en metros, y V es el volumen de líquido en metros cúbicos.

Escribir un programa para calcular el volumen de líquido en un tanque de 0.9 m de diámetro y 1.8 m de altura total. El volumen debe calcularse en una función. El programa debe pedir el nivel del líquido en metros, y reportar el volumen en litros. El programa debe responder con un mensaje de error si se le da un nivel negativo o mayor que la altura total. Reportar las corridas de prueba para los siguientes valores de h: (A) 0.3 m, (B) 1.5 m, (C) 2.1 m y (D) −1 m.

RESPUESTA: (A) 98.96 L, (B) 858.83 L

CÓDIGO DEL PROGRAMA

(12)

// Ejercicio 14 // 12-ABR-2017

// Definir una función para el volumen function V=Volumen(r,h)

// r y h en metros, V en metros cúbicos if h<r then V=(1/3)*%pi*h^2*(3*r-h); else V=(2/3)*%pi*r^3+%pi*r^2*(h-r); end endfunction

disp("Volumen en un tanque cilíndrico con fondo hemisférico") r=input("Diámetro del tanque en metros? ")/2;

H=input("Altura total del tanque en metros? "); h=input("Nivel en el tanque en metros? ");

// Checar casos especiales, si no es ninguno, calcular el volumen if h<0 then

disp("El nivel no puede ser un número negativo") elseif h>H then

disp("El nivel no puede exceder de la altura total") else

V=Volumen(r,h);

// El volumen está en metros cúbicos,

// para convertir a litros se multiplica por 1000 disp("El volumen es " + string(V*1000) + " L") end

CORRIDA DE PRUEBA

--> exec("Ejercicio14.sce");

Volumen en un tanque cilíndrico con fondo hemisférico Diámetro del tanque en metros? 0.9

Altura total del tanque en metros? 1.8 Nivel en el tanque en metros? 0.3 El volumen es 98.960169 L

--> exec("Ejercicio14.sce");

Volumen en un tanque cilíndrico con fondo hemisférico Diámetro del tanque en metros? 0.9

Altura total del tanque en metros? 1.8 Nivel en el tanque en metros? 1.5 El volumen es 858.83289 L

--> exec("Ejercicio14.sce");

Volumen en un tanque cilíndrico con fondo hemisférico Diámetro del tanque en metros? 0.9

Altura total del tanque en metros? 1.8 Nivel en el tanque en metros? 2.1

(13)

El nivel no puede exceder de la altura total --> exec("Ejercicio14.sce");

Volumen en un tanque cilíndrico con fondo hemisférico Diámetro del tanque en metros? 0.9

Altura total del tanque en metros? 1.8 Nivel en el tanque en metros? -1

Referencias

Documento similar

 Para recibir todos los números de referencia en un solo correo electrónico, es necesario que las solicitudes estén cumplimentadas y sean todos los datos válidos, incluido el

La determinación molecular es esencial para continuar optimizando el abordaje del cáncer de pulmón, por lo que es necesaria su inclusión en la cartera de servicios del Sistema

Abstract: This paper reviews the dialogue and controversies between the paratexts of a corpus of collections of short novels –and romances– publi- shed from 1624 to 1637:

En junio de 1980, el Departamento de Literatura Española de la Universi- dad de Sevilla, tras consultar con diversos estudiosos del poeta, decidió propo- ner al Claustro de la

Habiendo organizado un movimiento revolucionario en Valencia a principios de 1929 y persistido en las reuniones conspirativo-constitucionalistas desde entonces —cierto que a aquellas

The part I assessment is coordinated involving all MSCs and led by the RMS who prepares a draft assessment report, sends the request for information (RFI) with considerations,

Ciaurriz quien, durante su primer arlo de estancia en Loyola 40 , catalogó sus fondos siguiendo la división previa a la que nos hemos referido; y si esta labor fue de

A los 6 años de edad, los valores medios de esbeltez fueron significativamente superiores con la aplicación de una dosis única de 300 g árbol -1 de (NPK); a los 35 años el