Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

mitrax

[Matlab] Calcular ocorrencia de estados

Mensagens Recomendadas

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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....

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.  :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.