Matlab - Por qué matlab no lee el valor de un vector

 
Vista:

Por qué matlab no lee el valor de un vector

Publicado por Fernando Tacle (2 intervenciones) el 02/11/2020 19:24:08
Saludos amigos, tengo un inconveniente con un código que estoy desarrollando, matlab no me lee un valor de una comparación de dos vectores,
1
2
3
4
5
6
7
8
9
10
11
12
13
clear all
clc
td=[0 0.2 0.5 0.6 0.65 0.7 0.4];
td1=0.6;
dt=0.05;
t1=dt:dt:1.05;
for i=1:length(t1)
for j=1:length(td)
    if t1(i)==td(j)
        td(j)
    end
end
end

El resultado que me arroja es 0.2, 0.4, 0.5, 0.65 y 0.7
Cuando en realidad debería arrojar 0.2, 0.4, 0.5, 0.6, 0.65 y 0.7
el valor que falta es 0.6, no se porqué no imprime, su ayuda con este inconveniente por favor.
Gracias de antemano.
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

Por qué matlab no lee el valor de un vector

Publicado por Fernando Tacle (2 intervenciones) el 02/11/2020 23:03:09
No importa el orden pero la cuestión es que debe aparecer el 0.6
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 JOSE JEREMIAS CABALLERO
Val: 7.541
Oro
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Por qué matlab no lee el valor de un vector

Publicado por JOSE JEREMIAS CABALLERO (5835 intervenciones) el 03/11/2020 16:09:30
1
2
3
4
5
6
7
8
9
10
11
12
13
clear
clc
td=[0 0.2 0.5 0.6 0.65 0.7 0.4];
td1=0.6;
dt=0.05;
t1=dt:dt:1.05;
for i=1:length(t1)
for j=1:length(td)
    if abs(t1(i)-td(j))<10^(-15)
        td(j)
    end
end
en


Saludos
JOSE JEREMIAS CABALLERO
Asesorias de Proyectos con Matlab
Servicios de programación matlab
Servicio de Asesoría Online en Matlab
jjcc94@hotmail.com


https://programacioncaballero.blogspot.com/
https://www.facebook.com/programacioncaballero
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

Por qué matlab no lee el valor de un vector

Publicado por Jon (71 intervenciones) el 03/11/2020 16:43:01
Buenas José,

Yo también le he estado dando vueltas y no he conseguido entender por qué el 4to valor del array td y el 12avo valor del array t1 no son exactamente iguales para MATLAB.

Es evidente que definiendo el error absoluto de ambos y un error mínimo, vas a obtener lo que deseas haciendo una pequeña "trampa". Sin embargo, sería interesante saber la diferencia entre ambos 0.6, ¿no crees?

Supongo que la diferencia es la forma de definirlo (uno directamente y otro mediante un salto preciso), pero no acabo de entenderlo.

Un saludo,
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 JOSE JEREMIAS CABALLERO
Val: 7.541
Oro
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Por qué matlab no lee el valor de un vector

Publicado por JOSE JEREMIAS CABALLERO (5835 intervenciones) el 03/11/2020 17:06:06
No es trampa. Estudia punto flotante de un número.
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
sin imagen de perfil
Val: 1.059
Bronce
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Por qué matlab no lee el valor de un vector

Publicado por Daniel (344 intervenciones) el 03/11/2020 20:38:12
Hola,

Realmente el problema es porque pensamos que cuando guardamos un numero real en un ordenador se guarda tal cual y no es así. Se guarda la representación más cercana que existe para el tipo de dato utilizado.

Por eso nunca se debería usar == para ver si dos reales son iguales, solo se debería usara para enteros, sino que deberíamos comparar si la distancia es menor que la precisión del tipo de dato usado. Como ha hecho Jose en su respuesta. Algo que se pude ver también si escribimos t1(12) - 0.6, obteniéndose un valor cercano 1e-16, no a cero.

En Matlab existe un método que nos permite ver cual es la distancia entre 1 y en numero más cercano llamada eps. Valor que para datos de tipo double es 2e-16 y para single (eps(single(1))) es 1e-7.

Una cosa curiosa, se puede ver como se propaga el error en este ejemplo con un código tan sencillo como:

1
2
3
4
5
6
7
8
9
10
11
12
13
>> diff(t1) - 0.05
 
ans =
 
   1.0e-16 *
 
  Columns 1 through 15
 
         0    0.1388   -0.1388   -0.1388   -0.1388    0.4163   -0.1388   -0.1388   -0.1388    0.4163    0.4163   -0.6939   -0.6939    0.4163    0.4163
 
  Columns 16 through 20
 
    0.4163   -0.6939    0.4163   -0.6939    0.4163

Saludos,
Daniel Rodríguez
Analytics Lane
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