TODOPIC

Lenguajes de programación para PC => C, C#, C++ => Mensaje iniciado por: yair_xiox en 18 de Septiembre de 2015, 14:44:57

Título: tutorial de matlab
Publicado por: yair_xiox en 18 de Septiembre de 2015, 14:44:57
hola amigos del foro primero diganme si estan interesados en un tutorial de matlab yo soy muy bueno programando en matlab y quiero empezar un tutorial desde cero para que aprendan a programar mejor en matlab, si les interesa respondan y empiezo el tutorial
Título: Re: tutorial de matlab
Publicado por: elgarbe en 18 de Septiembre de 2015, 14:47:28
yo estoy muy interesado, incluso tengo varias consultas para hacerte ya que lo estoy usando mucho en un proyecto.

saludos!
Título: Re: tutorial de matlab
Publicado por: yair_xiox en 18 de Septiembre de 2015, 14:49:03
cuales son tus preguntas, que quieres saber de matlab dime
Título: Re: tutorial de matlab
Publicado por: elgarbe en 18 de Septiembre de 2015, 15:04:25
cuales son tus preguntas, que quieres saber de matlab dime

los .m con los que estoy trabajando no los tengo acá, estan en la facu. Mañana a la mañana estoy trabajando allá y te hago bien la consulta. tiene que ver con la implementeacion de la FFT que hace matlab y algunos resultados que no estoy entendiendo bien.

ahora, lo que siempre me interesó y nunca pude encontrar es una buena guía para conectar matlab con el mundo exterior en tiempo real. Por ejemplo, ingresar datos por un puerto serie virtual y visualizarlos o hacer càlculos en tiempo real con simulink. Tené una buena guía de eso con ejemplos prácticos sería fantástico y realmente muy útil!!!!

espero que puedas armar algo de eso

abrazo.
Título: Re: tutorial de matlab
Publicado por: yair_xiox en 18 de Septiembre de 2015, 15:06:41
hola les voy a enseñar como utilizar un switch en matlab es de la siguiente manera
p=dit;
p=input('seleccione el caso');
switch dit
case1


case2


case3

de esa forma se  puede utilizar un switch en matlab para cuando se necesite hacer varios cálculos simultáneos en un solo .m de matlab, p es para seleccionar el caso y hay que ponerle un nombre cualquiera y luego hacer switch nombre que es necesario en matlab para que reconosca el switch, ya con esto cuando quieran hacer muchas operaciones en un solo programa sin llamar a otro, si les ineteresa como hacer una funcion en matlab tambien les enseño pero mas tarde
Título: Re: tutorial de matlab
Publicado por: yair_xiox en 18 de Septiembre de 2015, 15:11:08
y que clase de calculos en tiempo real con simulink te ineteresan
Título: Re: tutorial de matlab
Publicado por: elgarbe en 18 de Septiembre de 2015, 15:53:06
y que clase de calculos en tiempo real con simulink te ineteresan

me he expresado mal, los cálculo no serían en tiempo real, la idea sería poder leer una cierta cantidad de datos por un puerto, por ejemplo un virtual serial port (los que se crean al conectar un adaptador ttl a usb) y una vez leidos procesarlos (análisis de ruido, fft, filtrado, etc), luego leer otra tanda procesarlos y así susecivamente.
me explico?

saludos!
Título: Re: tutorial de matlab
Publicado por: yair_xiox en 18 de Septiembre de 2015, 15:59:34
hola elgarbe lo que estas haciendo supera mi conocimiento pero te dejo un link donde lo explican muy bien solo tienes que hacer una cuenta en mathworks para descargar tutoriales  http://www.mathworks.com/help/instrument/serial-port-overview.html
Título: Re: tutorial de matlab
Publicado por: Chenao en 18 de Septiembre de 2015, 16:24:07

Algunos años atrás utilice la transformada rápida de Fourier para una tarea del curso de señales. Realice varios experimento incluyendo la determinación del espectro de un sensor de temperatura LM35, todo lo hice en matlab (incluyendo la toma de datos por el canal RS232). Acá los códigos que elabore en sus momentos espero sirvan.

