View Full Version : MATLAB, grande pincel! [resolvido]


FELiYCORA
25-07-2008, 07:59
Pois é estou a aqui a fazer um trabalho e estou encravado num problema derivado da arquitectura do MATLAB e não consigo dar-lhe a volta.

numa certa função para calcular o máximo de uma função matemática tenho o seguinte código:


while (aux <= dimen)
if ((real(fdd_sub(aux)) < 0) && (imag(fdd_sub(aux)) == 0))
valor=aux;
end
aux = aux+1;
end


sendo fdd_sub = subs(fdd, CL, zeros_deriv)

onde fdd é uma função simbólica segunda derivada da funçao F que se quer calcular o máximo com CL a sua única variável e zeros_deriv o vector com os zeros da derivada função F. fdd_sub será então um vector com os valores de fdd quando o vector zeros_deriv substitui a sua variável.

o que acontece é que me dá este erro na linha do if:

Undefined function or method 'lt' for input arguments of type 'sym'

Pelo que percebi por fdd_sub ser uma variável simbólica (não percebo porquê porque é apenas substituiçao de uma simbolica por numeros ou seja devia deixar de ser simbólica).

de qualquer modo tentei dar a volta a situação usando a função heaviside, em que:

heaviside(real(fdd_sub(aux)) == 0 é equivalente a (real(fdd_sub(aux)) < 0


esse erro deixa de acontecer, mas passa a acontecer outro. é que o heaviside só trabalha com números reais e embora eu esteja a usar a função real, as vezes aparecem números em que o resultado da função real em vez de ser apenas a parte real do número aparece a parte imaginária como 0*i e estraga tudo pois o heaviside reconhece como imaginário na mesma. grande falha do matlab!

qualquer ajuda é benvinda é urgentissimo pois isto nem é o propósito do programa, preciso mesmo de achar máximo de funções e nem sabia que o matlab não tinha essa função incorporada. tenho outra feita para achar máximos mas é por métodos numéricos e não me dá muito jeito dessa forma para este programa.

muito obrigado!

Aircom
25-07-2008, 09:41
Será que não estás a usar um "i" em vez do "I" na função fdd_sub.
Se usarmos o "i" minúsculo no matlab este reconhece-o como sendo imaginário.

Sei que é uma regra básica, mas muitas vezes o ppl esquece-a.
Verifica bem o código da função fdd_sub.


Cumps.

FELiYCORA
25-07-2008, 14:52
os i's vêm dos zeros das derivadas, que são muitas vezes complexos.

é estupido é usar a função real() e ele dar a parte real + 0*i enquanto se usar esta função directamente na janela command já dá apenas a parte real.

tou passado

FELiYCORA
25-07-2008, 15:35
decididamente o MATLAB tá a gozar comigo. tentei um workaround melhor ainda e ele simplesmente inventa qualquer coisa para não funcionar:


while (aux <= dimen)
if (isreal(fdd_sub(aux)) == 1)
heaviside(fdd_sub(aux))
if(heaviside(fdd_sub(aux)) == 0)
valor=aux
end
end
aux = aux+1
end

assim não há margem para erros, pus o heaviside(fdd_sub(aux)) antes do if para ver se funciona bem, acontece que quando é igual a 0 o matlab diz:

ans = 0.

mas NAO ENTRA NO IF!

isto é o demónio, tenho dito!

Desculpem o triple-post mas finalmente descobri. É claro um erro de principiante mas não fazia a mínima ideia que tinha que ser assim:

tive que converter o fdd_sub em double precision com fdd_sub=double(fdd_sub)

resolveu todos os problemas, agora dá de qualquer forma.

obrigado na mesma, fica a ajuda para quem cair no mesmo erro!