Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
mitrax

[Matlab] Calcular ocorrencia de estados

Recommended Posts

mitrax

Muito boa tarde a todos.

Estou a desenvolver um algoritmo em linguagem Matlab para calcular a fiabilidade de uma linha de uma linha de montagem. A ideia é, utilizando o método de monte-carlo, fazer uma amostragem de estados para os componentes dessa linha (0 significa que o componente se encontra avariado e 1 significa que se encontra a funcionar).

Posto isto, eu fiz a implementação do modelo referido tendo neste momento uma matriz com vários cenários possíveis, por exemplo imaginando que teríamos 3 componentes:

1 1 1

1 0 1

1 1 1

0 0 1

1 1 1

0 1 1

1 1 1

A 1ª coluna representa o 1º componente a 2ª o 2º e por aí adiante, já as linhas representa cada uma o estado simulado para o sistema. Agora o que eu pretenderia fazer era seleccionar o estado com maior numero de ocorrências que, neste caso, seria o estado 1 1 1 que tem uma ocorrência de aproximadamente 57%.

Alguém me poderá uma ajuda neste ultimo passo?

Obrigado

Share this post


Link to post
Share on other sites
pedrosorio

Se queres calcular a probabilidade de ocorrer 1 1 1, basta-te fazer um ciclo a percorrer as linhas e contar quantas são [1 1 1], dividindo depois pelo número total de linhas, embora isto não seja particularmente eficiente (é muito mais rápido ir contando os estados [1 1 1] à medida que são gerados) provavelmente existe uma função que dada a matriz encontra as linhas com os valores pretendidos.


Não respondo a dúvidas por mensagem.

Share this post


Link to post
Share on other sites
mitrax

Boa noite Pedro.

Antes demais gostaria de te agradecer pela atenção dispensada com o meu problema.

No meu caso concreto tenho a necessidade de calcular a probabilidade de ocorrência de todos os estados do sistema e só depois escolher o que tem maior ocorrência. De facto já tinha pensado em algo semelhante com o que propuseste mas se pensar-mos num sistema com, por exemplo, 30 componentes e onde a amostragem terá que ser bastante grande parece-me ineficiente....

Share this post


Link to post
Share on other sites
pedrosorio

Boa noite Pedro.

Antes demais gostaria de te agradecer pela atenção dispensada com o meu problema.

No meu caso concreto tenho a necessidade de calcular a probabilidade de ocorrência de todos os estados do sistema e só depois escolher o que tem maior ocorrência. De facto já tinha pensado em algo semelhante com o que propuseste mas se pensar-mos num sistema com, por exemplo, 30 componentes e onde a amostragem terá que ser bastante grande parece-me ineficiente....

E é, de facto. Se estás a usar o método de Monte Carlo não é suposto guardares as amostras que estás a gerar, mas apenas contar o número de ocorrências de cada caso (à medida que são gerados) e estimar a probabilidade desses casos a partir das contagens.

Neste caso, tens 8 estados possíveis (3 variáveis a valer 0/1 pelo que percebi). Basta-te ter um vector com 8 posições inicializado a zeros e aumentar a posição correspondente a cada estado de cada vez que ele for gerado pelo método. A probabilidade estimada por Monte Carlo corresponde, como já sabes, ao número de contagens de um estado a dividir pelo número de contagens total.

Como cada estado (i.e. 3 valores) tem que corresponder a um número (i.e. tens o estado 1, estado 2, etc.) a maneira mais simples neste caso parece-me ser usar a representação binária do estado que tens e somar-lhe um. Assim, se tiveres o estado [1 0 1], por exemplo, este corresponderia ao estado 6 (tem que se somar 1 para que o estado [0 0 0] seja o estado 1, já que os índices dos arrays em matlab começam por 1).


Não respondo a dúvidas por mensagem.

Share this post


Link to post
Share on other sites
mitrax

Por enquanto tenho o problema resolvido. Já agora estou com uma outra duvida, neste codigo:

for a=2:length(top(:,1))

    for aa=1:linha_aux

        if isequal(top(a,:thumbsup: ,top_final(linha_aux,:) )==0

            linha_aux=linha_aux+1;

            top_final(linha_aux,:) =top(a,:) ;

        elseif isequal(top(a,:) ,top_final(linha_aux,:) )==1

            return

        end

    end

end

A ideia do return será quando ocorrer a condição do elseif o algoritmo saltar fora do segundo FOR, mas pelo que tenho verificado ele salta fora dos dois FOR's. Como poderei resolver isto? Break e continue também não resulta.

Obrigado pela preciosa ajuda.  :)

Share this post


Link to post
Share on other sites
mitrax

Boa tarde Pedro.

O que eu estou a pretender fazer é o seguinte: Tenho a matriz top que está representada num dos ficheiros que anexei e gostaria de colocar na matriz top_final (também colocada no anexo) os estados pela ordem de saída mas anulando os repetidos.

O meu problema neste momento é aquele vector que aparece na 3ª linha, pois mesmo utilizando matrizes de maior dimensão após a alteração de estado aparece sempre, na matriz top_final, a linha toda com 1's.

O código que estou a utilizar, é o seguinte:

top_final=top(1,;
linha_aux=1;
for a=2:length(top(:,1))
    for aa=1:length(top_final(:,1)) 
        if isequal(top(a,,top_final(linha_aux,)==0 && aa==length(top_final(:,1))
                linha_aux=linha_aux+1
                top_final(linha_aux,=top(a,
        elseif isequal(top(a,,top_final(linha_aux,)==0 && aa<length(top_final(:,1))                
                continue              
        elseif isequal(top(a,,top_final(linha_aux,)==1
            break
        end
    end
end

Possivelmente é uma coisa bastante simples mas já tentei bastantes alternativas e não estou a dar com o erro.

As matrizes:

http://www.4shared.com/document/l3bdQzZw/top.html

http://www.4shared.com/document/EDAeXVJ4/top_final.html

Share this post


Link to post
Share on other sites
mitrax

Boa tarde,

Vi actualizar o tópico pois já tenho o problema resolvido. Muito obrigado pela ajuda!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.