J'aimerais savoir s'il existe un algorithme simple pour réorganiser des expressions algébriques symboliques simples. Idéalement, j'aimerais pouvoir réécrire une telle expression avec une variable seule sur le côté gauche. Par exemple, étant donné l'entrée: ... J'aimerais pouvoir poser des questions sur x code> en termes de
M code> et
y code> ou
y code> en termes de
x code> et
m code>, et obtenez ceci: p>
x = 2*m - y
y = 2*m - x
4 Réponses :
On dirait que ce que vous êtes intéressé à faire consiste à maintenir un système d'équations linéaires, puis, à tout moment, être capable de résoudre une variable en termes de toutes les autres. Si vous encadrez les relations sous forme de matrice, il semble que vous puissiez réduire la matrice de la matrice à une forme agréable (par exemple, une forme réduite d'échelon de ligne) pour obtenir les dépendances "simples" parmi les variables (pour une bonne définition de la même définition ". ") Une fois que vous avez les données telles que celles-ci, vous devriez pouvoir lire toutes les dépendances en regardant simplement une ligne qui possède une entrée non nulle pour la variable en question, puis la normalisant de sorte que la variable ait le coefficient de coefficient.
Une note - En général, vous n'obtiendrez pas toujours une solution unique pour chaque variable. Par exemple, étant donné les équations triviales p> alors la résolution de z pourrait produire soit "z = x" ou "z = y", selon la quantité de simplification que vous souhaitez. Ou alternativement, dans une configuration comme p> renvoyer une valeur pour x pourrait remettre l'expression, soit leur somme sur deux, ou un tas d'autres choses qui sont toutes techniquement vrai mais pas nécessairement utile. Je ne sais pas comment vous géreriez cela, mais en fonction de la forme de vos équations, vous pouvez probablement trouver un moyen de le gérer. p> p>
Ce que vous voulez, c'est l'équation de résolution d'algorithme (s). Mais je parie que c'est un énorme sujet. En général, il peut y avoir: p>
sin (x) + 10 = z code>, résolution de x Nous inversons le péché (), qui est arcsin (). (Toutes les fonctions ne peuvent être réversibles!) Li>
- Enfin, certaines équations peuvent être solvables difficiles même pour les CAS, tels que
sin (x) + x = y code>, résoudre pour x. li>
ul>
La réponse difficile est - votre meilleur pari est de prendre le code source de certains CAS, - par exemple, vous pouvez consulter le code source CAS de Maxima CAS qui est écrit dans Lisp. Et trouver du code qui est responsable de la résolution d'équation. P>
réponse facile - si tout ce dont vous avez besoin est de résoudre l'équation linéaire et est composée uniquement d'opérateurs de base + - * /. Ensuite, vous savez que vous savez déjà - utilisez une ancienne bonne méthode papier
- Pensez à quelles règles nous utilisons sur papier et à réécrire ces règles comme algorithme symbolique qui manipule la chaîne d'équation. P>
bonne chance! p>
J'ai fait plus de recherches et j'ai découvert que les solveurs de contrainte gèrent tous ce genre de chose. Étant donné que ma candidature s'appuiera beaucoup sur des contraintes de toute façon, je peux utiliser simplement quelque chose comme Choco ou Jacop. Vous avez raison d'être un énorme sujet, et je suis à peu près sûr que votre intuition (et l'autre réponse ci-dessous) est juste que les systèmes d'équations sont là où il est à.
Il existe différentes manières simples dans lesquelles l'équation initiale peut être modifiée, l'exécution des modifications correctes dans le bon ordre entraînera la solution correcte. Alors, que diriez-vous de voir cela comme une recherche ou même un problème de fiathication? P>
Conversion de votre expression en une structure de données (arborescence) dans la notation inversée polonaise. Votre arbre est composé de nœuds, chaque nœud a une opération, une gauche et une droite. Chacun de la gauche et de droite peut être un symbole (par exemple: "x") ou un autre nœud. Par exemple: deviendrait: p> ou en JSON: p> une de vos expressions désirées (résolution de x) On dirait que ceci: p> Pouvez-vous voir que l'arbre des expressions a été tourné à l'envers et que chaque opérateur a été inversé? Le "-" est l'inverse du "+" et enveloppe maintenant le "*" qui est un verso du "/". Le: p> devient: p> où (quelque chose) est un renversement de l'expression extérieure récursive. Essayer d'expliquer le processus: a) descendez de manière récursive l'arborescence d'expression jusqu'à ce que vous trouviez le nœud contenant le symbole que vous souhaitez résoudre pour, b) rendre un nouveau nœud contenant un versement de cette opération de nœuds, c) Remplacez le symbole que vous souhaitez Résolvez avec l'expression extérieure inversée, ce faisant de manière récursive que vous progressez vers l'extérieur. P> P> m = (x + y) / 2 code> ressemblerait à ceci: p>
Ces "algorithmes nommés" sont ceux mis en œuvre dans un CAS. Est-ce un cas de NIH? (Pas inventé ici)