6

Estoy intentando realizar una optimización numérica de una función de "caja negra" en Mathematica. Esquemáticamente dice así:Mathematica: orden de evaluación durante la optimización numérica de las funciones de caja negra

NMinimize[{comb[x,y,z], x > 0}, {x,y,z}] 

donde peine [x, y, z] se define de forma similar a esto:

comb[x_,y_,z_] := Module[{}, 
    Print[x,y,z]; 
    M = FindMaximum[SkewNormal[a,x,y,z], {a,x}] // First; 
    val = f[x,y,z,M]; 
    Return[val]; 
]; 

Sin embargo, todas las funciones de minimización he tratado parecen no ofrecer inmediatamente peine [x, y, z] con valores numéricos, y termina tratando de evaluar el FindMaximum con valores simbólicos para x, y, z (que se verifica fácilmente porque la impresión [x, y, z] también evalúa simbólicamente). El Findmaximum falla así (FindMaximum :: nrnum: el valor de la función blah blah no es un número real) y la minimización falla.

¿Cómo arreglo el orden de evaluación para que las subfunciones de peine se evalúen con valores numéricos?

+1

Otro problema (más sutil) debido al preprocesamiento simbólico en 'NMinimize' recientemente se resolvió en [otro hilo] (http://stackoverflow.com/questions/6971536/nminimize-eats-all-memory- bc-of-necessary-symbolic-work/6975501 # 6975501) de Daniel Lichtblau. –

+0

Hmm ok gracias, lo comprobaré. También me acabo de dar cuenta de que este problema no ocurre en Mathematica 8 (estaba ejecutando 7 anteriormente). –

Respuesta

4

¿Qué hay de cambiar comb a

comb[x_?NumericQ, y_?NumericQ, z_?NumericQ] := 
Module[{}, Print[x, y, z]; 
M = FindMaximum[SkewNormal[a, x, y, z], {a, x}] // First; 
val = f[x, y, z, M]; 
Return[val];]; 

que hace que la definición de comb a ser evaluada sólo si sus argumentos son números?

+1

Nah eso no ayuda. Mi función ya lo hizo, simplemente eliminé esos bits para poder hacer esta pregunta. –

+1

@Ben extraño que 'Imprimir' también mostraría valores simbólicos, ya que' comb [x, y, z] 'con valores simbólicos no coincidiría con la definición que di. ¿Has 'Borrar [peine] 'antes de ejecutar esto? Tal vez esté haciendo coincidir la definición sin el bit 'NumericQ'. – acl

+0

@acl Esto no funcionó para mí al principio, pero después de borrarlo funcionó. –

5

orden de evaluación para FindMinimum, FindMaximum, FindRoot y FindFit se documenta en la página tutorial/UnconstrainedOptimizationSymbolicEvaluation Documentación. Creo que algo muy similar es aplicable a la función NMinimize. La descripción es bastante largo así que voy a citar aquí solamente la solución propuesta de esa página:

Si su función es tal que la evaluación simbólica no va a mantener la función según lo previsto o van a ser prohibitivamente lenta, se debe definir su función para que solo evalúe los valores numéricos de las variables . La forma más sencilla de hacerlo es definiendo su función usando PatternTest (?), Como en f [x_? NumberQ]: = definición.

Puede parecer que la evaluación simbólica solo crea una molestia ya que tiene que definir la función específicamente para evitarlo. Sin embargo, sin evaluación simbólica, es difícil para Mathematica tomar ventaja de su combinación única de potencia numérica y simbólica. La evaluación simbólica significa que los comandos pueden tomar consistentemente ventaja de los beneficios que provienen del análisis simbólico, como determinación de algoritmo, cálculo automático de derivadas, optimización y compilación automática, y análisis estructural.

Cuestiones relacionadas