IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

Résoudre un système d’équations symboliques


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 17
    Points : 10
    Points
    10
    Par défaut Résoudre un système d’équations symboliques
    Bonjour,

    Je découvre un peu le symbolique dans Matlab.
    Je m'y suis mis car je dois résoudre un système d'équations assez lourd s'il devait être résolus à la main...

    Pour résumer, j'ai une matrice A qui est composée des variables symboliques E1, E2, G12, nu12 (les variables de mon système):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    syms E1 E2 G12 nu12; 
     
    A = [   G12 - (E1*sigma)/2 - (E2*sigma)/2 - E2*nu12*sigma, - G12 - (E1*sigma)/2 - (E2*sigma)/2 - E2*nu12*sigma,                                     0]
    [ - G12 - (E1*sigma)/2 - (E2*sigma)/2 - E2*nu12*sigma,   G12 - (E1*sigma)/2 - (E2*sigma)/2 - E2*nu12*sigma,                                     0]
    [                                                   0,                                                   0, 2*E2*nu12*sigma - E2*sigma - E1*sigma]
    Je souhaite trouver une solution numérique aux variables déclarées ci-dessus (E1, E2, G12, nu12) dans le cas suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    NL1 = sym(1000);
    NL2 = sym(1000);
    j11 = sym(0.000001);
    j21 = sym(0.000001);
    j12 = sym(0.000001);
    j22 = sym(0.000001);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [a b c d] = solve('A11*j11 + A12*j21 - NL1', ...
                 'A12*j11 + A22*j21', ...
                 'A22*j12 + A12*j22 - NL2', ...
                 'A12*j12 + A11*j22')
    Où les Aij sont les valeurs de la matrice A ci-dessus.

    Ce qui me retourne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    a = -(A22*NL1)/(A12^2 - A11*A22)
    b = -(A11*NL2)/(A12^2 - A11*A22)
    c = (A12*NL1)/(A12^2 - A11*A22)
    d = (A12*NL2)/(A12^2 - A11*A22)
    En gros, il résout en considérant que les jij sont les variables. Donc je rajoute les variables à considérer à la fonctions solve(eq1, eq2, ..., eqn, var1, var2, ..., varn) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    solu = solve('A11*j11 + A12*j21 - NL1', ...
                 'A12*j11 + A22*j21', ...
                 'A22*j12 + A12*j22 - NL2', ...
                 'A12*j12 + A11*j22', ...
                 E1,E2,nu12,G12)
    Retour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Warning: Explicit solution could not be found. 
    solu = [ empty sym ]
    Ma question est donc: Comment remplacer les Aij par leur "contenu" composé de E1, E2, G12, nu12?


    Merci beaucoup si vous êtes arrivé jusqu'au bout!

    Max

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Plutôt que d'utiliser des variable Nomij, utilise des tableaux Nom(i,j).

    Et fait attention que les chaines de caractères que tu rentres dans la fonction solve n'ont rien à voir avec les variables sym que tu utilises en dehors. Utilise ces variables directement sans chaine de caractères.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    Ce qui est bizarre, c'est que si je substitue les Aij par les composantes de la matrice, le retour reste le même:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    solu = solve('A(1,1)*j11 + A(1,2)*j21 - NL1', ...
                 'A(1,2)*j11 + A(2,2)*j21', ...
                 'A(2,2)*j12 + A(1,2)*j22 - NL2', ...
                 'A(1,2)*j12 + A(1,1)*j22', ...
                 E1,E2,nu12,G12)
    Retour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Warning: Explicit solution could not be found. 
    solu = [ empty sym ]
    J'ai pourtant bien 4 équations/4 inconnues...
    Si je vérifie le contenu des 4 équations du système, je n'ai bien que 4 inconnues et des valeurs numériques, donc je devrais pouvoir trouver une solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Equ1 : (27*G12)/40000000 - (13*E1)/(80000000*((E2*nu12^2)/E1 - 1)) - (93*E2)/(80000000*((E2*nu12^2)/E1 - 1)) - (7*E2*nu12)/(8000000*((E2*nu12^2)/E1 - 1)) - 1000
     
    Equ2 : - (27*G12)/40000000 - (39*E1)/(80000000*((E2*nu12^2)/E1 - 1)) - (31*E2)/(80000000*((E2*nu12^2)/E1 - 1)) - (53*E2*nu12)/(40000000*((E2*nu12^2)/E1 - 1))
     
    Equ3 : - (25500779007496083*G12)/18889465931478580854784 - (36834458566383231*E1)/(37778931862957161709568*((E2*nu12^2)/E1 - 1)) - (29278672193791799*E2)/(37778931862957161709568*((E2*nu12^2)/E1 - 1)) - (50057084718418237*E2*nu12)/(18889465931478580854784*((E2*nu12^2)/E1 - 1)) - 500
     
    Equ4 : (25500779007496083*G12)/18889465931478580854784 - (12278152855461077*E1)/(37778931862957161709568*((E2*nu12^2)/E1 - 1)) - (87836016581375397*E2)/(37778931862957161709568*((E2*nu12^2)/E1 - 1)) - (33056565380087515*E2*nu12)/(18889465931478580854784*((E2*nu12^2)/E1 - 1))
    Quelqu'un a une idée d'où ca peut venir?

    Merci bp!

    Max

    NB: j'ai changé les valeurs des autres paramètres car tel qu'ils étaient définis, c'était un cas particulier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    NL1 = (1000);
    NL2 = (500);
    j11 = (0.000001);
    j21 = (0.0000001);
    j12 = (0.0000002);
    j22 = (0.000002);

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Et fait attention que les chaines de caractères que tu rentres dans la fonction solve n'ont rien à voir avec les variables sym que tu utilises en dehors. Utilise ces variables directement sans chaine de caractères.
    Citation Envoyé par maxroucool Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    solu = solve('A(1,1)*j11 + A(1,2)*j21 - NL1', ...
                 'A(1,2)*j11 + A(2,2)*j21', ...
                 'A(2,2)*j12 + A(1,2)*j22 - NL2', ...
                 'A(1,2)*j12 + A(1,1)*j22', ...
                  E1,E2,nu12,G12)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    solu = solve(A(1,1)*j11 + A(1,2)*j21 - NL1, ...
                 A(1,2)*j11 + A(2,2)*j21, ...
                 A(2,2)*j12 + A(1,2)*j22 - NL2, ...
                 A(1,2)*j12 + A(1,1)*j22, ...
                 E1,E2,nu12,G12)

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    Salut Jérôme,

    Merci pour tes réponses. J'avais répondu avant de lire ta réponse...
    Du coup, si j’applique ce que tu m'a dis, j'ai bien une solution, mais que je comprends pas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >> [solu.E1 solu.E2 solu.G12 solu.nu12]
     
    ans =
     
    [ (961*z1)/169, z1,  z, -31/13]
    [            0, z1,  z,      0]
    [            0,  0, z1,      z]
    C'est quoi ces z et z1? Je n'ai jamais déclaré de telles variables...

  6. #6
    Invité
    Invité(e)
    Par défaut
    Aurais-tu le code complet utilisé ? Je n'arrive pas à voir comment tu obtiens tes coefficients devant G12 dans tes équations

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    Voici le code.

    C'est de la mécanique et c'est basé sur la théorie des laminés. Le but est d'exploiter des résultats d'essais de traction sur des éprouvettes en composite.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    % Liste des plis de l'éprouvette 
    % [orientation (en °), ep (en mm)]
    plis = sym([-60 1; 60 1; 60 1; -60 1]);
    plis(:,1) = plis(:,1).*pi/180;
     
     
    syms E1 E2 G12 nu12 nu21;                           % Propriétés mécaniques du pli
    syms Q11 Q12 Q22 Q66;                               % Matrice de rigité du pli dans le repere ortho
    syms Q11L Q12L Q22L Q66L;                           % Matrice de rigité du pli dans le repere du laminé
    syms A11 A12 A22 A66 D11 D12 D16 D22 D26 D66;       % Matrice ABD du laminé
     
    nu21 = nu12 * E2/E1;
     
    Q11 = E1/(1-nu12*nu21);
    Q12 = nu21*E1/(1-nu12*nu21);
    Q22 = E2/(1-nu12*nu21);
    Q66 = G12; 
     
    Qpli = [    Q11     Q12     0;
                Q12     Q22     0;
                0       0       Q66];
     
    ATemp = zeros(3,3);
    % Génération de la partie Aij de matrice de rigité du laminé
    for i=1:size(plis,1)
     
        ALam = ATemp + CdB(Qpli, plis(i,1)).*plis(i,2);
        ATemp = ALam;
     
    end
    clear ATemp
     
    subexpr(ALam)
     
    % Hypothèses d'essai:
    % 1er essai de traction dans le sens 1
    %  - Effort de traction NL1
    %  - 2 jauges dir 1 et 2 : j11 et j21
    % 2eme essai de traction dans le sens 2
    %  - Effort de traction NL2
    %  - 2 jauges dir 1 et 2 : j12 et j22
     
    % Système 1 :
    % { NL1 = A11 j11 + A12 j21
    % {   0 = A12 j11 + A22 j21
    % Système 2 :
    % { NL2 = A22 j12 + A12 j22
    % {   0 = A12 j12 + A11 j22
    % ==> 4 equations / 4 inconnus (E1, E2, nu12, G12)
     
    NL1 = (1000);
    NL2 = (500);
    j11 = (0.000001);
    j21 = (0.0000001);
    j12 = (0.0000002);
    j22 = (0.000002);
     
    solu = solve(ALam(1,1)*j11 + ALam(1,2)*j21 - NL1, ...
                 ALam(1,2)*j11 + ALam(2,2)*j21, ...
                 ALam(2,2)*j12 + ALam(1,2)*j22 - NL2, ...
                 ALam(1,2)*j12 + ALam(1,1)*j22, ...
                 E1, E2, G12, nu12)
    et la fonction CdB (changement de base):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    function Qlam = CdB(Qpli, theta)
     
    % Cette fonction calcul la matrice de raideur Q d'un pli dans le repère du
    % laminé :
    % Qlam = Qpli(theta)
     
    Q11 = Qpli(1,1);
    Q12 = Qpli(1,2);
    Q22 = Qpli(2,2);
    Q66 = Qpli(3,3);
     
    t = theta;
     
    Q11L = Q11*cos(t)^4 + Q22*sin(t)^4 + 2*(Q12+Q66)*sin(t)^2*cos(t)^2;
    Q12L = (cos(t)^4+sin(t)^4)*Q12 + (Q11+Q22-2*Q66)*sin(t)^2*cos(t)^2;
    Q16L = (Q11-Q12-Q66)*sqrt(2)*sin(t)*cos(t)^3 + (Q12-Q22+Q66)*sqrt(2)*cos(t)*sin(t)^3;
    Q22L = Q22*cos(t)^4 + Q11*sin(t)^4 + 2*(Q12+Q66)*sin(t)^2*cos(t)^2;
    Q26L = (Q11-Q12-Q66)*sqrt(2)*sin(t)^3*cos(t) + (Q12-Q22+Q66)*sqrt(2)*cos(t)^3*sin(t);
    Q66L = (cos(t)^4+sin(t)^4)*Q66 + (Q11+Q22-2*Q12-Q66)*2*sin(t)^2*cos(t)^2;
     
    Qlam = [    Q11L    Q12L    Q16L;
                Q12L    Q22L    Q26L;
                Q16L    Q26L    Q66L];
    Merci bp!

    Max

  8. #8
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    salut

    plutot que de déclarer tes constantes avant les calculs sous cette forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    NL1 = (1000);
    NL2 = (500);
    j11 = (0.000001);
    j21 = (0.0000001);
    j12 = (0.0000002);
    j22 = (0.000002);
    fais tes calculs puis substitue leur valeur à ces variables symboliques :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    solu = subs(solu,[NL2,j11,j21,j12,j22],[500;1e-6;1e-7;2e-7;2e-6])
    Citation Envoyé par Winjerome Voir le message
    Plutôt que d'utiliser des variable Nomij, utilise des tableaux Nom(i,j).
    réponse pertinente
    Utilisation conseillée pour la déclaration de tableau de variables symboliques:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>j = sym('j',[2,2])
     
    j =
     
    [ j1_1, j1_2]
    [ j2_1, j2_2]

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    Salut Fab,

    J'ai rajouté avant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    syms NL1 NL2 j11 j12 j21 j22;
    et après

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    solu = subs(solu,[NL1,NL2,j11,j21,j12,j22],[1000;500;1e-6;1e-7;2e-7;2e-6])
    ce qui me génère une erreur que je ne comprends pas trop...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ??? Error using ==> sym.sym>tomupad at 2162
    Conversion to 'sym' from 'struct' is not possible.
     
    Error in ==> sym.sym>sym.sym at 102
                    S.s = tomupad(x,'');
     
    Error in ==> sym.subs at 66
    if ~isa(F,'sym'), F = sym(F); end
     
    Error in ==> Laminate3 at 97
    solu = subs(solu,[NL1,NL2,j11,j21,j12,j22],[1000;500;1e-6;1e-7;2e-7;2e-6])
    Est-ce que ca te parle?

    Merci bp!

    Max

  10. #10
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    heu non ca ne me parles pas

    un exemple à la con :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >> syms a b c
    >> f = @(x) a*x^2+b*x+c
     
    f = 
        @(x)a*x^2+b*x+c
     
    >> subs(f,[a,b,c],[1;2;3])
     
    ans =
     x^2 + 2*x + 3
    vérifie bien tes variables (pas de structure ??)
    et même si ça n pose pas de pb ici, gaffe à ne pas passer un vecteur ligne (séparateur ",") et colonne (séparateur ";") en argument à subs

Discussions similaires

  1. Réponses: 6
    Dernier message: 08/12/2008, 15h31
  2. Réponses: 7
    Dernier message: 19/05/2008, 13h24
  3. Résoudre un système dans Matlab
    Par nini94 dans le forum MATLAB
    Réponses: 13
    Dernier message: 17/04/2008, 14h07
  4. Réponses: 6
    Dernier message: 18/02/2008, 16h14
  5. Résoudre un système d'équations différentielles
    Par mostafaziad dans le forum MATLAB
    Réponses: 7
    Dernier message: 06/07/2007, 09h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo