Harzeus Posted March 25, 2012 at 06:03 PM Report #445597 Posted March 25, 2012 at 06:03 PM Boas! O problema é o seguinte: é suposto fazer 3 graficos em matlab de ondas sinusoidais, no qual se tem que fazer a onda normal (vs), meia onda (vmo) e onda completa (voc). O problema está na realização da meia onda, em que na minha opinião terá que ser feita através de condições, mas não consigo lá chegar pois as minhas bases de matlab são muito reduzidas. Agradecia algumas ajudas da vossa parte. Deixo em baixo os dados e o que já tenho feito. % Dados % vef=15; f=80; dt=0.01/50; w=2*pi*80; vm=15*sqrt(2); % Tempo espaçado t=0 : dt : 0.03; % Onda % vs=vm*sin(180*pi*t); % Meia Onda % (é aqui que está o problema)!!! - basicamente o que preciso fazer é passar a parte negativa da onda vs para zero. % Onda Completa % voc=abs(vs); % Graficos % plot(t, vs); grid on plot(t, vmo); grid on plot(t, voc); grid on
pedrosorio Posted March 25, 2012 at 06:21 PM Report #445600 Posted March 25, 2012 at 06:21 PM Há várias coisas que te podem ajudar a resolver o teu problema. Quando tens um array em matlab e realizas uma operação lógica, ele devolve-te um array com 1's nos elementos que respeitam a condição, e 0 nos que não respeitam. Por exemplo: v = [3 4 5 2 2 3 2]; x = (v == 2); O array x fica [0 0 0 1 1 0 1]. Um aspecto interessante disto é que podes usar estes arrays lógicos para aceder e alterar outros arrays, já que quando usas um array lógico como índice de outro array, ele só devolve/altera os elementos que no array lógico valem 1. Por exemplo: v(x) = [0 100 200]; Faz com que v passe a ser [3 4 5 0 100 3 200]. Repara que o número de elementos no array que foi atribuído ([0 100 200]) tem que ser igual ao número de elementos iguais a 1 no array x. Um truque interessante é que se quiseres fazer com que todos os elementos sejam iguais a um determinado valor, não precisas de usar um array. Por exemplo: v(v==3) = 10; Faz com que v passe a ser [10 4 5 0 100 10 200]. Estás a ver como é que podes utilizar isto para obter a tua meia onda? Não respondo a dúvidas por mensagem.
Harzeus Posted March 25, 2012 at 07:38 PM Author Report #445611 Posted March 25, 2012 at 07:38 PM Estive a tentar com o teu codigo e até agora ainda não consegui defenir as variaveis de modo a tornar os valores negativos de vs em zero... o meu grande problema é não ter as bases de programação, e talvez esteja a complicar demasiado. Ao utilizar este metodo tenho que defenir os intervalos negativos e utilizar o teu metodo certo?
pedrosorio Posted March 25, 2012 at 07:45 PM Report #445613 Posted March 25, 2012 at 07:45 PM A definição de meia onda é essa, portanto o teu array vmo tem que ser igual ao vs, com a excepção de que todos os números menores que 0 passam a ser 0. Percebeste o que expliquei no meu post anterior? Se não, que partes é que não percebeste? P.S.: Não precisas de responder se não quiseres, mas... porque é que estás a fazer um projecto em matlab sem bases de programação? Não respondo a dúvidas por mensagem.
Harzeus Posted March 25, 2012 at 07:52 PM Author Report #445615 Posted March 25, 2012 at 07:52 PM Para responder a tua pergunta... estou no mesmo curso que tu e deixei programação para fazer. Agora no 2ºano do curso existem cadeiras em que é preciso saber programar em matlab, e estou a ter programação novamente, mas ainda não cheguei ao ponto onde se aprende estas coisas. Ou seja, vou andar sempre em desvantagem no que diz respeito a esta cadeira. Quanto ao codigo que forneces-te, vou ver se consigo resolver dessa forma e assim que poder digo alguma coisa.
pedrosorio Posted March 25, 2012 at 08:01 PM Report #445617 Posted March 25, 2012 at 08:01 PM estou no mesmo curso que tu Nice! (Eu acabei o ano passado, em que universidade?) mas ainda não cheguei ao ponto onde se aprende estas coisas O paradigma de programação em Matlab é fundamentalmente diferente da programação em linguagens generalistas porque assenta muito nos conceitos de matrizes e vectores, e consegues efectuar operações sobre vectores inteiros sem ter que usar ciclos (que foi o que fiz no meu exemplo). Quanto ao codigo que forneces-te, vou ver se consigo resolver dessa forma e assim que poder digo alguma coisa. Aconselho-te a experimentar o meu código em vectores desenhados por ti, com pequenas variações para perceberes como funciona (o que é fácil porque podes usar a linha de comandos do matlab para fazer experiências e ver os resultados diretamente), e quando entenderes bem, tentar resolver o teu problema. Alguma dúvida na razão na forma como funcionam os exemplos de código que apresentei, ou nas tuas experiências, não hesites em perguntar. Não respondo a dúvidas por mensagem.
Harzeus Posted March 25, 2012 at 10:48 PM Author Report #445651 Posted March 25, 2012 at 10:48 PM Bem, após algum tempo cheguei a isto e o grafico é o que eu quero! Apenas gostava de saber o seguinte: o que fiz está correcto? % Meia Onda % vmo=[vs]; x=(vmo==0) vmo(x)=[0]; vmo(vmo<0)=0
pedrosorio Posted March 25, 2012 at 11:43 PM Report #445657 Posted March 25, 2012 at 11:43 PM Faz aquilo que queres sim, mas repara que não precisas de colocar os valores que são 0 a 0 porque... já são zero 😄 A versão "curta" seria: vmo = vs; vmo(vmo < 0) = 0; Repara que não precisas daqueles [ ] à volta dos arrays. Eles só têm utilidade quando estás a construir um array a partir de outros arrays, ou de números. Não respondo a dúvidas por mensagem.
Harzeus Posted March 26, 2012 at 12:06 AM Author Report #445663 Posted March 26, 2012 at 12:06 AM Sim faz sentido xD!!! Muito obrigado pela tua ajuda. Foi sem duvida fundamental para a realização deste trabalho. Tudo a correr bem e obrigado.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now