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 :

[Symbolic Math Toolbox ] sym et double


Sujet :

MATLAB

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 69
    Points : 34
    Points
    34
    Par défaut [Symbolic Math Toolbox ] sym et double
    Bonjour !

    Je viens d'écrire un programme qui doit me résoudre une équation du type (c'est un example - dans mon programme l'équation est beaucoup plus compliqué et la solution aussi!):

    Y^2+A=0

    Y est l'inconnue et A une constante

    l'equation dans Matlab est donc comme ceci:

    ------
    syms Y;

    for i:1..5


    a=Y^2-A(i);

    solve(a);

    end

    ---------
    La réponse est donc la suivante et n'est pas un double!:

    sqrt(A(i));-sqrt(A(i))

    J'aimerais cependant convertir ces deux solutions en "double" et les mettres dans un vecteur du type

    Racine1(i)=sqrt(A(i))
    Racine2(i)=-sqrt(A(i))

    Quelqu'un saurait-il comment faire?

    Merci d'avance !

    Bonne journée!

    JB

  2. #2
    Expert confirmé
    Avatar de tug83
    Homme Profil pro
    MATLAB Geek !
    Inscrit en
    Juin 2006
    Messages
    1 781
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : MATLAB Geek !
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 781
    Points : 4 039
    Points
    4 039
    Par défaut
    Pour résoudre y²=4, je ferai juste:
    qui retourne
    ans =

    2
    -2
    MATLAB 8.2 (R2013b)

    le blog des MATLAB geeks

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 69
    Points : 34
    Points
    34
    Par défaut
    Oui mais ceci est juste un example!

    J'ai une multitude d'équations à résoudre et c'est pour cela que je veux convertire les solutions de "sym2 en "double"!

    Si j'utilise

    Racine1(i)=double(solve(a));

    il ne peut pas le faire car solve(a) contient deux racines !

    La question est juste de convertir les deux solutions en "double".

    J'espere que j'ai été plus clair !

    Merci d'avance pour votre aide.

    JB

  4. #4
    Expert confirmé
    Avatar de tug83
    Homme Profil pro
    MATLAB Geek !
    Inscrit en
    Juin 2006
    Messages
    1 781
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : MATLAB Geek !
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 781
    Points : 4 039
    Points
    4 039
    Par défaut
    Citation Envoyé par jbollagnier

    J'espere que j'ai été plus clair !
    non!

    donne un code MATLAB en exemple ce sera plus simple
    MATLAB 8.2 (R2013b)

    le blog des MATLAB geeks

  5. #5
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 69
    Points : 34
    Points
    34
    Par défaut
    Ok voici mon programme:
    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
    clear all;
    load stressdata3.mat
     
    % données : v, B0, Frate, E, h, vp, Ep, Strain
     
    z=length(Ep)
     
    A=zeros(z,1);
    B=zeros(z,1);
    C=zeros(z,1);
    D=zeros(z,1);
    e=zeros(z,1);
    Interp=zeros(z,1);
     
     
    Sigma=zeros(z,1);
     
     
    syms Z;
     
    for i=1:z-1
     
        Interp(i)=Ep(i)*(Time(i+1)-Time(i));
     
        A(i)=((v-1)*B0*Frate(i))/(E*2*h)+(vp(i)-1)/Ep(i); 
        B(i)= 2*vp(i)*(1-v)*B0/(Ep(i)*E*2*h);
        C(i)=(1-v)*B0*Strain(i)/2/h/E;
        D(i)=-(1-v)*B0*2*vp(i)/(2*h*E*Interp(i));
        e(i)=-Frate(i);
     
          M(i)=A(i)*(Z+Sigma(i))/2+B(i)*((Z+Sigma(i))/2)^2+(Z-Sigma(i))/(Time(i+1)-Time(i))*C(i)+(Z-Sigma(i))/(Time(i+1)-Time(i))*D(i)*(Time(i+1)-Time(i))*sum(Sigma)+e(i);
     
     
        Sigma(i)=double(Solve(M(i)));
     
     
     
     
    end
    M(i) est l'équation à resoudre et Z est l'inconnue.
    Je veux maintenant avoir les deux solutions de Z dans un vecteur.

    Le programme que je viens de taper me renvoi l'erreur suivante:
    ??? In an assignment A(I) = B, the number of elements in B and
    I must be the same.

    Error in ==> Stressnumcalc at 35
    Sigma(i)=double(Solve(M(i)));
    le probleme provient lors de cette conversion "sym" -> "double"
    et j'aimerais donc savoir comment procéder.

    J'espere que cette dois cela a été plus clair.

    Merci d'avance pour votre réponse!

    JB

  6. #6
    Expert confirmé
    Avatar de tug83
    Homme Profil pro
    MATLAB Geek !
    Inscrit en
    Juin 2006
    Messages
    1 781
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : MATLAB Geek !
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 781
    Points : 4 039
    Points
    4 039
    Par défaut
    en gros c'est une erreur de programmation qui est reproductible en faisant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a(1)=double(solve('y^2=4'))
    et dont la solution est dans notre FAQ
    MATLAB 8.2 (R2013b)

    le blog des MATLAB geeks

  7. #7
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 69
    Points : 34
    Points
    34
    Par défaut
    j'y vois un peu plus clair:

    si je mets racine(i:i+1)=double(solve('y^2=4'))

    j'aurais
    racine(i)=2
    racine(i+1)=-2

    mais ce que je voudrais c'est avoir deux vecteurs différents !
    du style:

    racine1(i),racine2(i)=double(solve('y^2=4'))

    si quelqu'un sait comment faire !

    Merci !

    JB

  8. #8
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Règles du Forum

    Adepte de la maïeutique

  9. #9
    Expert confirmé
    Avatar de tug83
    Homme Profil pro
    MATLAB Geek !
    Inscrit en
    Juin 2006
    Messages
    1 781
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : MATLAB Geek !
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 781
    Points : 4 039
    Points
    4 039
    Par défaut
    en + c'est la note technique préférée de caro
    MATLAB 8.2 (R2013b)

    le blog des MATLAB geeks

  10. #10
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 69
    Points : 34
    Points
    34
    Par défaut
    En effet !

    En écrivant simplement:

    K=double(Solve(M(i)));
    Sigma(i)=K(2);
    Sigma2(i)=K(1);
    J'obtiens ce que je voulais.

    Merci de m'avoir éclairer !!!!!!!


    JB

  11. #11
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    Oui... MAIS ce serait plus propre de ne pas créer 2 variables.

    D'utiliser soit une matrice (si tu es sûr d'avoir toujours 2 racines), soit un cell array.
    Sur un petit exemple inspiré du 1er.
    Cas matrice :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    syms Y
    for i=1:5
        a=Y^2-2*i;
        b(i,:)=solve(a);
    end
    resultat=double(b)
    resultat(i) te donne pour chaque i tes 2 racines

    Cas cell array :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    syms Y
    for i=1:5
        a=Y^2-2*i;
        b{i}=solve(a);
    end
    resultat=cellfun(@double,b','UniformOutput',false)
    resultat{i} te donne pour chaque i tes racines
    Règles du Forum

    Adepte de la maïeutique

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Symbolic Math Toolbox] simplification de fraction
    Par protos dans le forum MATLAB
    Réponses: 5
    Dernier message: 09/07/2019, 20h52
  2. [Compiler] problème avec la Symbolic Math Toolbox ( apres building )
    Par AkuX7 dans le forum MATLAB
    Réponses: 9
    Dernier message: 29/03/2011, 17h26
  3. Symbolic Math Toolbox
    Par enes54 dans le forum MATLAB
    Réponses: 6
    Dernier message: 25/12/2010, 21h10
  4. [Symbolic Math Toolbox] Déclarer une fonction
    Par julienhd dans le forum MATLAB
    Réponses: 0
    Dernier message: 12/09/2010, 16h52
  5. Réponses: 4
    Dernier message: 16/04/2007, 16h30

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