Matlab - encontrar coordenada x correspondiente a coordenada y

   
Vista:

encontrar coordenada x correspondiente a coordenada y

Publicado por Maria (4 intervenciones) el 13/03/2015 15:57:53
Buenas tardes,
Soy nueva en el entorno de Matlab, y espero que podáis ayudarme.

Mi problema es: tengo varios vectores de datos, de igual lenght, por ejemplo:

A=[1 3 6 7 9 10....] --> intensidad (coordenada y)

B=[1 2 3 4 5 6 7....] --> tiempo ( coordenada x)


Quiero saber a que valor de x ( B), correspondería un valor determinado de intensidad (A), que no aparece en el vector. Es decir, en el ejemplo, que B correspondería a A=5.

Cualquier ayuda es buena,
Muchas Gracias!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Daniel

encontrar coordenada x correspondiente a coordenada y

Publicado por Daniel (212 intervenciones) el 13/03/2015 18:49:46
Esta es una pregunta cuya mejor respuesta sería ...depende

Vos solo tenes una función definida en algunos puntos, algo asi como una tabla de correspondencia x-y, en principio si el punto "yp" no forma parte de esta tabla el xp puede ser cualquiera.

Pero esto no resuelve nada y no estarás muy conforme con esa respuesta (pero es bueno tenerlo en cuenta siempre).

Mas allá de esto último hay dos casos particulares distintos en el que tiene sentido la pregunta y por tanto tiene una respuesta.

Primer caso: Ajuste de datos

Generalmente este caso se da cuando haces una serie de mediciones (cuyos datos tienen algún tipo de incerteza) y tenes un modelo matemático que tiene algunos pocos parámetros indeterminados y lo que haces es determinar los parámetros de alguna manera, con lo cual encontrás una función analítica que los representa, y luego la podes evaluar en cualquier valor, calcular su inversa, etc. La contra de este método es que necesitas saber o proponer un modelo. La ventaja es que encontras la función analítica que describe cualquier otro punto no medido.

Segundo caso: Interpolación

Es el caso más común, tenés datos (en principio exactos) pero no tenes, no sabes, no queres o incluso no existe una descripción analítica de su dependencia. Aquí hay que empezar a tomar decisiones sobre la forma de interpolar los datos. Voy a comentar aquí algunas estrategias usuales, comenzando de las mas básicas (e imprecisas) a las mas complejas (y mas precisas). Me tomo la libertad de ubicarlas en niveles (para no definir criterios de orden, etc)

para mi:
yp es el punto en el que deseo conocer xp.
xn e yn son los puntos que tengo como dato
xk e yk definen un punto especifico

Estrategia de nivel 0

el valor "yp" está (salvo un caso particular) mas cerca de uno de los yn que de los otros, supongamos que es yk el más próximo. Luego a ese punto yk le corresponde un xk determinado. Finalmente digo que el xp es igual a xk.
Esta estrategia es muy poco utilizada.

Estrategia de nivel 1

el valor de yp se encuentra entre yk e y(k+1) luego el valor de xp es encontrará entre xk e x(k+1). Acá el nivel se desdobla en dos:
a) tomo xp igual al promedio entre xk e x(k+1)
b) uno con una recta los puntos (xk,yk) y (x(k+1),y(k+1)) y me fijo en donde esta recta toma el valor yp. esto es lo que se denomina interpolación lineal.

Estrategias de niveles superiores

La idea de estos métodos es unir los puntos (xk,yk) y (x(k+1),y(k+1)) con polinomios de mayor orden para utilizan información de otros puntos cercanos.

Otras estrategias dudosas

En ocasiones se intenta utilizar funciones de muchos parámetros (polinomios de grado n, series de funciones trigonométricas, etc) para que con tantos parámetros, ajustar estos y hacer que pasen por todos los puntos. Con esta estrategia se encuentran funciones que varian muy abruptamente y de manera poco representativa de los datos originales.

Otros métodos, casi me olvidaba

Me olvidaba de un caso que en ocasiones puede ser util, principalmente con gran cantidad de datos, que es el método de suavisado el mas sencillo de explicar es el suavizado de ventana fija, que consiste en definir la función en un punto como el promedio de los puntos de la función que entran dentro de una ventana, aqui el tamaño de la ventana juega un papel importante al igual que el tipo de ventana, en algunos caso se realiza un promedio de los datos pesado por la inversa de la distancia al centro de la misma y otras cosas mas especificas.


Por último mi recomendación es usar la interpolación lineal, que en general es satisfactoria
te dejo el código abajo

1
2
3
4
yp=5;
xp=interp1(A,B,yp);
plot(B,A,'-o',xp,yp,'or')
title (num2str([xp yp]))


Comentá si sirvió de algo

y si necesitas otro método hacémelo saber

Saludos

Daniel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

encontrar coordenada x correspondiente a coordenada y

Publicado por Maria (4 intervenciones) el 16/03/2015 09:19:57
Me ha sido de gran ayuda,

Muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

encontrar coordenada x correspondiente a coordenada y

Publicado por Maria (4 intervenciones) el 16/03/2015 12:57:33
Pensaba que funcionaría, pero no.

No puedo usar la función de interpolación , en vectores de datos que no sean ordenados. y con el mismo paso. Obtengo el error: The grid vectors are not strictly monotonic increasing". --> entiendo que si deseara interpolar el tiempo,esta función si que serviria, pero yo deseo interpolar la otra variable ( variable dependiente). Y tampoco si si trabajar con decimales me perjudica.

He probado también con 'griddatan', pero da un error similar.

podéis ayudarme?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Daniel

encontrar coordenada x correspondiente a coordenada y

Publicado por Daniel (212 intervenciones) el 16/03/2015 16:52:50
Si queres cargá los datos aquí y el valor de "y"en donde queres obtener el correspondiente "x" y lo miro

Saludos

Daniel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

encontrar coordenada x correspondiente a coordenada y

Publicado por Maria (4 intervenciones) el 17/03/2015 08:47:23
Aquí los tienes,

Busco el valor del voltaje ( 2a columna) cuando la intensidad ( 1a columna) vale 1.00e-08.

Lo he solucionado parametrizando las lineas entre los dos valores más cercanos ( por arriba y por abajo) a este punto.
s=1:size(Id{1,1});
s_interp=linspace(B(k),B(k)+1 ,10000);
Id_new = interp1(s,Id{1,k},s_interp,'linear');
Vgs_new = interp1(s,Vgs{1,k},s_interp,'linear');


pero creo que es una solución un poco arcaica, y debe de haber alguna solución mejor.

Muchas gracias,

Maria
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Daniel

encontrar coordenada x correspondiente a coordenada y

Publicado por Daniel (212 intervenciones) el 17/03/2015 20:32:32
Mirando un poco los datos veo que hay un valor bastante cercano a 1e-8.
Lo que yo haría es tomar algunos puntos anteriores y posteriores a este punto y ajusta por un spline para determinar el punto en el que la curva pasa por 1e-8. Te dejo el código

comento linea por linea lo que hago:

1) busco el punto mas cercano al valor 1e-8 (lo llamé "k").
2) Represento los puntos que voy a utilizar 10 antes y 10 despues de "k".
3) Represento la linea que define el valor 1e-8.
4) Le pido que con estos datos calcule un spline y lo evlue en 1e-8.
5) Represento el punto hallado.
6) Muestro el valor hallado.

1
2
3
4
5
6
k=find(min(abs(intensidad-1e-8))==abs(intensidad-1e-8));
plot(voltaje(k-10:k+10),intensidad(k-10:k+10),'.'),hold on
plot([voltaje(k-10) voltaje(k+10)],[1e-8 1e-8]),hold on
mvol = spline(intensidad(k-10:k+10),voltaje(k-10:k+10),1e-8);
plot(mvol,mint,'ok')
disp(mvol)

Obviamente todo lo que es representación gráfica puede obviarse

1
2
3
k=find(min(abs(intensidad-1e-8))==abs(intensidad-1e-8));
mvol = spline(intensidad(k-10:k+10),voltaje(k-10:k+10),1e-8);
disp(mvol)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar