Je fais des calculs de probabilité très simples d'obtenir un sous-ensemble de X, Y, Z de l'ensemble de AZ (avec probabilités correspondantes x, y, z).
et à cause de formules très lourdes, afin de gérer eux, j'essaie de simplifier em> (ou collecter em> ou facteur em> - je ne connais pas la définition exacte) ces expressions polynomiales utilisant Alors .. Ayant ceci (une très simple expression de calcul de probabilité d'obtenir un sous-ensemble de x, y, z de l'ensemble d'AZ avec probabilités correspondantes x, y, z) p> Je veux obtenir quelque chose comme ça p> un poly, réécrit de manière à avoir au moins d'opérations ( Je sais que sympty peut combiner des polynômes em> en formulaires simples: p> Mais comment faire sympty to combiner em> polynômes des expressions ci-dessus? P> S'il s'agit d'une tâche impossible en symbole, peut être une autre option? p> p> + < / code>,
- code>,
* code>,
** code>, ...) aussi possible p>
j'ai essayé facteur () code>,
collecte () code>,
simplifier () code>. Mais le résultat diffère de mes attentes. La plupart du temps, je reçois p>
3 Réponses :
Autant que je sache, il n'y a pas de fonction qui fait exactement cela. Je crois que c'est en fait un problème très difficile. Voir Réduisez le nombre d'opérations sur une expression simple Pour une discussion sur elle.
Il existe cependant quelques fonctions de simplification dans le sympty que vous pouvez essayer. Celui que vous n'avez pas mentionné qui donne un résultat différent est une autre fonction utile est (Notez que Autres fonctions utiles: p> Notez que par défaut, GCD_TERMS CODE>, ce qui facte un GCD symbolique sans effectuer une expansion. Il donne p>
.Count_ops code>, qui compte le nombre d'opérations dans une expression. Par exemple p>
E.Count_OPS () code> n'est pas identique à vous-même, car sympty distribue automatiquement le
6 * (1 - x - y - z) code> à
6 - 6 * x - 6 * y - 6 * z code>). P>
CSE code>: Effectue une élimination commune de sousexpression sur l'expression. Parfois, vous pouvez simplifier les pièces individuelles et ensuite le remettre ensemble. Cela aide également en général à éviter des calculs en double. P> li>
HORNER code>: Applique le Schéma Horner à un polynôme. Cela minimise le nombre d'opérations si le polynôme est dans une variable. p> li>
factor_terms code>: similaire à
gcd_terms code>. Je ne suis en fait pas tout à fait clair quelle est la différence. p> li>
ul>
Simplify code> essaiera plusieurs simplifications et renvoyez celui qui est minimisé par
comte_ops code>. p> p>
Ensemble que certaines des méthodes se produisent pour donner une bonne réponse cette fois-ci. Il serait intéressant de voir si cette stratégie fonctionne plus souvent que pas sur les équations que vous générez ou si, comme le nom l'indique, il s'agit d'un résultat chanceux cette fois-ci. BTW, A Différence entre facteurs_TERMS et GCD_TERMS est que Factor_TERMS fonctionnera plus difficile à tirer des conditions communes tout en conservant la structure d'origine de l'expression, tout comme si vous le feriez à la main (c'est-à-dire à la recherche de termes courants dans les ajouts pouvant être tirés). p> pour ce que cela vaut, p> chris p> p>
Beau combo, mais il est très difficile de comprendre. Pourriez-vous expliquer l'algorithme / l'idée? BTW j'ai trouvé une erreur évidente: `x * (1 - x) * Y * (1 - x - y) * z + ...` -> `x / (1 - x) * y / (1 - x - y ) * Z + ... `, et pour un tel égaliseur, votre combo ne fonctionne pas (je suppose que c'est à cause de choses évidentes, mais depuis que je ne connais pas l'algorythm ....)
Je ne sais pas la cause ultime ici, mais lorsque j'ai un grand nombre de variables, iflfactor code> ne finit pas toutes les substitutions nécessaires pour revenir aux variables d'origine. Je dois ajouter quelques
e.subs (r) code> jusqu'au bout pour récupérer toutes les variables d'origine.
J'ai eu un problème similaire et j'ai fini par mettre en œuvre ma propre solution avant que je sois tombé sur celui-ci. Le mien semble faire un bien meilleur travail réduisant le nombre d'opérations. Cependant, la mienne fait également un ensemble de collections de style brut-force sur toutes les combinaisons de variables. Ainsi, il est d'exécution augmente de manière superfonitive dans le nombre de variables. OTOH, j'ai réussi à l'exécuter sur des équations avec 7 variables dans une quantité de temps non déraisonnable (mais loin de temps réel).
Il est possible qu'il y ait des moyens de tailler certaines des succursales de recherche ici , mais je n'ai pas dérangé avec ça. D'autres optimisations sont les bienvenues. P> pour illustrer les performances, Ce document (Paywalled, désolé) dispose de 7 formules des polynômes de 5ème degré dans 7 variables avec jusqu'à 29 termes et 158 opérations sur les formes élargies. Après avoir appliqué les deux et < / p> respectivement. rcollect_best code> et @ smichr's
iflfactor code>, le nombre d'opérations dans les 7 formules est: p>
iflfactor code> a 433% de plus d'opérations que
rcollect_best code> pour l'une des formules. En outre, le nombre d'opérations dans les formules élargies est la suivante: p>