11
votes

Teller Terrain à Style Vectoriel Fonctions de Box-Box à Mathematica

Supposons que j'écris une fonction black-box, qui évalue une fonction valorisée complexe coûteuse numériquement, puis renvoie une partie réelle et imaginaire. xxx

puis je peux l'utiliser dans l'intrigue comme d'habitude, Mais l'intrigue ne reconnaît pas que la fonction renvoie une paire, et les couleurs se courbe la même couleur. Comment dit-on Mathematica que la fonction spécifiée renvoie toujours un vecteur d'une longueur fixe? Ou comment gère-t-on cette parcelle?

écran d'écran de l'intrigue avec les deux courbes étant les mêmes Couleur

EDIT: Étant donné tentatives tentées pour répondre au problème, je pense que éviter une double réévalution n'est possible que si le style est effectué comme post-traitement des graphiques obtenus. Très probablement, les suivants ne sont pas robustes, mais il semble fonctionner pour mon exemple: xxx

 deux images, une avec style appliqué


2 commentaires

Je ne pense pas qu'il y ait une façon documentée de le faire.


J'ai essayé d'exécuter un trace [tracé [{sin [x], cos [x]}, {x, -1, 1}], TraceInnernal -> true] pour déterminer où la MMA détermine le nombre des lignes et attribue des couleurs / styles - mais cela n'a rien fait plus clair. Peut-être que quelqu'un d'autre aura de mieux comprendre la sortie.


3 Réponses :


7
votes

Une possibilité est la suivante: xxx pré>

Entrez la description de l'image ici p>

edit forte> p>

Si vos fonctions ne sont pas vraiment fortes> lisse (c'est-à-dire presque linéaire!), il n'y a pas beaucoup à faire pour Empêcher le processus de double évaluation, car cela se produira de toute façon en raison de la nature de l'algorithme d'exploration de l'intrigue [] maillage. p>

Par exemple: P>

fun[x_?InexactNumberQ] := Module[{f = Sin[3  x]}, {Re[f], Im[f]}];
Plot[{#[[1]], #[[2]]}, {x, -1, 1}, Mesh -> All, 
   PlotStyle -> {{Red}, {Blue}}] &@fun[x + I]  


4 commentaires

Si l'on insère Semander à l'intérieur, et des enveloppes récoltées autour de la parcelle, on voit que, pour une valeur de X, la fonction est évaluée deux fois. Je ne comprends pas pourquoi, cependant. Laissez le plaisir [x_? Inexactnumberq]: = module [{f = sin [x]}, semer [x]; {Re [f], im [f]}] Ensuite (récoltez [{# [[1]], # [[2]]}, {x, -1, 1}, graphstyle -> {{rouge} , {Bleu}}] & @ fun [x + i]] [[[x + i]] [[[[1, 1]] // Tally) [[Tout, 2]] // Tally donne {{2, 78}, {1, 197} }, il y a donc une salle d'économie.


@Sasha Yep. J'ai raté votre déclaration "Fonction coûteuse". Vous pouvez utiliser la mémoire de mémoisation, bien que


Cela semble éviter une partie des réévalissures. Jolie fromage cependant, à moins que vous n'ayez pas eu la peine de localiser la variable globale. amusant [x_? inexactnumberq]: = module [{f = sin [x]}, semer [x]; Tagalong = im [f]; Re [F]] g [x_]: = Tagalong pts = récolte [{# [[1]], g [# [[2]]]}, {x, -1, 1}, tracétyle -> { {Rouge}, {bleu}}] & @ {amusant [x + i], tagalong}] [[2, 1]];


Bien que ce n'était pas une réponse directe à ma question, votre analyse montre qu'il n'y a que de nombreuses évaluations inutiles que je peux éviter sans la subdivision automatique primordiale. Acceptant.



0
votes

Si possible pour votre application réelle, une solution consiste à autoriser amusant à prendre une entrée symbolique en plus de seulement numéric, puis évaluer à l'intérieur de : xxx

Entrez la description de l'image ici

Ceci a le même effet que si vous aviez à la place d'évaluer: xxx


1 commentaires

La raison pour laquelle je ne peux pas faire cela est que la fonction réelle est définie par une intégration numérique et n'a pas de forme fermée.



3
votes

Je ne pense pas qu'il y ait une bonne solution à cela si votre fonction est coûteuse à calculer. L'intrigue ne reconnaîtra que plusieurs courbes pour être stylés si vous lui donnez une liste explicite de fonctions comme argument ou vous donnez une fonction qu'il peut évaluer à une liste de valeurs.

La raison pour laquelle vous ne voudrez peut-être pas faire ce que @Belisarius a suggéré de calculer la fonction deux fois (deux fois plus tard).

Cependant, vous pouvez utiliser la mémoisation pour éviter ceci (c'est-à-dire le F [x_]: = f [x] = ... construire) et aller avec sa solution. Mais cela peut remplir votre mémoire rapidement si vous travaillez avec des fonctions valorisées réelles. Pour empêcher cela, vous voudrez peut-être essayer ce que j'ai écrit sur la mise en cache un nombre limité de valeurs, pour éviter de remplir la mémoire: http://szhorvat.net/pelican/memoization-in-mathematica.html


1 commentaires

La mise en cache sera plus utile si les parties réelles et imaginaires n'ont pas de "points intéressants". L'intrigue essaiera d'explorer ces points pour chaque partie. Je vais mettre à jour ma réponse.