Matlab - Función a trozos con singularidades en los extremos

 
Vista:

Función a trozos con singularidades en los extremos

Publicado por jesmarva (6 intervenciones) el 16/07/2015 18:17:49
Hola,

No soy un gran experto en Matlab y me estoy encontrando con algún problema al definir y utilizar una 'función a trozos' que utiliza una función que tiene singularidades en los extremos.

Entre 0 y 1, y(x) = x.^(1/2)*(1-x).^(3/4).*SN(x) donde SN(x) = ellipj( log(x./(1-x)) , (1/2)^(1/2) ). Cuando la función SN(x) no está definida, y(x) debe valer 0. Nótese que en 0 y 1, SN(x) recibe el valor NaN, aunque funcJac(0) = funcJac(1) = 0.

Siguiendo algún consejo para definir una función a trozos que había visto en este foro, había escrito el siguiente programa:

function [y] = funcJac(x)

if x<=0
y = 0;
elseif x>=1
y = 0;
else
SN = @(x) ellipj( log(x./(1-x)) , (1/2)^(1/2) );
y = x.^(1/2)*(1-x).^(3/4).*SN(x);
end

Pero cuando llamo desde otra función a esta función recibo el siguiente error:

??? Error using ==> mtimes
Inner matrix dimensions must agree.

Estoy tratando de aplicar una fft a algunos valores de otra función para la que utilizo esta funcJac(x). He tratado de factorizar los resultados de funcJac, pero supongo que no lo estoy haciendo bien.

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
Val: 269
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Función a trozos con singularidades en los extremos

Publicado por Daniel (264 intervenciones) el 16/07/2015 18:26:47
te faltó un punto en la definición de y, iria:

1
y = x.^(1/2).*(1-x).^(3/4).*SN(x);



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

Función a trozos con singularidades en los extremos

Publicado por jesmarva (6 intervenciones) el 17/07/2015 11:49:26
Hola Daniel,

Muchas gracias por la respuesta. Efectivamente le faltaba un punto. Pero cuando se lo puse no hacía todavía lo que yo quería, porque x era un vector, así que he cambiado el programa. Ahora es:

1
2
3
4
5
6
7
8
9
10
11
12
function [y] = funcJac2(x)
 
for i = 1:length(x)
 
if ( 0<x(i) ) && ( 1>x(i) )
    SN = ellipj( log( x (i)./(1-x(i) ))  , (1/2)^(1/2) );
    y(i) =  x (i).^(1/2).*(1-x(i)).^(3/4).*SN;
else
    y(i) = 0;
end
 
end

No sé si es muy correcto. La estoy llamando varios miles de veces, y no parece muy rápida. Pero parece estar haciendo lo que quiero (hasta ahora).

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: 6.975
Oro
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Función a trozos con singularidades en los extremos

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 18/07/2015 04:11:58
1
2
3
4
function y=funcJac3(x)
x=x(0<x & x<1);
SN=ellipj(log(x./(1-x)),(1/2)^(1/2));
y=[x.^(1/2).*(1-x).^(3/4).*SN]';


1
2
3
4
5
6
7
8
9
10
11
12
13
14
>> Y=funcJac3(rand(1,10))
 
Y =
 
   -0.3347
   -0.2363
   -0.2680
   -0.3167
   -0.1604
   -0.1061
    0.2176
   -0.1565
   -0.3480
    0.1699


Saludos .
JOSE JEREMÍAS CABALLERO
Asesoría online en Matlab
Servicios de programación matlab
[email protected]
skype: josejeremiascaballero
Estimado Usuario, el correo es para servicios de cursos, asesoría y programación. Toda ayuda gratuita es vía foro.


http://matlabcaballero.blogspot.com
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

Función a trozos con singularidades en los extremos

Publicado por jesmarva (6 intervenciones) el 18/07/2015 12:30:23
Hola José Jeremías,

Muchas gracias por tu tiempo. Parece bastante más rápida, el problemas es que esa función no está definida ni en el 0, ni en el 1. Y necesito evaluarla en esos puntos. Pero me parece que esa debe ser la idea. Seguiré pensando.

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: 6.975
Oro
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Función a trozos con singularidades en los extremos

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 18/07/2015 13:54:49
he estado revisando todo lo que haz comentado y no está claro exactamente que es lo quieres hacer.
Podríamos hacer por modalidad de asesoría online en matlab. Seria una forma rápida de resolver tu problema cuando expliques en tiempo real y en detalle que es lo deseas exactamente. Las condiciones de tales asesorías online esta en mi blog personal.


Saludos.
Saludos .
JOSE JEREMÍAS CABALLERO
Asesoría online en Matlab
Servicios de programación matlab
[email protected]
skype: josejeremiascaballero
Estimado Usuario, el correo es para servicios de cursos, asesoría y programación. Toda ayuda gratuita es vía foro.


http://matlabcaballero.blogspot.com
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

Función a trozos con singularidades en los extremos

Publicado por jesmarva (6 intervenciones) el 19/07/2015 12:03:03
Hola,

