function AngInversa=inversa(pfinal,manip_B);% Funçao para obtençao dos angulos
                                            %       LEITURA DE DADOS
n_elos=size(manip_B,1);                     % E necessario saber o numero de elos
AncaX=pfinal(1);                            % Deslocamento pretendido da anca em x  
AncaY=pfinal(2);                            % Deslocamento pretendido da anca em y
AncaZ=pfinal(3);                            % Altura pretendida para a anca
PeY=pfinal(4);                              % Deslocamento pretendido do 2ºpe em x
PeZ=pfinal(5);                              % Altura pretendida para o 2ºpe
syms O1 O2 O3 O4 O5;                        % Criaçao de simbolicos
Alteracoes=[    0                           %       (posicionamento inicial)
                O1                          % J1- tornozelo direito inclinar ao lado
                -O2-O3                      % J2- tornozelo direito inclinar a frente
                O2                          % J3- joelho direito
                O3                          % J4- anca (lado direito) inclinar a frente
                O1                          % J5- anca (lado direito) inclinar ao lado
                0                           %       (passo intermedio)
                0                           % J6- rotaçao da perna direita
                0                           %       (ponto medio)
                0                           % J7- rotaçao da perna esquerda
                0                           %       (passo intermedio)
                O1                          % J8- anca (lado esquerdo) inclinar ao lado
                O4                          % J9- anca (lado esquerdo) inclinar a frente
                O5                          % J10- joelho esquerdo
                -O5-O4                      % J11- tornozelo esquerdo inclinar a frente
                O1                          % J12- tornozelo esquerdo inclinar ao lado
                0];                         %       (posicionamento do pe esquerdo)
                                            %
                                            %       CALCULO DAS JUNTAS..COM SIMBOLICOS
Ref=eye(4,4);                               % Referencial de origem
for i=1:n_elos;                             % Determino DH para todos os elos (i->numero do elo)
    theta=manip_B(i,1)+Alteracoes(i);       % 
    alfa=manip_B(i,2);                      % 
    CosAlfa=cos(alfa);                      % forma arcaica de evitar problemas devido
	if abs(CosAlfa)<1e-15;                  % aos "comboios" de numeros...quando alfa= +-90º
        CosAlfa=0;                          % o MatLab estava a dar cos(90º)=6e-17
    end;                                    % 
    l=manip_B(i,3);                         % 
	d=manip_B(i,4);                         %   
    DH(1,1,i)=cos(theta);                   %   matriz Denavit-Hartenberg para cada linha
  	DH(1,2,i)=-sin(theta)*CosAlfa;          %   
   	DH(1,3,i)=sin(theta)*sin(alfa);         %  
   	DH(1,4,i)=l*cos(theta);                 %  
   	DH(2,1,i)=sin(theta);                   %  
   	DH(2,2,i)=cos(theta)*CosAlfa;           %  
   	DH(2,3,i)=-cos(theta)*sin(alfa);        %  
    DH(2,4,i)=l*sin(theta);                 %  
    DH(3,1,i)=0;                            %  
   	DH(3,2,i)=sin(alfa);                    %  
    DH(3,3,i)=CosAlfa;                      %  
   	DH(3,4,i)=d;                            %  
   	DH(4,1,i)=0;                            %  
   	DH(4,2,i)=0;                            %  
    DH(4,3,i)=0;                            %  
    DH(4,4,i)=1;                            %  
   	Ref=Ref*DH(:,:,i);                      % aplico DH a R e obtenho "novo referencial" (a frente da anterior)
    if i==8;                                % ponto central da anca (necessario guarda-lo)
        PosA=Ref(:,4);                      % esta e a posiçao que vai ser restringida
    end;                                    %
end;                                        %
PosP=Ref(:,4);                              % esta e a posiçao final... do pe esquerdo
                                            %
%   ANCA                                    %
O1=subs(atan(-AncaX/AncaZ));                % calculo simples de O1
stringAY=strcat(char(subs(simple(PosA(2)))),'=',int2str(-AncaY));   %texto para o "solve" 
stringAZ=strcat(char(subs(simple(PosA(3)))),'=',int2str(AncaZ));    %texto para o "solve"
[O2,O3]=solve(stringAY,stringAZ);           % determinaçao dos angulos de junta em funçao da posiçao pretendida
redundancia1=max(size(O2));                 % grau de redundancia
if redundancia1==1;                         % 1- nao existe este problema
    O2=subs(O2);                            %       O2 e O3 sao a soluçao unica
    O3=subs(O3);                            %
end;                                        %
if redundancia1==2;                         % 2- que e a maioria dos casos
    T21=subs(O2(1));                        %
    T22=subs(O2(2));                        %
    if T21<T22;                             % escolho a solucao menor de O2
        O2=subs(O2(1));                     %   substituo por valor numerico e nao string
        indice=1;                           %   e guardo indice
    else;                                   %
        O2=subs(O2(2));                     %
        indice=2;                           %
    end;                                    %
    O3=subs(O3(indice));                    % obtenho O3 pelo indice guardado antes
end;                                        %
                                            %
%   PE ESQUERDO                             %
stringPY=strcat(char(eval(subs(simple(PosP(2)))+PeY)),'=0');    %texto para o "solve" 
stringPZ=strcat(char(eval(subs(simple(PosP(3)))-PeZ)),'=0');    %texto para o "solve" 
[O4,O5]=solve(stringPY,stringPZ);           % determinaçao dos angulos de junta em funçao da posiçao pretendida
redundancia2=max(size(O5));                 % grau de redundancia
if redundancia2==1;                         % 1- nao existe este problema
    O5=subs(O5);                            %       O4 e O5 sao a soluçao unica
    O4=subs(O4);                            % 
end;                                        % 
if redundancia2==2;                         % 2- que e a maioria dos casos
    T51=subs(O5(1));                        %   
    T52=subs(O5(2));                        % 
    if T51<T52;                             % escolho a solucao menor de O5
        O5=subs(O5(1));                     %   substituo por valor numerico e nao string
        indice=1;                           %   e guardo indice
    else;                                   % 
        O5=subs(O5(2));                     % 
        indice=2;                           % 
    end;                                    % 
        O4=subs(O4(indice));                % obtenho O4 pelo indice guardado antes
end;                                        % 
                                            % 
%		        theta/z                     % determino as alteraçoes/variaçoes no manip_B
AngInversa=[    0                           %       (posicionamento inicial)
                O1                          % J1- tornozelo direito inclinar ao lado
                -O2-O3                      % J2- tornozelo direito inclinar a frente
                O2                          % J3- joelho direito
                O3                          % J4- anca (lado direito) inclinar a frente
                O1                          % J5- anca (lado direito) inclinar ao lado
                0                           %       (passo intermedio)
                0                           % J6- rotaçao da perna direita (introduzida directamente)
                0                           %       (ponto medio)
                0                           % J7- rotaçao da perna esquerda (introduzida directamente)
                0                           %       (passo intermedio)
                O1                          % J8- anca (lado esquerdo) inclinar ao lado
                O4                          % J9- anca (lado esquerdo) inclinar a frente
                O5                          % J10- joelho esquerdo
                -O5-O4                      % J11- tornozelo esquerdo inclinar a frente
                O1                          % J12- tornozelo esquerdo inclinar ao lado
                0];                         %       (posicionamento do pe esquerdo)
 AngInversa=AngInversa*360/2/pi;            % Para o valor de saida ser em graus