Nombres complexes avec Sage

Bonsoir,
Je débute avec Sage et je travaille avec les nombres complexes : $ring = CC$.
1°) J'ai commencé par créer des variables : $a = var('a')$, etc. Est-ce que je peux indiquer au logiciel que par exemple $u$ et $v$ sont des variables complexes mais que $t$ est quant à lui bien réel ?
2°) Ensuite je définis des équations de droites dans le plan complexe :
$eq1 = (z-a)*conjugate(u) + conjugate(z-a)*u == 0$
$eq2 = (z-b)*conjugate(v) + conjugate(z-b)*v == 0$
Est-ce que peux lui faire calculer le nombre complexe qui correspond au point d'intersection de ces deux droites ? J'ai essayé avec la commande $solve$ mais elle ne donne rien.

Réponses

  • 1°) Je ne sais pas ce que ça peut t'apporter mais tu peux écrire.
    assume(a, "complex")
    Si au contraire $a$ est réel, on peut écrire :
    sage: assume(a, "real")
    sage: conjugate((1+i*a)*(a-2*i+1))
    (a + 2*I + 1)*(-I*a + 1)
    
    2°) Il vaut mieux définir eq1 et eq2 comme les membres de gauches des équations, on peut les manipuler mieux. En effet, la résolution brutale avec solve ne donne rien d'exploitable (« raise TypeError("unable to make sense of Maxima expression '%s' in Sage"%s) »). Autre attaque :
    sage: var('x y')
    (x, y)
    sage: assume(x, "real")
    sage: assume(y, "real")
    sage: solve([eq1.subs(z=x+i*y), eq2.subs(z=x+i*y)],[x,y])
    [[x == 1/2*(((v - conjugate(v))*conjugate(a) - v*conjugate(b) - b*conjugate(v))*u + (a*(v - conjugate(v)) + v*conjugate(b) + b*conjugate(v))*conjugate(u))/(v*conjugate(u) - u*conjugate(v)), y == (((v + conjugate(v))*conjugate(a) - v*conjugate(b) - b*conjugate(v))*u + (a*(v + conjugate(v)) - v*conjugate(b) - b*conjugate(v))*conjugate(u))/(2*I*v*conjugate(u) - 2*I*u*conjugate(v))]]
    
    Ce n'est pas une expression très agréable. On peut tout de même l'utiliser...
    sage: D = solve([eq1.subs(z=x+i*y), eq2.subs(z=x+i*y)],[x,y],solution_dict=1)[0]
    sage: D
    {y: (((v + conjugate(v))*conjugate(a) - v*conjugate(b) - b*conjugate(v))*u + (a*(v + conjugate(v)) - v*conjugate(b) - b*conjugate(v))*conjugate(u))/(2*I*v*conjugate(u) - 2*I*u*conjugate(v)),
     x: 1/2*(((v - conjugate(v))*conjugate(a) - v*conjugate(b) - b*conjugate(v))*u + (a*(v - conjugate(v)) + v*conjugate(b) + b*conjugate(v))*conjugate(u))/(v*conjugate(u) - u*conjugate(v))}
    sage: (x+i*y).subs(D).factor()
    (u*v*conjugate(a) - u*v*conjugate(b) + a*v*conjugate(u) - b*u*conjugate(v))/(v*conjugate(u) - u*conjugate(v))
    
  • Ok merci. 
    3°) Il y a des spécificités pour la version en ligne ? Le code suivant n'y donne rien :
    ring = CC
    a = var('a')
    b = var('b')
    u = var('u')
    v = var('v')
    x = var('x')
    y = var('y')
    assume(x, "real")
    assume(y, "real")
    eq1 = (x+i*y-a)*conjugate(u)+(x-i*y-conjugate(a))*u
    eq2 = (x+i*y-b)*conjugate(v)+(x-i*y-conjugate(b))*v
    solve([eq1, eq2],[x,y])
    4°) Les réponses ici sont vite très longues. Peut-on faire en sorte qu'il se serve de la réponse (sans l'écrire) pour effectuer un autre calcul ? Par exemple on définit $z_0 = solve...$ puis on lui demande de calculer $z_0^2-3z_0+1$ ou autre chose.
  • Math Coss
    Modifié (24 Mar)
    Bon, maintenant je sais ce que la déclaration « assume(a, "complex") » peut apporter... C'est de donner une solution à ton système ! Il te suffit d'ajouter les lignes suivantes (ou quelque chose d'équivalent).
    for l in [a, b, u, v]:
        assume(l, "complex")
    
    Pour ce qui est de la réutilisation, voici ce que je fais : j'ajoute « solution_dict=True » comme option de « solve », de sorte que solve renvoie une liste de dictionnaires. Sachant qu'il n'y a qu'une seule solution, je définis
    D = solve([eq1, eq2], [x, y], solution_dict=True)[0]
    (ce qui donne un dictionnaire « D = {x: ..., y: ...} ») et on peut alors utiliser la solution sous la forme
    z0 = (x + I*y).subs(D)
    Cf. ci-dessus...
Connectez-vous ou Inscrivez-vous pour répondre.