1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

MATLAB, grande pincel! [resolvido]

Discussão em 'Programação' iniciada por FELiYCORA, 25 de Julho de 2008. (Respostas: 3; Visualizações: 2541)

  1. FELiYCORA

    FELiYCORA 1st Folding then Sex

    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:

    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:

    Código:
    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!
     
    Última edição: 25 de Julho de 2008
  2. Aircom

    Aircom Power Member

    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.
     
  3. FELiYCORA

    FELiYCORA 1st Folding then Sex

    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
     
  4. FELiYCORA

    FELiYCORA 1st Folding then Sex

    decididamente o MATLAB tá a gozar comigo. tentei um workaround melhor ainda e ele simplesmente inventa qualquer coisa para não funcionar:

    Código:
    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!
     
    Última edição pelo moderador: 25 de Julho de 2008

Partilhar esta Página