2013-08-23 5 views
2

En utilisant mathematica, je peux calculer la représentation mathématique d'une fonction que je veux ensuite coder en C++.Optimisation du calcul algébrique

dire que je reçois quelque chose comme:

f=Log[2*x+3*y]+Sin[4*x+6*y] 

Il est évidemment logique dans ce cas, faire le calcul:

temp=2*x+3*y 
f=Log[temp]+Sin[2*temp] 

Y at-il un moyen d'obtenir l'expression qui réduirait le temps d'exécution/nombre d'opérations/taille de l'expression ou toute bonne métrique donnée une expression mathématique plus complexe?

+1

Pour des optimisations comme celui que vous avez posté , au moins, je sais que l'optimisation des compilateurs devrait le faire pour vous. Beaucoup plus compliqué est probablement impossible. – vroomfondel

+0

@rogaos Je sais que tout bon optimiseur va supprimer les sous-expressions courantes qui apparaissent littéralement, mais la plupart d'entre elles font vraiment l'analyse algébrique pour détecter le facteur commun dans le code ci-dessus? – Barmar

+0

@Barmar ah, j'ai mal lu la question un peu. Non, je ne sais pas si ça le sera. Si vous l'avez initialement écrit comme 2 * (2 * x + 3 * y), il sera optimisé, sinon ce ne sera pas le cas. Vous pourriez écrire une méthode à prendre en compte au préalable ... mais ce serait probablement un programme plus lent de toute façon – vroomfondel

Répondre

0

Bien qu'il ne fonctionne pas pour votre exemple simple, ce que vous pouvez essayer est le suivant dans Mathematica

Experimental`OptimizeExpression[{Log[(2*x^3 + 3*y)^2] + Sin[2 (2*x^3 + 6*y)^2]}] 

Comme résultat que vous obtenez

Experimental`OptimizedExpression[ 
Block[{Compile`$3, Compile`$4}, Compile`$3 = x^3; 
    Compile`$4 = 2 Compile`$3; 
    {Log[(Compile`$4 + 3 y)^2] + Sin[2 (Compile`$4 + 6 y)^2]}]]