2017-10-21 2 views
0

Je 3 matrice:Scilab multiplication matricielle symbolique

T_01 = ['cosd*t1', '-sind*t1', '0', 'd1*cosd*t1'; 'sind*t1', 'cosd*t1', '0', 'd1*sind*t1'; '0', '1', '1', '0'; '0', '0', '0', '1'] 

T_12 = ['cosd*t2', '-sind*t2', '0', 'd2*cosd*t2'; 'sind*t2', 'cosd*t2', '0', 'd2*sind*t2'; '0', '1', '1', '0'; '0', '0', '0', '1'] 

T_23 = ['cosd*t3', '-sind*t3', '0', 'd3*cosd*t3'; 'sind*t3', 'cosd*t3', '0', 'd3*sind*t3'; '0', '1', '1', '0'; '0', '0', '0', '1'] 

je dois faire une multiplication symbolique, donc je suis en train:

mulf(T_01,T_12,T_23) 

mais je reçois cette erreur:

     !--error 39 
mulf: Quantidade incorreta de argumentos de entrada: esperava-se 2. 

Que se passe-t-il?

Obs .: Désolé pour mon anglais.

+0

La fonction '' mulf'' prend seulement 2 arguments. Puisque les multiplications sont associatives, c'est-à-dire a * b * c = a * (b * c), vous pouvez essayer '' mulf (T_01, mulf (T_12, T_23)) ''. Là encore, vous aurez une autre erreur, car une matrice ne peut pas être une entrée de cette fonction. Que veux-tu faire exactement? Pouvez-vous clarifier? Peut-être pouvez-vous nous dire quel est le résultat que vous attendiez. – luispauloml

Répondre

0

Si vous voulez obtenir la multiplication symbolique de deux matrices, vous devrez implémenter une telle fonction. Ici, j'ai implémenté trois fonctions qui ensemble peuvent réaliser ce que vous voulez:

function s = scaProd(a,b) 
    //escalar product of two vectors 
    //using recursion 

    if (a == [] | b == []) then 
     s = "" 

    elseif (max(size(a)) ~= max(size(b))) | ... 
      (min(size(a)) ~= min(size(b))) | ... 
      (min(size(a)) ~= 1) then 
     error("vectorMulf: Wrong dimensions") 

    else 
     s = addf(mulf(a(1), b(1)) , scaProd(a(2:$), b(2:$))) 

    end 
endfunction 

function s = matrixMulf(a,b) 
    //matrix multiplication 

    acols = size(a,'c'); 
    brows = size(b,'r'); 
    if acols ~= brows then 
     error("matrixMulf: Wrong dimensions") 
    end 

    arows = size(a,'r'); 
    bcols = size(b,'c'); 
    s = string(zeros(arows,bcols)); 

    for i = 1 : arows 
     for j = 1 : bcols 
      s(i,j) = scaProd(a(i,:),b(:,j)'); 
     end 
    end 
endfunction 

function s = addP(a) 
    //encolses each element of a in a pair of parenthesis 
    s = string(zeros(a)); 

    for i = 1 : size(a,'r') 
     for j = 1 : size(a,'c') 
      s(i,j) = "(" + a(i,j) + ")" 
     end 
    end 
endfunction 

Voici un exemple de sa sortie. Code d'essai:

A = [1 2; 3 4]; 
B = [5 6; 7 8]; 
C = [9 0; 1 2]; 
disp(A*B*C) 
As = string(A); 
Bs = string(B); 
Cs = string(C); 
disp(matrixMulf(As,addP(matrixMulf(Bs, Cs)))) 

Sortie de la console:

193. 44. 
    437. 100. 

!1*(5*9+6*1)+2*(7*9+8*1) 1*(5*0+6*2)+2*(7*0+8*2) ! 
!             ! 
!3*(5*9+6*1)+4*(7*9+8*1) 3*(5*0+6*2)+4*(7*0+8*2) ! 

Pour le résultat que vous voulez, vous devez faire:

  1. Enclose chaque terme de chacune de vos matrices avec parenthèses en utilisant addP()
  2. Effectuer la multiplication symbolique comme matrixMulf(t1,addP(matrixMulf(t2,t3))), où t1, t2, t3 sont les versions jointes de vos matrices.

Et deux notes finales:

  • Il est important d'utiliser addP à chaque étape de multiplication pour obtenir le résultat correct. Vous pouvez vérifier cela en supprimant les ( et ) dans l'exemple que j'ai donné: le résultat ne sera pas correct. Les fonctions mulf et addf ne sont pas disponibles sur Scilab 6.0.0. N'oubliez pas que vous ne pourrez pas les utiliser si vous mettez à niveau votre Scilab vers la version stable actuelle.