rédaction / solution d'un système d'équations non-linéaire avec SYMPY
Bonjour et merci d'avance pour votre attention (dont j'ai bien besoin !)
Je veux définir analytiquement le plus petit cercle tangent à deux courbes D1 et D2 et passant par un point Pt1 de la courbe D1.
Les courbes et le point sont connus (continues, dérivables). Les courbes pouvant être des droites, arc de cercle ou d'ellipse...
Le point Pt2 est un point de la courbe D2 (de pente a2).
Dans un premier temps, je considère deux droites( on commence doucement :lol:)
Le cercle recherché (de centre x,y) est porté par la perpendiculaire à D1 en Pt1
La seconde condition étant que la distance du centre du cercle à D1 et D2 est identique...
On est d'accord jusque là ?
Je me sers de ce que je connais (c'est à dire pas grand chose ! : ;)) ainsi que SYMPY et Solve (est-ce bien adapté ?)
Code:
eq1= Eq ((an*x+bn1,y))# équation normale à D1 en Pt1
avec an la pente de la normale à D1 et bn1 = ypt1-an*xpt1 où xpt1 et ypt2 coordonnées du point Pt1
Pour ce qui est de la seconde condition:
Code:
eq2= Eq ((y-ypt2-a2*(x-xpt2))/norme_a2-sqrt((x-xpt1)**2+(y-ypt1)**2))
y - ypt2 -a2*(x-xpt2) / norme_a2 étant la distance du point (x,y) à la droite D2 (produit vectoriel)
sqrt((x-xpt1)**2+(y-ypt1)**2 étant le rayon du cercle
puis:
Code:
1 2
| [eq1,eq2]
solution = solveset([eq1,eq2]) |
Mais SYMPY n'aime pas la mise en forme de mon système:
[CODE[Eq((-3.0303*x + 7.0909, y), 0), 1.4356*(Eq(-(x - 3.0)**2 - (y + 2.0)**2 + (0.66*x + y - 14.64)**2, 0))] is not a valid SymPy expression][/CODE]
Quelqu'un peut-il me dire comment dois-je présenter ce système ?
Comment puis-je prendre en compte la valeur absolue d'un produit vectoriel comportant des valeurs symboliques ?
J'ai déjà utilisé SYMPY pour trouver l'intersection d'une ellipse et d'une droite, ce qui en matière de non-linéarité est semblable à ce pb ... Non ?
Merci d'avance, il faut vraiment que je parvienne à automatiser ce calcul (y compris pour des cas plus compliqués comme ellipse / ellipse)
modification de la question ...
Je viens de mettre ma version de SYMPY à jour et les réponses données sont toute autre que ce que j'obtenais ...
Pas encore ce que je souhaite, mais je pense être sur la voie.
A mieux y réfléchir, il est peut-être pas si non-linéaire que ça mon système !! ... :mouarf:
Bref, si quelqu'un peut m'éclairer, je suis tout de même preneur !
Merci d'avance
J'ai avancé .... un peu !
Merci LG 53,
Dans un premier temps, droites, arcs de cercles et d'ellipses me suffisent. On pourrait imaginer une suite avec de courbes de Béziers mais ça c'est si je m'ennuie ;)
En fait,les courbes sont extraites de fichiers .dxf et je veux pouvoir rejoindre des segments par des arc de cercle tangents aux courbes.
J'ai obtenus (enfin !!) les premiers résultats en utilisant sympy.solvers.solveset.nonlinsolve(system, *symbols) puisque mon systéme n'est effectivement pas linéaire, il a fallut toutefois que je remplace la valeur absolue du produit vectoriel par le signe - (moins) pour obtenir un peu miraculeusement les coordonnées des deux cercles.
Code:
e2=(-(y-ypt2-a2*x+a2*xpt2))/norme_a2-sqrt((x-xpt1)**2+(y-ypt1)**2)
au lieu de
Code:
e2=abs(y-ypt2-a2*x+a2*xpt2)/norme_a2-sqrt((x-xpt1)**2+(y-ypt1)**2)
En laissant la valeur absolue, j'obtenait une droite paramétrée : solution = {(-0.33*y + 3.34, y)}
qui est en fait la normale au Pt de contact avec la première droite,
et si j'écris l'équation sans signe, la solution est vide :?
Peut-être quelqu'un saura me dire comment Sympy interprète "abs" , mais je peux imaginer qu'avec du calcul symbolique, ça ne peut pas faire bon ménage...
Fort de ce résultat, je m'attaque aux cas des cercles, qui ne devrait pas poser trop de problème, puis à celui des ellipses avec changement de repère à la clef (Y'a bien longtemps que je n'avais pas fait des trucs comme ça moi :roll:)
Je vais regarder comme mettre mes lignes de code en ligne comme tu le suggères...
Merci encore