2011-04-27 11 views
6

Observé el siguiente comportamiento al usar NMinimize en Mathematica. La primera invocación de la función objetivo es con nombres de variables, en lugar de con puntos del espacio, como cabría esperar.¿Mathematica llama NMinimize con símbolos en lugar de números?

Así, por ejemplo si mi función objetivo es un módulo, este módulo se llama sólo una vez, y luego evaluadas simbólicamente en posteriores iteraciones, esta expresión simbólica se evalúa con los puntos del espacio de las variables.

Este comportamiento podría frenar significativamente el cálculo para una gran expresión. ¿Hay alguna forma de evitar esto? Alguien más ha experimentado esto? ¿Hay alguna forma de acelerar NMinimize?

Ejemplo:

dummy[x_] := Module[ 
    {}, 
    Print["x=", x ]; 
    4 x^4 - 4 x^2 + 1 
    ] 

In: NMinimize[dummy[x], x] 
Out:x=x 
{0., {x -> 0.707107}} 
+0

Bienvenido a Stackoverflow –

+1

Dependiendo del módulo, este comportamiento en realidad acelera la evaluación. En el ejemplo simple que dio, significa que solo necesita hacer una llamada a la función una vez. Pero sí, para algunas funciones, un entero simbólico o exacto/racional (o numérico exacto como 'Pi' o' Sqrt [2] ') puede ser increíblemente lento. En ese caso, restrinja su función según lo sugerido por @ Mr.Wizard. – Simon

+2

Como nota aparte: es interesante observar que 'NMinimize [Unevaluated [dummy [x]], x]' llama a 'dummy' con' x = x' 4 veces y nunca numéricamente. – Simon

Respuesta

3

Ha intentado definir su función para evaluar solamente para la entrada numérica?

dummy[x_?NumericQ] := ... 
+2

La razón de esto es que 'NMinimize' no contiene ninguno de sus argumentos, por lo que' dummy [x] 'se evalúa normalmente antes incluso de entrar en el código' NMinimize'-specific. –

2

Para algunas funciones ficticias una llamada "exacta numérico" también puede ser muy lento. Ejemplo de encontrar el FixedPoint[Sqrt,2.] es rápido, pero FixedPoint[Sqrt,2] irá hasta que se rompa algo.

Por "exacta numérico" Me refiero a cosas como Integers, Rationals, y la simbólica numéricas, como Sqrt[2], Cos[5], Pi, EulerGamma, etc ...
es decir, cosas que devolverá un valor numérico cuando actúa sobre N[] .

En este caso es probable que sea mejor utilizar

dummy[_?InexactNumberQ] := .... 

o incluso

dummy[_?MachineNumberQ] := .... 
+0

¿Cómo se compararía esto con usar 'N' explícitamente en argumentos? –

+1

prefiero 'NumericQ', sobre todo porque la adición de' Elemento [x, Enteros] 'fallarán con' 'InExactNumberQ' y el establecimiento de WorkingPrecision -> 20' fallará con' MachineNumberQ'. –

Cuestiones relacionadas