Matlab - Integral definida de función muy compleja

 
Vista:
sin imagen de perfil

Integral definida de función muy compleja

Publicado por Alberto (5 intervenciones) el 17/05/2017 19:21:48
Tengo un problema al calcular integrales definidas. En mi caso, tengo que ir calculando un integral para cada uno de los periodos. Para ello he hecho un bucle for para que me vaya metiendo los valores calculados de cada periodo en una matriz columna. El primer problema viene a, que al ser la integral en dominios de tiempo del orden del microsegundo empezando desde 0 y terminando en 4 me da ahi un error. Este lo he solucionado (o eso creo). El otro problema que tengo es en la función, que es mu compleja al ser una gran suma de senos. Os dejo aqui el script que he escrito con las variables y funciones.

1
2
3
4
5
6
for i=1:57
    ii=0.07+(i-1)*0.07;
    fun=@(x) (1131*sin((4336368363127273*x)/4611686018427387904 - 823/500))/10 + 2167*sin((1447608241184357*x)/4611686018427387904 + 313/100) + (301*sin((8684727109902457*x)/9223372036854775808 + 6417/10000))/2 + (4429*sin((1456370444619369*x)/4611686018427387904 + 1649/250))/100 + (4362*sin((5784898941515315*x)/18446744073709551616 + 3303/1000))/5 + (331*sin((5733248058108929*x)/18446744073709551616 + 151/50))/10 + (2083*sin((2532968545621243*x)/1152921504606846976 - 216965415648201/72057594037927936))/25 + (1009*sin((271772421673449*x)/288230376151711744 + 1313/500))/10;
    f=integral(fun,ii,ii+0.07);
    Vef(i,:)=f;
end
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 JESUS DAVID ARIZA ROYETH
Val: 3.309
Plata
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Integral definida de función muy compleja

Publicado por JESUS DAVID ARIZA ROYETH (1818 intervenciones) el 17/05/2017 19:35:27
como la fun es la misma en el ciclo te recomiendo que la saques del ciclo para que no tenga que declarla 57 veces

1
2
3
4
5
6
fun=@(x) (1131*sin((4336368363127273*x)/4611686018427387904 - 823/500))/10 + 2167*sin((1447608241184357*x)/4611686018427387904 + 313/100) + (301*sin((8684727109902457*x)/9223372036854775808 + 6417/10000))/2 + (4429*sin((1456370444619369*x)/4611686018427387904 + 1649/250))/100 + (4362*sin((5784898941515315*x)/18446744073709551616 + 3303/1000))/5 + (331*sin((5733248058108929*x)/18446744073709551616 + 151/50))/10 + (2083*sin((2532968545621243*x)/1152921504606846976 - 216965415648201/72057594037927936))/25 + (1009*sin((271772421673449*x)/288230376151711744 + 1313/500))/10;
for i=1:57
ii=0.07+(i-1)*0.07;
f=integral(fun,ii,ii+0.07);
Vef(i,:)=f;
end

en mi pc ejecuta bien, puedes intentar si el problema es de lentitud utilizar programación paralela con un parfor :

1
2
3
4
5
6
fun=@(x) (1131*sin((4336368363127273*x)/4611686018427387904 - 823/500))/10 + 2167*sin((1447608241184357*x)/4611686018427387904 + 313/100) + (301*sin((8684727109902457*x)/9223372036854775808 + 6417/10000))/2 + (4429*sin((1456370444619369*x)/4611686018427387904 + 1649/250))/100 + (4362*sin((5784898941515315*x)/18446744073709551616 + 3303/1000))/5 + (331*sin((5733248058108929*x)/18446744073709551616 + 151/50))/10 + (2083*sin((2532968545621243*x)/1152921504606846976 - 216965415648201/72057594037927936))/25 + (1009*sin((271772421673449*x)/288230376151711744 + 1313/500))/10;
parfor i=1:57
ii=0.07+(i-1)*0.07;
f=integral(fun,ii,ii+0.07);
Vef(i,:)=f;
end


y como último recurso puedes intentar aproximar la función a otra más sencilla en ese intervalo
espero te sea de ayuda

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

Integral definida de función muy compleja

Publicado por Alberto (5 intervenciones) el 18/05/2017 11:52:54
Muchas gracias por tu ayuda.

Ahora me surge otro problema, ya que la finalidad de esto es sacar el valor eficaz de esa función senoidal. En este caso el valor eficaz es elevar al cuadrado la función dada, integrar ese resultado entre los mimos límites de antes, dividir el resultado por el periodo (en este caso 0.07), y hacer la raíz cuadrada de este último resultado. Mi problema viene en el momento en el que elevo al cuadrado la función. Cuando lo hago aparte y pego el resultado me da error en el símbolo "^" y me dice que los cambie por ".^" que no se si es lo mismo ya que los resultados se alejan mucho de los que deberían ser teóricamente. Te dejo el script aquí:

fun=@(x) ((1131*sin((4336368363127273*x)/4611686018427387904 - 823/500))/10 + 2167*sin((1447608241184357*x)/4611686018427387904 + 313/100) + (301*sin((8684727109902457*x)/9223372036854775808 + 6417/10000))/2 + (4429*sin((1456370444619369*x)/4611686018427387904 + 1649/250))/100 + (4362*sin((5784898941515315*x)/18446744073709551616 + 3303/1000))/5 + (331*sin((5733248058108929*x)/18446744073709551616 + 151/50))/10 + (2083*sin((2532968545621243*x)/1152921504606846976 - 216965415648201/72057594037927936))/25 + (1009*sin((271772421673449*x)/288230376151711744 + 1313/500))/10)^2;
for i=1:57
ii=0.07+(i-1)*0.07;
f=integral(fun,ii,ii+0.07);
A=sqrt(f/0.07)
Vef(i,:)=A;
end
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
Val: 269
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Integral definida de función muy compleja

Publicado por Daniel (264 intervenciones) el 18/05/2017 22:29:42
Sin animo de ofender me parece que no estas haciendo las cosas bien... Siempre intentá representar graficamente tus funciones y ver que son como esperas.

Estas haciendo la integral en cualquier parte... basta con dibujarla para darse cuenta que el periodo es del orden de 20000 y no 4 (que es bastante distinto)

Te mando un código para que veas esto mas claro y te fijes si te sirve

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
clc
clear all
fun=@(x) (1131*sin((4336368363127273*x)/4611686018427387904 - 823/500))/10 + 2167*sin((1447608241184357*x)/4611686018427387904 + 313/100) + (301*sin((8684727109902457*x)/9223372036854775808 + 6417/10000))/2 + (4429*sin((1456370444619369*x)/4611686018427387904 + 1649/250))/100 + (4362*sin((5784898941515315*x)/18446744073709551616 + 3303/1000))/5 + (331*sin((5733248058108929*x)/18446744073709551616 + 151/50))/10 + (2083*sin((2532968545621243*x)/1152921504606846976 - 216965415648201/72057594037927936))/25 + (1009*sin((271772421673449*x)/288230376151711744 + 1313/500))/10;
n=1000;
tf=20000;
t=linspace(0,tf,n);
y=fun(t);
subplot(2,2,1),plot(t,y)
valor_eficaz=sqrt(sum(y.^2)/n);
title(['F   valor eficaz : ' num2str(valor_eficaz,6) ' , V_{eff} / V_{max} = ' num2str(valor_eficaz/max(y),4)])
 
integral_fun=cumsum(y)*(tf/n);
 
subplot(2,2,2),plot(t,integral_fun)
title('Integral de F')
 
subplot(2,2,3),plot(t,y.^2)
 
title('F^2')
 
integral_fun=cumsum(y)*(tf/n);
integral_fun2=cumsum(y.^2)*(tf/n);
 
subplot(2,2,4),plot(t,integral_fun2)
title('Integral de F^2')

Comentanos como te fue

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
sin imagen de perfil

Integral definida de función muy compleja

Publicado por Alberto (5 intervenciones) el 23/05/2017 17:32:08
Perdona por no contestarte antes, he visto que mi problema venía con la interpolación de los datos de la tabla para construir la función. Ahora, para obtener una mejor aproximación de la función, he utilizado el el comando spline, obteniendo una gráfica que se ajusta mucho a los datos que he obtenido. Pero vuelvo a tener el mismo problema que al principio, una vez obtenida la gráfica, no se como elevar al cuadrado esa función antes de integrarla. Dejo aquí el script que he hecho. Aclaro que lo que quiero elevar al cuadrado en este caso es la función "spl". Os dejo la tabla de donde saco los valores de V. Gracias de antemano por vuestra ayuda.

1
2
3
4
5
6
7
8
9
10
x=linspace(0,4800*835e-6,4801);
y=V;
spl=spline(x,y);
splint = fnint(spl);
for i=1:57
    ii=0.7+(i-1)*0.7
    A=diff(fnval(splint,[ii ii+1]))
    B=sqrt(A/0.7)
    Vef(i,:)=B
end
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