2010-08-13 6 views
5

J'ai besoin de trouver le minimum d'une fonction f (t) = int g (t, x) dx sur [0,1]. Ce que je l'ai fait dans Mathematica est la suivante:trouver le minimum d'une fonction définie par l'intégration dans Mathematica

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

Cependant Mathematica arrête à la première tentative, parce que NIntegrate ne fonctionne pas avec le t symbolique. Il a besoin d'une valeur spécifique à évaluer. Bien que Tracer [f [t], {t, 0,1}] fonctionne parfaitement, FindMinimum s'arrête au point initial.

Je ne peux pas remplacer NIntegrate par intégrer, parce que la fonction g est un peu compliqué et si vous tapez Intégrer, Mathematica simplement continuer à courir ...

De toute façon de contourner le problème? Merci!

+0

Voir [this] (http://stackoverflow.com/questions/6990285/mathematica-evaluation-order-during-numerical-optimization-of-black-box-function/7020539#7020539) réponse pour pointeur vers la page Documentation avec explication de ce comportement. –

Répondre

10

Essayez ceci:

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}] 

Deux changements pertinents que j'ai fait à votre code:

  1. Définir f avec := au lieu de avec =. Ceci donne effectivement une définition pour f "plus tard", lorsque l'utilisateur de f a fourni les valeurs des arguments. Voir SetDelayed. Définir f avec t_?NumericQ au lieu de t_. Cela dit, t peut être quelque chose de numérique (Pi, 7, 0, etc). Mais rien de non-numérique (t, x, "foo", etc).

0

Une once d'analyse ...

Vous pouvez obtenir une exacte réponse et éviter complètement le levage de charges lourdes de l'intégration numérique, tant que Mathematica peut faire l'intégration symbolique de g [t, x] wrt x puis la différenciation symbolique par rapport t. Un exemple moins trivial avec un plus compliqué g [t, x] y compris les produits polynôme en x et 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]; 

avec le résultat:

⁃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

minimum de la fonction peut être seulement à zéro points de son dérivé, alors pourquoi intégrer en premier lieu?

  • Vous pouvez utiliser FindRoot ou Solve pour trouver les racines de g
  • Ensuite, vous pouvez vérifier que les points sont vraiment locaux minimums en vérifiant g de dérivés (il devrait être positif à ce moment-là).
  • Ensuite, vous pouvez NIntegrate pour trouver la valeur minimale de f - une seule intégration numérique!
+0

-1, @phadej, mes excuses pour ce commentaire tardif, mais je viens de courir à travers cela. Malheureusement, vos calculs sont incorrects car 'g [x, t] == ​​0' ne se produira probablement pas' f [t] == ​​0'.Un exemple de compteur simple est 'Sin [x + t]', et le tracé 'ContourPlot [Evaluate [{# == 0, D [Intégrer [#, {x, 0, 1}], t] == ​​0}], {x, 0, 1}, {t, -5, 5}] & @ Sin [x + t] 'montre qu'il existe des régions dans l'espace {x, t} où' g [t, x]! = D [ Intégrez [g [t, x]], t] '. Donc, même si cela peut fonctionner dans des circonstances spéciales, par ex. 'g [x, t] == ​​T [t] X [x]' ou 'g [x, t] == ​​T [t] + X [x]', il ne peut pas être généralement appliqué. – rcollyer