Código: [Seleccionar]
N1 = 2048;
% Datos de tensión capturados por el lm35
%h = [0.229 0.2101 0.1466 0.229 0.2101 0.2101 0.229 0.1466 0.2101 0.2101];
%h = [0 -0.04785 -0.09569 -0.11962 -0.14354 -0.1555 -0.16746 -0.17943 -0.19139 -0.20335 -0.21531 -0.22727 -0.26316 -0.27512 -0.311 -0.33493 -0.35885 -0.28708 -0.311 -0.20335 -0.17943 -0.09569 -0.07177 -0.03589 0 0.035885 0.07177 0.095694 0.107656 0.119617 0.131579 0.155502 0.179426 0.191388 0.203349 0.2272730,239234 0.263158 0.27512 0.311005 0.334928 0.358852 0.34689 0.334928 0.239234 0.119617 0.107656 0.07177 0.011962 0];
h = [0.00000 -0.00120 -0.00478 -0.00837 -0.01077 -0.01316 -0.01675 -0.01914 -0.02033 -0.02153 -0.02273 -0.02333 -0.02392 -0.02392 -0.02392 -0.02333 -0.02273 -0.02273 -0.02033 -0.01555 -0.01196 -0.00718 -0.00478 -0.00120 0.00000 0.00359 0.00718 0.00957 0.01196 0.01555 0.01675 0.01914 0.02153 0.02213 0.02273 0.02392 0.02512 0.02512 0.02512 0.02512 0.02392 0.02392 0.02333 0.02333 0.01914 0.01555 0.01196 0.00957 0.00359 0.00000];
%F1 = [0: N1-1] / N1;
%plot(h)
FS =  15000;
%FS = 2.9412e+003
LONGITUD = 50;
t = 1/FS;
x = [0 : LONGITUD - 1]*t;
%h = sin(2*pi*100*x) + sin(2*pi*50*x);
%F1 = [-N1 / 2 : N1 / 2 - 1] / N1;
%H = abs(fft( h, 256));
%L = linspace(0, 300, 64);
%plot(L, H(1:64))
%H1 = fftshift(H);
%plot (F1, H1)
%plot( F1 , H)

%NFFT = 2^nextpow2(LONGITUD);
NFFT = 50;
Y = fft(h,NFFT)/LONGITUD;
f = FS/2*linspace(0,1,NFFT/2);

% se gráfica sólo una banda de espectro de amplitud
stem(f,2*abs(Y(1:NFFT/2)))
 

Para el caso de la función coseno un ejemplo de la FFT

Código: [Seleccionar]
n = 0: 1: 30;
x = cos(2*pi*(n)/10);

N1 = 64;
N2 = 128;   
N3 = 256; 
X1 = abs (fft (x, N1));
X2 = abs (fft (x, N2)); 
X3 = abs (fft (x, N3));

 F1 = [0: N1 - 1] / N1; 
 F2 = [0: N2 - 1] / N2; 
 F3 = [0: N3 - 1] / N3;
 
 subplot (3,1,1)
 plot (F1, X1, '-x'), title ('N = 64'), axis ([0 1 0 20]) 
 subplot (3,1,2)
 plot(F2, X2, '-x'), title ('N = 128'), axis ([0 1 0 20])
 subplot (3,1,3)
 plot(F3,X3,'-x'),title('N = 256'),axis([0 1 0 20])

Voy a buscar el código que adquiría datos vía serial para subirlo.
Título: Re: tutorial de matlab
Publicado por: Chenao en 18 de Septiembre de 2015, 16:27:26

Acá el código que recibe datos por el canal RS232

Código: [Seleccionar]
% Cerrar Todo
close all
clear
clc

% Cerrar puerto serial si ya está abierto

s = instrfind;
if ~isempty( s )
    fclose( s );
    delete( s );
    clear s
end

% Configuración de la comunicación serial
SerPIC = serial('COM3');
set(SerPIC,'BaudRate',9600);
set(SerPIC,'DataBits',8);
set(SerPIC,'Parity','none');
set(SerPIC,'StopBits',1);
set(SerPIC,'FlowControl','none');
fopen(SerPIC);

% Vectores que contienen la información recibida
C=[];
DATOS = [];

% Se reciben los datos
for k=1:28
  pause(15); 
  for i = 1: 1 : 2
   C = [C fread(SerPIC, [1], 'uint8')];
  end
end
fclose(SerPIC);

