Autor Tema: Convertir Escala Lineal a Logarítmica

0 Usuarios y 1 Visitante están viendo este tema.

13 Diciembre, 2021, 05:40 pm
Leído 3712 veces

MasLibertad

  • $$\Large \color{#5372a0}\pi\,\pi$$
  • Mensajes: 77
  • Karma: +0/-0
  • Sexo: Masculino
    • Más Libertad
Hola, a todos.
Hacía bastante tiempo que no pasaba por aquí, así que, lo primero de todo, saludos.
Y lo segundo, el problema.

Estoy haciendo un programa JavaScript para dibujar en un gráfico la relación del Corrimiento al Rojo de la luz de una Supernova de tipo 1a con su magnitud estelar.
Este trabajo lo hicieron Perlmutter y otros astrofísicos en 1997, a partir de la observación de unas 40 galaxias, y consiguieron un gráfico como el siguiente:

Como veis, para un valor de z de 0 a 1 se observan unas magnitudes que llegan hasta 24~25.
Yo estoy haciendo un programa que haga lo mismo, peo no a partir de observaciones, sino de cálculo.

Mi idea es generar el gráfico pudiendo introducir un valor de z de 1 a 99 y dibujar el gráfico correspondiente para varios supuestos de cálculo.
Me explico, determinar la distancia a una galaxia no es tarea sencilla, se han hecho varias suposiciones y cada una de ellas dará lugar a una curva distinta. En mi gráfico, por ejemplo, hay dos líneas, una está basada en la expansión cosmológica del universo y la otra en el efecto dopler, pero en su momento quiero añadir las curvas correspondientes a otros dos métodos distintos, lo cual dará lugar a otras dos curvas, que aún no sé lo similares o distintas que van a ser.
Hasta ahora me he encontrado con dificultades que con más o menos tiempo y estudio he podido resolver, pero una opción que quería añadir al programa me ha hecho estrellarme contra un muro. Vamos, esto  :banghead:
Aunque el primer gráfico de Perlmutter es correcto y bastante explicativo, la versión del gráfico que se ha hecho más popular es la siguiente.

Es el mismo gráfico, los mismos datos, pero en este último la escala de z no es lineal, sino logarítmica.
Pues bien, en mi programa quiero añadir la opción de ver ambas escalas, la lineal o la logarítmica, y la lineal ya la tengo, pero...
¡¡no consigo la escala logarítmica!!
Os diré el proceso que sigo para que veáis por donde voy:

Código: [Seleccionar]
// Leer Datos de Formulario
TipoEscala = Formu.Escala.value;
vZ = Valor(Formu.tZ.value);
LogMaxZ = Math.log10(vZ);
EscalaLogZ = gAncho / LogMaxZ;
gAncho es el ancho del gráfico en píxeles.
Un problema, si se introduce como z el valor de 1, su logaritmo sería 0, lo cual me daría una curva plana, y sería aún peor si introducen un valor menor de 1, como 0'5, porque entonces daría un valor negativo, así que supongo que en la fórmula debería poner Math.log10(vZ+1). Creo.

Voy a tener cuatro funciones, para dibujar cuatro curvas distintas, y en cada una de ellas voy a recorrer el gráfico, desde 0 hasta gAncho, y para cada píxel conseguiré el valor que le corresponde de z.
Como ejemplo:
Código: [Seleccionar]
function DibujaCurvaMOnda()
{
var x, z, m;
Dibujo.lineWidth = "1";
Dibujo.strokeStyle = "blue";
m=CalculaMOnda(CalculaZ(1));
Dibujo.beginPath();
Dibujo.moveTo(gX,gY+gAlto-m*EscalaM);
for (x=1;x<gAncho;x++)
{
z=CalculaZ(x);
m=CalculaMOnda(z);
Dibujo.lineTo(gX+x,gY+gAlto-m*EscalaM);
}
Dibujo.stroke();
}
Es sencillo ¿verdad?

Y ahora el problema:
Código: [Seleccionar]
function CalculaZ(x)
{
var z;
if (TipoEscala == "Lin")
z=vZ*x/gAncho;
else
{
¡¡¡^*ç¨Ç*//$%&!!!
}
return z;
}
En fin, como veis, si la escala es lineal, la solución es bastante fácil, vZ*x/gAncho, pero si se elige la escala logarítmica ¿cómo calculo z a partir de x?
Lo he intentado de varias formas, y el caso es que creo que debería ser sencillo, pero no lo consigo.

¿podríais echarme una mano?
Siempre hay un medio si el Valor va unido a la Inteligencia
Conan el Bárbaro,  La Torre del Elefante

14 Diciembre, 2021, 09:46 pm
Respuesta #1

MasLibertad

  • $$\Large \color{#5372a0}\pi\,\pi$$
  • Mensajes: 77
  • Karma: +0/-0
  • Sexo: Masculino
    • Más Libertad
Bueno, como veo que nadie responde, voy a replantear el problema a ver si así lo simplifico un poco.

Tengo un gráfico con una escala lineal así:

Para realizar el dibujo en las coordenadas correctas, hago lo siguiente: MaxZ=1
Calculo la Escala del gráfico al valor máximo: EscalaZ=MaxZ/gAncho
Entonces, para cualquier coordenada x, sólo tengo que calcular: z=x*EscalaZ

Ahora quiero cambiar la escala lineal por una logarítmica.

El proceso debería ser el mismo, pero la escala no puede estar basada en x, sino en log10(x)
Tal como yo lo veo, debería usar: MaxZLog = log10(MaxZ + 1) (el +1 es para incorporar los valores entre 0 y 1)
La escala, igual que antes: EscalaZLog = MaxZLog/gAncho
Entonces, para cualquier valor de x: zLog=x*EscalaZLog; z=POW(10,zLog)-1

Bueno, pues no funciona.
¿Podéis indicarme en qué estoy equivocado?
Siempre hay un medio si el Valor va unido a la Inteligencia
Conan el Bárbaro,  La Torre del Elefante

15 Diciembre, 2021, 11:08 am
Respuesta #2

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
La escala logarítmica es proporcional a los órdenes de magnitud de los datos, es decir hay la misma cantidad de pixeles entre 0.01 y 0.1 que desde 0.1 a 1.
Si \( n \) es ese número de pixeles por cada orden de magnitud.
\( Vmin \) es el mínimo valor que puedes diferenciar en la escala (el primer valor al lado del cero ej 0.0001)
\( Vmax \) es el máximo valor que puedes representar a fondo de la escala (el último valor ej 1100 si te refieres a z como corrimiento cosmológico( entonces....

El número de pixeles que ocupa el gráfico en pantalla es

\( N=n\log_{10}\left(\dfrac{V_{max}}{V_{min}}\right) \)

Y cada valor \( v \) lo representas a  \( p \)  pixeles del cero como

\( p=n\log_{10}\left(\dfrac{v}{V_{min}}\right) \)

Saludos
Saludos  \(\mathbb {R}^3\)