7
votes

Factoring Polys en sympty

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 (ou collecter ou facteur - je ne connais pas la définition exacte) ces expressions polynomiales utilisant sympty .

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) xxx

Je veux obtenir quelque chose comme ça xxx

un poly, réécrit de manière à avoir au moins d'opérations ( + < / code>, - , * , ** , ...) aussi possible


j'ai essayé facteur () , collecte () , simplifier () . Mais le résultat diffère de mes attentes. La plupart du temps, je reçois xxx

Je sais que sympty peut combiner des polynômes en formulaires simples: xxx

Mais comment faire sympty to combiner polynômes des expressions ci-dessus?


S'il s'agit d'une tâche impossible en symbole, peut être une autre option?


0 commentaires

3 Réponses :


3
votes

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 GCD_TERMS , ce qui facte un GCD symbolique sans effectuer une expansion. Il donne xxx

une autre fonction utile est .Count_ops , qui compte le nombre d'opérations dans une expression. Par exemple xxx

(Notez que E.Count_OPS () n'est pas identique à vous-même, car sympty distribue automatiquement le 6 * (1 - x - y - z) à 6 - 6 * x - 6 * y - 6 * z ).

Autres fonctions utiles:

  • CSE : 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.

  • HORNER : Applique le Schéma Horner à un polynôme. Cela minimise le nombre d'opérations si le polynôme est dans une variable.

  • factor_terms : similaire à gcd_terms . Je ne suis en fait pas tout à fait clair quelle est la différence.

    Notez que par défaut, Simplify essaiera plusieurs simplifications et renvoyez celui qui est minimisé par comte_ops .


0 commentaires

7
votes

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. XXX

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). xxx

pour ce que cela vaut,

chris


2 commentaires

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 ne finit pas toutes les substitutions nécessaires pour revenir aux variables d'origine. Je dois ajouter quelques e.subs (r) jusqu'au bout pour récupérer toutes les variables d'origine.



1
votes

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. xxx

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 rcollect_best et @ smichr's iflfactor , le nombre d'opérations dans les 7 formules est: xxx

et < / p> xxx

respectivement. iflfactor a 433% de plus d'opérations que rcollect_best pour l'une des formules. En outre, le nombre d'opérations dans les formules élargies est la suivante: xxx


0 commentaires