%% Rutina que convierte los datos recibidos a decimal
parte_h = [];
parte_l = [];
for i = 1 : 2: length(C)
 parte_h = [parte_h uint16(C(i))];
 parte_l = [parte_l uint16(C(i+1))];
end

zah = bitshift(parte_h, 8);
DATOS2 = bitor(zah, parte_l);
Título: Re: tutorial de matlab
Publicado por: elgarbe en 18 de Septiembre de 2015, 16:27:45
hola elgarbe lo que estas haciendo supera mi conocimiento pero te dejo un link donde lo explican muy bien solo tienes que hacer una cuenta en mathworks para descargar tutoriales  http://www.mathworks.com/help/instrument/serial-port-overview.html

que pena!!!! tenía mucha esperanza de encontrar algo de ayuda en este tema!
gracias de todo modo.

por cierto, como se comunica tu robot con matlab? digo, como le llegarán los datos desde el robot a matlab?

saludos!
Título: Re: tutorial de matlab
Publicado por: elgarbe en 18 de Septiembre de 2015, 16:29:03

Algunos años atrás utilice la transformada rápida de Fourier para una tarea del curso de señales. Realice varios experimento incluyendo la determinación del espectro de un sensor de temperatura LM35, todo lo hice en matlab (incluyendo la toma de datos por el canal RS232). Acá los códigos que elabore en sus momentos espero sirvan.

Código: [Seleccionar]
N1 = 2048;
% Datos de tensión capturados por el lm35
%h = [0.229 0.2101 0.1466 0.229 0.2101 0.2101 0.229 0.1466 0.2101 0.2101];
%h = [0 -0.04785 -0.09569 -0.11962 -0.14354 -0.1555 -0.16746 -0.17943 -0.19139 -0.20335 -0.21531 -0.22727 -0.26316 -0.27512 -0.311 -0.33493 -0.35885 -0.28708 -0.311 -0.20335 -0.17943 -0.09569 -0.07177 -0.03589 0 0.035885 0.07177 0.095694 0.107656 0.119617 0.131579 0.155502 0.179426 0.191388 0.203349 0.2272730,239234 0.263158 0.27512 0.311005 0.334928 0.358852 0.34689 0.334928 0.239234 0.119617 0.107656 0.07177 0.011962 0];
h = [0.00000 -0.00120 -0.00478 -0.00837 -0.01077 -0.01316 -0.01675 -0.01914 -0.02033 -0.02153 -0.02273 -0.02333 -0.02392 -0.02392 -0.02392 -0.02333 -0.02273 -0.02273 -0.02033 -0.01555 -0.01196 -0.00718 -0.00478 -0.00120 0.00000 0.00359 0.00718 0.00957 0.01196 0.01555 0.01675 0.01914 0.02153 0.02213 0.02273 0.02392 0.02512 0.02512 0.02512 0.02512 0.02392 0.02392 0.02333 0.02333 0.01914 0.01555 0.01196 0.00957 0.00359 0.00000];
%F1 = [0: N1-1] / N1;
%plot(h)
FS =  15000;
%FS = 2.9412e+003
LONGITUD = 50;
t = 1/FS;
x = [0 : LONGITUD - 1]*t;
%h = sin(2*pi*100*x) + sin(2*pi*50*x);
%F1 = [-N1 / 2 : N1 / 2 - 1] / N1;
%H = abs(fft( h, 256));
%L = linspace(0, 300, 64);
%plot(L, H(1:64))
%H1 = fftshift(H);
%plot (F1, H1)
%plot( F1 , H)

%NFFT = 2^nextpow2(LONGITUD);
NFFT = 50;
Y = fft(h,NFFT)/LONGITUD;
f = FS/2*linspace(0,1,NFFT/2);

% se gráfica sólo una banda de espectro de amplitud
stem(f,2*abs(Y(1:NFFT/2)))
 

Para el caso de la función coseno un ejemplo de la FFT

Código: [Seleccionar]
n = 0: 1: 30;
x = cos(2*pi*(n)/10);

