Aplicaciones y herramientas informáticas, internet y otros sucedáneos informáticos
por
#339814
Hola!
Estoy adentrándome en el mundo de matlab y me gustaría hacer una consulta básica.

En la resolución de ecuaciones diferenciales ordinarias, en clase hemos trabajado con esta ecuación:

g=@(y)y.^3.*exp(1/10.*y) -5/6*y.^2.*exp(1/10.*y) +1/6*y.*exp(1/10.*y)

Tengo dudas acerca de dónde colocar los puntos y dónde no.

Ahora debo trabajar con esta ecuación:

g=@(y)0.1*y*log(100/y)

he jugado a poner puntos en unos sitios sí y en otros no, por ver si conseguía dibujar mi función, pero no lo he conseguido.

Agradecería muchísimo que me echaseis una mano.

Saludos!
Avatar de Usuario
por
#339825
Hola!

El punto se emplea para que el operador se emplee "elemento a elemento". Se usa con arrays para que el operador actúe en los elementos en vez del mismo array.

Por ejemplo, no es los mismo multiplicar dos matrices cuadradas a*b que multiplicar sus elementos entre sí, a.*b.

En tu caso (g), deberías poner el punto en 100./y (pues si no se considera como una división entre números y no lo es ya qud y es un array; y también en y.*log(), pues lo que quieres es hacer esa operación para cada uno de los elementos de y, no multiplicar dos arrays.

¡Una vez que pillas cómo va no hay más problemas!
Avatar de Usuario
por
#339827
La respuesta a lo de los puntos es: depende qué quieras hacer. Si y es un vector como parece, el operador .* ./ .^ implica que esa operación se hace elemento a elemento.

Lo que tú estás haciendo es definiendo una función cuyo argumento es la y; por eso pones el function_handle (@). Pero fíjate en que si quieres dibujarla directamente; es decir si pones por ejemplo:
y=2;
g=@(y)0.1*y*log(100/y);
plot(y,g);

Te va a salir error. Entonces, ¿Cómo se hace? Es muy fácil. Supongo que quieres representar un conjunto de valores.
Si lo que quieres es que te los dé por pantalla y hacer la gráfica; es muy fácil. Se me ha ocurrido ésto (a lo mejor se te ocurre otra forma, prueba a ver si es mejor lo tuyo)

g=@(y)0.1*y*log(100/y); %Tu función tal cual, no la toqué; si consideras que con lo que te dije antes debes cambiarla, hazlo
y=[0 3 4 5 2 6]; %El intervalo que yo he escogido
N=length(y); %La longitud del intervalo (el número de valores)

for i=1:N
valor=y(i);
g(valor) %Vamos calculando el valor de la función para cada punto

end

ezplot(g,[0 3 4 5 2 6]) %Pintamos la función (va a ser un logaritmo contraído o expandido, según y).

Te cuento que en esta misma sección del foro, encontrarás un tema dedicado al análisis numérico a través de Matlab, quizás te sea de utilidad.

Suerte y ánimo.


P.D.: Si lo que querías era otra cosa, dímelo. Si me quieres hacer el examen de Mecánica de Fluidos en agradecimiento, también se agradece.
por
#339828
Hola!
Mil gracias por la respuesta! pero sigo sin entenderlo del todo bién.
Conozco la teoría de "elemento a elemento", pero no entiendo por qué va el punto después de 100 (100./y), y en cambio no va punto después de 0.1 (0.1.*y), si también se trata de una operación por un array, y en cambio en este caso el punto iría después de la y.

Supongo que será entenderlo, pero no lo veo!

gracias de nuevo!
Avatar de Usuario
por
#339829
Porque ahí lo que estás haciendo es multiplicar un escalar por un vector. Te propongo una cosa para que lo entiendas. Haz lo siguiente:

v=[0 2 3 4 5 6];
2.^v % Estamos elevando 2 a cada elemento del vector
2^v %Estamos elevando 2 a una matriz (¿Es ésto posible?)


Con el código que te puse antes, si quisieras eliminar el for, harías ésto:

g=@(y)0.1*y.*log(100./y);
y=[0 3 4 5 2 6]; %El intervalo que yo he escogido

g(y)

ezplot(g,[0 3 4 5 2 6]) %Pintamos la función (va a ser un logaritmo contraído o expandido, según y).

Con lo cual 8 líneas en 4.


Respecto a lo de antes; tú sí puedes multiplicar un escalar por un vector, pero no puedes dividir un escalar por un vector.
Piensa en papel; puedes poner:

2*(3,4)=(6.8)

Pero no se te ocurriría poner:

2/(6,8)= (1/3, 1/4)

Espero haberte ayudado
por
#339881
Muchas gracias a los dos por vuestra ayuda!

Si lo he entendido bien, podría seguir este razonamiento
g=@(y)y.^3.*exp(1/10.*y)

se podría decir que la primera y. significa que opere para cada uno de los elementos de”y”, y a su vez (y.^3.) el segundo punto sirve para indicar que todos los valores que se obtienen de esta operación se multipliquen por el exponencial.
(1/10.*y) aquí simplemente va detrás del 10 por tratarse de una división, y en caso de que fuese (10*y), sí que se enunciaría como 10*y.

A su vez, g=@(y)0.1*y.*log(100./y)

El primer punto indicaría que la operación se realizase para cada uno de los elementos de “y”, y el segundo punto vuelve a ser debido a la división.

Es correcto??

Por cierto felaresil, te haría el examen de Mecánica de Fluidos si estuviese en mi mano, pero soy ambientóloga y esos conocimientos quedan fuera de mi alcance xD

Mil gracias!
Avatar de Usuario
por
#339889
mary12 escribió:Muchas gracias a los dos por vuestra ayuda!

Si lo he entendido bien, podría seguir este razonamiento
g=@(y)y.^3.*exp(1/10.*y)

se podría decir que la primera y. significa que opere para cada uno de los elementos de”y”, y a su vez (y.^3.) el segundo punto sirve para indicar que todos los valores que se obtienen de esta operación se multipliquen por el exponencial.
(1/10.*y) aquí simplemente va detrás del 10 por tratarse de una división, y en caso de que fuese (10*y), sí que se enunciaría como 10*y.

A su vez, g=@(y)0.1*y.*log(100./y)

El primer punto indicaría que la operación se realizase para cada uno de los elementos de “y”, y el segundo punto vuelve a ser debido a la división.

Es correcto?? Casi, piensa que en el denominador de la exponencial estás multiplicando un escalar por un vector, obteniendo por tanto un vector (dilatado o contraído); después estás dividiendo por un vector (haces 1/(vector); por tanto lo correcto sería g=@(y)y.^3.*exp(1./10*y)

Muchas veces no suele dar problema, pero ojo que a veces sí y te vuelves loco antes de encontrarlo.


Por cierto felaresil, te haría el examen de Mecánica de Fluidos si estuviese en mi mano, pero soy ambientóloga y esos conocimientos quedan fuera de mi alcance xDPues me tocará hacerlo a mí, qué remedio :cabezazo

Mil gracias!
por
#339895
una última duda y prometo no molestar mas! xD
a la hora de representar la función, se que si introduzco

plot(y,zeros(length(y)),'k')

me dibuja el eje x=0. Estamos viendo la modificación de los modelos a someterlos a pesca, con una tasa de alfa*x, donde alfa, por ejemplo, puede ser 0,2. Por tanto esta línea comenzaría en el punto (0,0) y sería oblicua hacia arriba. ¿Sabéis que modificaciones debo hacer al comando para obtenerla?
Avatar de Usuario
por
#339902
Si te digo la verdad, no sé qué quieres hacer. ¿Que te dibuje el eje x y después una línea con los valores de un vector x multiplicados por un factor?
Palabras clave
Temas similares

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

Permisos de mensaje

No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro