2010-08-13 6 views
5

Necesito encontrar el mínimo de una función f (t) = int g (t, x) dx sobre [0,1]. Lo que hice en Mathematica es la siguiente:encontrar el mínimo de una función definida por la integración en Mathematica

f[t_] = NIntegrate[g[t,x],{x,-1,1}] 
FindMinimum[f[t],{t,t0}] 

Sin embargo Mathematica esté detenida en el primer intento, porque NIntegrate no funciona con la camiseta simbólica. Necesita un valor específico para evaluar. Aunque Plot [f [t], {t, 0,1}] funciona perfectamente, FindMinimum se detiene en el punto inicial.

no puede reemplazar por NIntegrate Integrar, debido a que la función g es un poco complicado y si escribe Integrar, Mathematica simplemente sigue corriendo ...

Cualquier manera de conseguir alrededor de él? ¡Gracias!

+0

Ver [esto] respuesta (http://stackoverflow.com/questions/6990285/mathematica-evaluation-order-during-numerical-optimisation-of-black-box-function/7020539#7020539) de puntero a la página de Documentación con explicación de este comportamiento. –

Respuesta

10

Prueba esto:

In[58]:= g[t_, x_] := t^3 - t + x^2 

In[59]:= f[t_?NumericQ] := NIntegrate[g[t, x], {x, -1, 1}] 

In[60]:= FindMinimum[f[t], {t, 1}] 

Out[60]= {-0.103134, {t -> 0.57735}} 

In[61]:= Plot[f[t], {t, 0, 1}] 

dos cambios relevantes que hice a su código:

  1. Definir f con := en lugar de con =. Esto efectivamente da una definición para f "más tarde", cuando el usuario de f ha suministrado los valores de los argumentos. Ver SetDelayed.

  2. Defina f con t_?NumericQ en lugar de t_. Esto dice que t puede ser cualquier cosa numérica (Pi, 7, 0, etc.). Pero no nada no numérico (t, x, "foo", etc.).

0

Una onza de análisis ...

Usted puede obtener una respuesta exacta y evitar por completo el trabajo pesado de la integración numérica, siempre que Mathematica puede hacer la integración simbólica de G [t, x] wrt x y luego la diferenciación simbólica wrt t. Un ejemplo menos trivial con un más complicado g [t, x] incluyendo productos polinomio en x y t:

g[t_, x_] := t^2 + (7*t*x - (x^3)/13)^2; 
xMax = 1; xMin = -1; f[t_?NumericQ] := NIntegrate[g[t, x], {x, xMin, xMax}]; 
tMin = 0; tMax = 1;Plot[f[t], {t, tMin, tMax}]; 
tNumericAtMin = t /. FindMinimum[f[t], {t, tMax}][[2]]; 
dig[t_, x_] := D[Integrate[g[t, x], x], t]; 
Print["Differentiated integral is ", dig[t, x]]; 
digAtXMax = dig[t, x] /. x -> xMax; digAtXMin = dig[t, x] /. x -> xMin; 
tSymbolicAtMin = Resolve[digAtXMax - digAtXMin == 0 && tMin ≤ t ≤ tMax, {t}]; 
Print["Exact: ", tSymbolicAtMin[[2]]]; 
Print["Numeric: ", tNumericAtMin]; 
Print["Difference: ", tSymbolicAtMin [[2]] - tNumericAtMin // N]; 

con el resultado de:

⁃Graphics⁃ 
Differentiated integral is 2 t x + 98 t x^3/3 - 14 x^5/65 
Exact: 21/3380 
Numeric: 0.00621302 
Difference: -3.01143 x 10^-9 
-1

mínimo de la función puede ser solamente en cero puntos de su derivada, ¿por qué integrar en primer lugar?

  • Puede utilizar FindRoot o Solve para encontrar raíces de g
  • luego verificar que los puntos son realmente mínimos locales mediante la comprobación de los derivados de g (debe ser positivo en ese punto).
  • Luego puede NIntegrate para encontrar el valor mínimo de f - ¡solo una integración numérica!
+0

-1, @phadej, mis disculpas por este último comentario, pero me encontré con esto. Desafortunadamente, tus cálculos matemáticos son incorrectos ya que 'g [x, t] == ​​0' probablemente no ocurra donde' f [t] == ​​0'.Un ejemplo de contador simple es 'Sin [x + t]', y graficar 'ContourPlot [Evaluar [{# == 0, D [Integrar [#, {x, 0, 1}], t] == ​​0}], {x, 0, 1}, {t, -5, 5}] & @ Sin [x + t] 'muestra que hay regiones en el espacio {x, t} donde' g [t, x]! = D [ Integrar [g [t, x]], t] '. Por lo tanto, aunque puede funcionar en circunstancias especiales, p. 'g [x, t] == ​​T [t] X [x]' o 'g [x, t] == ​​T [t] + X [x]', no se puede aplicar en general. – rcollyer

Cuestiones relacionadas