N1 = 64;
N2 = 128;   
N3 = 256; 
X1 = abs (fft (x, N1));
X2 = abs (fft (x, N2)); 
X3 = abs (fft (x, N3));

 F1 = [0: N1 - 1] / N1; 
 F2 = [0: N2 - 1] / N2; 
 F3 = [0: N3 - 1] / N3;
 
 subplot (3,1,1)
 plot (F1, X1, '-x'), title ('N = 64'), axis ([0 1 0 20]) 
 subplot (3,1,2)
 plot(F2, X2, '-x'), title ('N = 128'), axis ([0 1 0 20])
 subplot (3,1,3)
 plot(F3,X3,'-x'),title('N = 256'),axis([0 1 0 20])

Voy a buscar el código que adquiría datos vía serial para subirlo.

muy bueno!

una consulta, recordas porque en esta línea:

%NFFT = 2^nextpow2(LONGITUD);
NFFT = 50;
Y = fft(h,NFFT)/LONGITUD;

comentaste la primera? y porque divides por LONGITUD al resultado de la fft?
voy a estudiar un poco lo que hisiste, gracias!
Título: Re: tutorial de matlab
Publicado por: elgarbe en 18 de Septiembre de 2015, 16:30:19

Acá el código que recibe datos por el canal RS232

Código: [Seleccionar]
% Cerrar Todo
close all
clear
clc

% Cerrar puerto serial si ya está abierto

s = instrfind;
if ~isempty( s )
    fclose( s );
    delete( s );
    clear s
end

% Configuración de la comunicación serial
SerPIC = serial('COM3');
set(SerPIC,'BaudRate',9600);
set(SerPIC,'DataBits',8);
set(SerPIC,'Parity','none');
set(SerPIC,'StopBits',1);
set(SerPIC,'FlowControl','none');
fopen(SerPIC);

% Vectores que contienen la información recibida
C=[];
DATOS = [];

% Se reciben los datos
for k=1:28
  pause(15); 
  for i = 1: 1 : 2
   C = [C fread(SerPIC, [1], 'uint8')];
  end
end
fclose(SerPIC);

%% Rutina que convierte los datos recibidos a decimal
parte_h = [];
parte_l = [];
for i = 1 : 2: length(C)
 parte_h = [parte_h uint16(C(i))];
 parte_l = [parte_l uint16(C(i+1))];
end

zah = bitshift(parte_h, 8);
DATOS2 = bitor(zah, parte_l);


fantástico, algo como eso estaba buscando. Mañana voy a tratar de probarlo!

Saludos y gracias
Título: Re: tutorial de matlab
Publicado por: yair_xiox en 18 de Septiembre de 2015, 16:34:14
el robot se comunica con matlab por medio de un usb2dynamixel que permite la comunicacion entre matlab y el robot
Título: Re: tutorial de matlab
Publicado por: KILLERJC en 18 de Septiembre de 2015, 16:38:04
el robot se comunica con matlab por medio de un usb2dynamixel que permite la comunicacion entre matlab y el robot

el usb2dynamixel crea un puerto serial virtual, asi que eso que paso Chenao te va a servir
Título: Re: tutorial de matlab
Publicado por: elgarbe en 18 de Septiembre de 2015, 16:41:27
el robot se comunica con matlab por medio de un usb2dynamixel que permite la comunicacion entre matlab y el robot

no necesariamente:
http://support.robotis.com/en/software/dynamixel_sdk/usb2dynamixel/window_communication_1/matlab.htm

sds
Título: Re: tutorial de matlab
Publicado por: yair_xiox en 18 de Septiembre de 2015, 16:44:38
elgarbe eso era mas que obvio agregar las bibbliotecas de los servomotores para asi poder controlarlos por matlab o por cualquier otro programa como eclipse
Título: Re: tutorial de matlab
Publicado por: Chenao en 18 de Septiembre de 2015, 16:50:46
Citar
%NFFT = 2^nextpow2(LONGITUD);
NFFT = 50;
Y = fft(h,NFFT)/LONGITUD;

comentaste la primera? y porque divides por LONGITUD al resultado de la fft?
voy a estudiar un poco lo que hisiste, gracias!

Empezando por la segunda pregunta. No recuerdo muy bien pero básicamente la FFT debe ser dividida por el número de muestras (longitud del vector h) para normalizar la transformación, en caso contrario se sale del umbral en que esta definido el vector de muestras.  Con respecto a la primera pregunta recuerdo que lo leí en un libro de señales pero este método de normalizar nunca me funciono.

Título: Re: tutorial de matlab
Publicado por: yair_xiox en 18 de Septiembre de 2015, 16:51:21
killer no necesariamente creo que no necesito todo eso que puso chenao  mira lo facil que se comunica el usb2dynamixel con matlab
loadlibrary('dynamixel', 'dynamixel.h');
libfunctions('dynamixel');
DEFAULT_PORTNUM = 3;  //COM3
DEFAULT_BAUDNUM = 1;  //1Mbps
 
calllib('dynamixel', 'dxl_initialize', DEFAULT_PORTNUM, DEFAULT_BAUDNUM);
 
unloadlibrary('dynamixel');

todo gracias a las librerias de los motores
Título: Re: tutorial de matlab
Publicado por: Chenao en 18 de Septiembre de 2015, 16:54:13
Código: [Seleccionar]
killer no necesariamente creo que no necesito todo eso que puso chenao  mira lo facil que se comunica el usb2dynamixel con matlab
loadlibrary('dynamixel', 'dynamixel.h');
libfunctions('dynamixel');
DEFAULT_PORTNUM = 3;  //COM3
DEFAULT_BAUDNUM = 1;  //1Mbps
 
calllib('dynamixel', 'dxl_initialize', DEFAULT_PORTNUM, DEFAULT_BAUDNUM);
 
unloadlibrary('dynamixel');

todo gracias a las librerias de los motores

Claramente, pero esta rutina puede servir para cualquier periférico que se comunique con el Matlab vía Rs232
Título: Re: tutorial de matlab
Publicado por: yair_xiox en 18 de Septiembre de 2015, 16:56:51
ok, entonces si me sirve el unico problema es que mi compu solo le sirve un puerto usb los otros estan dañados solo le puedo conectar una cosa a la vez
Título: Re: tutorial de matlab
Publicado por: KILLERJC en 18 de Septiembre de 2015, 16:59:01
No sabia que poseia uan libreria, de todas formas es una comunicacion RS232 (Real o Virtual como es el caso del usb2dynamixel) igual que la que hizo chenao

una consulta, recordas porque en esta línea:

%NFFT = 2^nextpow2(LONGITUD);
NFFT = 50;
Y = fft(h,NFFT)/LONGITUD;

comentaste la primera? y porque divides por LONGITUD al resultado de la fft?
voy a estudiar un poco lo que hisiste, gracias!

Si no me equivoco esa linea (la comentada) la tiene para hacer que el largo de muestras que entran en la FFT sea un valor 2^x , supuestamente esto accelera la conversion de la FFT.

EDIT: Por que dividirlo por la longitud.... ahi se trato el tema

http://www.mathworks.com/matlabcentral/newsreader/view_thread/267952
Título: Re: tutorial de matlab
Publicado por: Chenao en 18 de Septiembre de 2015, 17:03:18
Código: [Seleccionar]
Por que dividirlo por la longitud.... ahi me mataste, ya no lo recuerdo
Killer esto se debe a que se debe dividir por la longitud del vector de muestras. Voy a consultar los apuntes para corroborar esta operación.
Título: Re: tutorial de matlab
Publicado por: KILLERJC en 18 de Septiembre de 2015, 17:07:57
Citar
If y(t) is periodic with period T and fundamental frequency f0 = 1/T, the Fourier series coefficients (m=1,2,...) are given by

Ym = (1/T)*INTEGRAL(0,T){ dt exp(-j*2*pi*f(m)*t) * y(t) ) }

where f(m) = (m-1)*f0 = (m-1)/T.

Since the integrand is periodic with period T, the approximation to the integral represented by the sum of N-1 interior rectangles of width dt and 2 end rectangles of width dt/2 centered at times t(n) = (n-1)*dt , n = 1:N+1 can be reduced to the sum of N
rectangles of width dt centered at times t(n) = (n-1)*dt, n=1:N.

Therefore

Ym = (1/T)*SUM(n=1:N){ dt exp(-j*2*pi*f(m)*t(n)) * y(n) ) }

The factor dt/T = 1/N is missing in the MATLAB implementation.

Hope that helps.

(https://upload.wikimedia.org/math/3/6/6/36690d6391dd1547466d990f7ceba363.png)
Título: Re: tutorial de matlab
Publicado por: yair_xiox en 18 de Septiembre de 2015, 17:16:50
hola http://es.slideshare.net/doping92/factorizacin-con-matlab-7840262 de este ejemplo de un caso de factorizacion en matlab empeze y me salieron todos los casos de factorizacion en matlab y lo mejor es que obviamente lo hice con un switch que ya explique como usarlo y ademas el programa que les digo de factorizacion cuando el polinomio no es factorizable lo devuelve como se ingreso debido a que tiene raices imaginarias
Título: Re: tutorial de matlab
Publicado por: elgarbe en 18 de Septiembre de 2015, 17:48:21

EDIT: Por que dividirlo por la longitud.... ahi se trato el tema

http://www.mathworks.com/matlabcentral/newsreader/view_thread/267952

ja, todas las respuestas en un solo post, el porque multiplicar por 2 tambien era una duda. Ahora me queda solo una y es que la linea comentada, la que busca la proxima potencia de 2 es importante, ya que la FFT puede correr solo con potencias de 2. O se pierden datos o se agregan 0, pero el array de entrada tiene que ser una potencia de 2 tengo entendido.

Saludos
Título: Re: tutorial de matlab
Publicado por: KILLERJC en 18 de Septiembre de 2015, 18:09:37
De nextpow2():

Citar
You can use nextpow2 to pad the signal you pass to fft. Doing so can speed up the computation of the FFT when the signal length is not an exact power of 2.

Imagino que si no le das una potencia de 2 hara una transformada de fourier discreta., sino procedera a usar algun otro algoritmo como la FFT y termina siendo mas rapido.

Mas info:

Citar
You won't need to do zero padding, so feel free to just use your samples as-is.

MATLAB internally computes the FFT without any zero padding at all. Since your sample size is easily factorizable into small primes (10000 = 2*2*2*2*5*5*5*5), it will break down the FFT into smaller sizes. Then it will use split- and mixed- radix FFT's to build the larger 10,000 pt. FFT.

If you have a large prime factor, P, the FFT will use Rader's algorithm to sub-divide that portion of the FFT into a circular convolution of size P-1.


Y mas :

http://mechanicalvibration.com/Zero_Padding_FFTs.html
Título: Re: tutorial de matlab
Publicado por: yair_xiox en 18 de Septiembre de 2015, 23:17:11
aqui va la  estructura del programa que factoriza en matlab
Código: [Seleccionar]
o=input('seleccione el caso');
dit=o;
switch dit
    case 1 %(trinomio cuadrado perfecto suma o resta)
       syms('x')
       
    case 2 %(trinomio cuadrado perfecto dos variables suma o resta)
        syms('x')
        syms('y')
   
       
    case 3 %(potencias a la n  suma o resta,diferencia de cuadrados)
         syms x
         syms y
       
    case 4  %(cubo perfecto de tetranomios suma o resta)
          syms x
         syms y
       
    case 5 %(trinomio de la forma x^2+bx+c y ax^2+bx+c suma o resta)
         syms x
   
   
       
    case 6 %(division sintetica suma o resta 4 terminos, triangulo de pascal 4 una variable)
         syms x
   
       
    case 7 %(division sintetica suma o resta 6 terminos)
        syms x
       
    case 8 %(division sintetica suma o resta 5 terminos, triangulo de pascal 5 una variable)
        syms x
     
       
    case 9  %(triangulo de pascal 5  terminos  dos variables)
         syms x
         syms y
     
       
    case 10 %(triangulo de pascal 6  terminos  dos variables)
         syms x
         syms y
     
       
end
ahi  esta que mas quieren almenos alguien tan bueno en matlab como chenao no tendra problemas para sacar el programa apartir de esto y killer que tiene algunas bases tambien puede y si los demas son tan autodidactas como vos decis killer les queda facil sacar el programa completo apartir de este
Título: Re: tutorial de matlab
Publicado por: yair_xiox en 19 de Septiembre de 2015, 00:15:59
hola amigos a qui les voy a enseñar la segunda forma de usar switch en matlab creando una funcion para poder llamar al programa desde otro programa y de una vez otra forma de usar switch espero les gusten estos tutoriales en matlab y les sirvan
Código: [Seleccionar]
function u=funcion(x)
n=length(x);
u=zeros(1,n);
switch funcion
    case 1
       
    case 2
     
    case 3
       
    case 4
       
    case 5
   
    case 6
       
     case 7
       
       
       
end
end
porque siete casos es un programa que discretiza funciones continuas de todas las formas posibles que son 4 y los otros 3 las pasa de discretas a continuas casos de tustin matched,zoh y otro por ahi pero eso es teoria avanzada de control y deben entender esa parte del codigo no se las puedo pasar aunque realmente son muy pocas lineas
Título: Re: tutorial de matlab
Publicado por: yair_xiox en 19 de Septiembre de 2015, 00:21:47
hola y aqui les enseñare una forma aun mas sencilla de hacer una funcion en matlab
Código: [Seleccionar]
    function p=pcd(L1,L2,th1,th2)
px=L1*cos(th1)+L2*cos(th1+th2);
py=L1*sin(th1)+L2*sin(th1+th2);
p=[px; py];
 p=pcd(L1,L2,th1,th2);
 plot(p(1,:),p(2,:))
 th1=30*pi/180;
th2=60*pi/180;
p=pcd(L1,L2,th1,th2);
robotgraph(L1,th1,p);
        end
Título: Re: tutorial de matlab
Publicado por: elgarbe en 19 de Septiembre de 2015, 23:52:02
De nextpow2():

Citar
You can use nextpow2 to pad the signal you pass to fft. Doing so can speed up the computation of the FFT when the signal length is not an exact power of 2.

Imagino que si no le das una potencia de 2 hara una transformada de fourier discreta., sino procedera a usar algun otro algoritmo como la FFT y termina siendo mas rapido.

Mas info:

Citar
You won't need to do zero padding, so feel free to just use your samples as-is.

MATLAB internally computes the FFT without any zero padding at all. Since your sample size is easily factorizable into small primes (10000 = 2*2*2*2*5*5*5*5), it will break down the FFT into smaller sizes. Then it will use split- and mixed- radix FFT's to build the larger 10,000 pt. FFT.

If you have a large prime factor, P, the FFT will use Rader's algorithm to sub-divide that portion of the FFT into a circular convolution of size P-1.


Y mas :

http://mechanicalvibration.com/Zero_Padding_FFTs.html

Que buena página! Explica en el apartado anterior algunos problemas que tenía con la implementación de la fft en matlab. Muy bien explicado y bien práctico!
Título: Re: tutorial de matlab
Publicado por: KILLERJC en 20 de Septiembre de 2015, 00:02:06
Bueno, menos mal que te sirvio, yo tambien aprendi sobre el zero-padding xD
Tambien lo que vi que estaba bien explicado era el tema de las ventanas, me refiero con ejemplos. Aunque conocia el por que de hacerlo, siempre es mas lindo ver un ejemplo y ver la diferencia.
Título: Re: tutorial de matlab
Publicado por: yair_xiox en 23 de Septiembre de 2015, 10:34:48
hola, ahora vamos a ver como hacer cramer con matlab
Código: [Seleccionar]
dit=p;
p=input('seleccione el caso');
switch dit
    case 1 %(sistema de 2x2)
a=input('inserte el valor de a');
b=input('inserte el valor de b');
c=input('inserte el valor de c');
d=input('inserte el valor de d');
e=input('inserte el valor de e');
f=input('inserte el valor de f');
A=[a b;c d],
B=[e b;f d];
C=[a e;c f];
x=det(B)/det(A),
y=det(C)/det(A),


    case 2 %(sistema de 3x3)
a=input('inserte el valor de a');
b=input('inserte el valor de b');
c=input('inserte el valor de c');
d=input('inserte el valor de d');
e=input('inserte el valor de e');
f=input('inserte el valor de f');
g=input('inserte el valor de g');
h=input('inserte el valor de h');
i=input('inserte el valor de i');
j=input('inserte el valor de j');
k=input('inserte el valor de k');
l=input('inserte el valor de l');
A=[a b c;d e f;g h i],
B=[j b c;k e f;l h i];
C=[a j c;d k f;g l i];
D=[a b j;d e k;g h l];
x=det(B)/det(A),
y=det(C)/det(A),
z=det(D)/det(A),
    case 3%(sistema de 4x4)
a=input('inserte el valor de a');
b=input('inserte el valor de b');
c=input('inserte el valor de c');
d=input('inserte el valor de d');
e=input('inserte el valor de e');
f=input('inserte el valor de f');
g=input('inserte el valor de g');
h=input('inserte el valor de h');
i=input('inserte el valor de i');
j=input('inserte el valor de j');
k=input('inserte el valor de k');
l=input('inserte el valor de l');
m=input('inserte el valor de m');
n=input('inserte el valor de n');
o=input('inserte el valor de o');
p=input('inserte el valor de p');
q=input('inserte el valor de q');
r=input('inserte el valor de r');
s=input('inserte el valor de s');
t=input('inserte el valor de t');
A=[a b c d;e f g h;i j k l;m n o p],
B=[q b c d;r f g h;s j k l;t n o p];
C=[a q c d;e r g h;i s k l;m t o p];
D=[a b q d;e f r h;i j s l;m n t p];
E=[a b c q;e f g r;i j k s;m n o t];
v=det(B)/det(A),
x=det(C)/det(A),
y=det(D)/det(A),
z=det(E)/det(A),


end
Título: Re: tutorial de matlab
Publicado por: KILLERJC en 23 de Septiembre de 2015, 11:13:41
https://es.wikipedia.org/wiki/Regla_de_Cramer

Ahi hay un codigo mas lindo
Título: Re: tutorial de matlab
Publicado por: yair_xiox en 23 de Septiembre de 2015, 11:24:22
si tienes razón pero lo quería hacer a mi manera, en el mio lo único tedioso son las entradas y me faltaría añadir una condición para que cuando det(A)=0 terminara el programa en cada caso
Título: Re: tutorial de matlab
Publicado por: juaperser1 en 23 de Septiembre de 2015, 11:29:24
Comprendo tu iniciativa de querer hacer un tutorial de matlab, pero creo, soltar un código y ya esta no es la manera.

Deberias hacer una introduccion, bien redactada, primero, explicando que es la regla de cramer, y luego paso por paso como se hace en matlab, o por lo menos comentando el código.

La programación, sea cual sea el lenguaje, no funciona copiando y pegando, código, imagina una persona que quiera hacer la regla de cramer con tu código, y no sabe de matlab.¿como utiliza eso? ¿como mete los datos?¿ Como lo ejecuta?
Tienes que ponerte en lugar de una persona que no sepa utilizar matlab.

Si solo sueltas el código, es como poner una función de c, si la copias y la pegas no sirve de nada.

Un saludo.
Título: Re: tutorial de matlab
Publicado por: KILLERJC en 23 de Septiembre de 2015, 11:38:13
Citar
La programación, sea cual sea el lenguaje, no funciona copiando y pegando, código, imagina una persona que quiera hacer la regla de cramer con tu código, y no sabe de matlab.¿como utiliza eso? ¿como mete los datos?¿ Como lo ejecuta?
Tienes que ponerte en lugar de una persona que no sepa utilizar matlab.

Exacto yair, deberias haber comenzado por matrices, que son, como modificarlas, etc
Que es un archivo m ? que es M ?
Control de flujo como switch, for, do..while, etc
Como ingresar una entrada, casos para evitar una mala entrada por parte del usuario, ej que sea un string y vos esperas un numero
Todo esto parece basico pero si haces un tutorial deberia ir.

si tienes razón pero lo quería hacer a mi manera, en el mio lo único tedioso son las entradas y me faltaría añadir una condición para que cuando det(A)=0 terminara el programa en cada caso

Sabes que es lo mas lindo es que si supieras matlab programar lo hubieras realizado con 2 for + 1 variable a las entradas. y creo que requiere un for mas para lo demás, generando un vector como salida con todos los resultados.
Lamentablemente no tengo MATLAB instalado para probarlo.

Yo creo que soy de las personas que piensa que para hacer un tutorial, un manual o enseñar debe saber MUY BIEN de lo que esta hablando. Pero DEMASIADO bien. Por eso mismo yo por ahí cuando quiero hacer un tutorial y tengo unas dudas de algo me voy para atrás. Por que no estoy satisfecho con lo que se y puedo expresar.
Otra de las cosas que uno debe tener para enseñar (que es el objetivo del tutorial) es expresarse lo mejor posible. Explicando con el mayor detalle todo y sin irse de tema. Asi el lector no le falta ninguna información y le es fácil de entender.