Sólo quiero saber si es posible que la función funcJac2(x) definida arriba sea más rápida. En el peor de los casos me valdría esta función.

Creo que estaba bien explicado en el primer mensaje cómo debe estar definida la función: "Entre 0 y 1, y(x) = x.^(1/2)*(1-x).^(3/4).*SN(x) donde SN(x) = ellipj( log(x./(1-x)) , (1/2)^(1/2) ). Cuando la función SN(x) no está definida, y(x) debe valer 0. Nótese que en 0 y 1, SN(x) recibe el valor NaN, aunque funcJac(0) = funcJac(1) = 0."

Sin embargo la función que definiste, José Jeremías, sólo está definida para 0<x<1 si no me equivoco, no en el 0 ó el 1. Es una función que debe ser definida a tramos.

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: 6.975
Oro
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Función a trozos con singularidades en los extremos

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 19/07/2015 15:04:52
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
>> [x,y]=funcJac4
 
x =
 
    1.9231    2.9149    1.2590    1.4522    3.0855    1.3264    4.1219    4.9133
 
 
y =
 
     0     0     0     0     0     0     0     0
 
>> [x,y]=funcJac4
 
x =
 
    3.6512    1.7194    2.9203    0.5388    4.5315    4.3983    4.0888    1.3036
 
 
y =
 
         0         0         0    0.0635         0         0         0         0
 
>> [x,y]=funcJac4
 
x =
 
    2.9718    0.1126    2.1263    1.5636    0.8074    0.8938    2.1144    0.4711
 
 
y =
 
         0   -0.3067         0         0    0.2435    0.1758         0   -0.0490
 
>> [x,y]=funcJac4
 
x =
 
    2.9926    2.3546    3.4797    3.4994    3.1927    0.1680    0.3440    1.5980
 
 
y =
 
         0         0         0         0         0   -0.3441   -0.2472         0
 
 
>> [x,y]=funcJac4
 
x =
 
    1.4912   -0.2318   -2.5271    3.8071   -3.1553    0.4495    0.4043   -3.8862
 
 
y =
 
         0         0         0         0         0   -0.0859   -0.1603         0
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

Función a trozos con singularidades en los extremos

Publicado por jesmarva (6 intervenciones) el 20/07/2015 11:22:23
Hola,

Gracias por las respuestas, pero creo que tengo ya algo con lo que estoy contento:

function y=funcJac4(x)

x1 = x.*(0<x & x<1) + 0.5.*(x<=0) + 0.5.*(x>=1);
x2 = 1.*(0<x & x<1) + 0.*(x<=0) + 0.*(x>=1);

SN=ellipj(log(x1./(1-x1)),(1/2)^(1/2));

y = x2.*x1.^(1/2).*(1-x1).^(3/4).*SN;

No sé si a alguién se le ocurre la forma de construir la función de forma que sea más rápida, pero de momento me vale.

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: 6.975
Oro
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Función a trozos con singularidades en los extremos

Publicado por JOSE JEREMIAS CABALLERO (5917 intervenciones) el 20/07/2015 14:45:52
En una de mis respuestas te había dicho que no estaba claro te pregunta. En la solución que pones, 0.5.*(x>=1); pero haces 0.*(x>=1); alli una observación. En concreto deberías poner en modalidad de imagen la función a trozos como esta definido matemáticamente la función. La pregunta fue hecha hace 5 días y si no hay respuesta acertada es porque no clara la pregunta.

Tu programa da siguiente resultado. ¿ Es correcto la salida.?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
>> [x,y]=funcJac5
 
x =
 
    1.8322    1.8460   -3.4251    2.9897    3.9468   -1.8383   -1.0301    0.4333
 
 
y =
 
         0         0         0         0         0         0         0   -0.1130
 
>> [x,y]=funcJac5
 
x =
 
   -3.9097   -0.5030   -1.4703    1.1869   -2.6544   -0.4575    2.0266   -0.5242
 
 
y =
 
     0     0     0     0     0     0     0     0
 
>> [x,y]=funcJac5
 
x =
 
    2.1632    3.2775    0.5488   -4.6688    0.9373    1.3309    3.9892   -2.4380
 
 
y =
 
         0         0    0.0790         0    0.1140         0         0         0

¿Logica difusa?
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

Función a trozos con singularidades en los extremos

Publicado por jesmarva (6 intervenciones) el 21/07/2015 11:58:43
Hola José Jeremías,

He copiado el valor de tu x en tu mensaje del 19/07/2015 15:04:52, he utilizado mi funcJac4(x) definida anteriormente (20/07/2015 11:22:23) y obtengo los mismos resultados que tú obtenías con tu función. Lo que me hace pensar:

1. Las dos veces que he definido la función se entendía perfectamente la definición. O al menos tú la has entendido. 2. Tu función y la mía hacen lo mismo, dan el mismo resultado. Tal vez lo puedes comprobar evaluándolas en un conjunto más amplio y restando los resultados.
3. Respondes muy rápidamente, lo cual es de agradecer, pero tal vez no meditas demasiado tu respuesta.

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
-1
Comentar