2010-08-13 15 views
5

Muszę znaleźć minimum funkcji f (t) = int g (t, x) dx powyżej [0,1]. Co zrobiłem w Mathematica jest następujący:znajdź minimum funkcji zdefiniowanej przez integrację w Mathematica

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

Jednak Mathematica zatrzymuje przy pierwszej próbie, bo NIntegrate nie działa z symbolicznego t. Do oceny potrzebna jest określona wartość. Chociaż działka [f [t], {t, 0,1}] działa perferctly, FindMinimum zatrzymuje się w punkcie początkowym.

nie mogę wymienić NIntegrate przez Zintegruj, ponieważ funkcja g jest nieco skomplikowany i jeśli wpiszesz Integracja, Mathematica prostu biec ...

sposób uzyskać wokół niego? Dzięki!

+0

Zobacz odpowiedź [this] (http://stackoverflow.com/questions/6990285/mathematica-valuation-order-during-numerical-optimisation-of-black-box-function/7020539#7020539) dla wskaźnika Strona Dokumentacja z wyjaśnieniem tego zachowania. –

Odpowiedz

10

Spróbuj tego:

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

Dwie istotne zmiany zrobiłem do kodu:

  1. Definiowanie fz := zamiast z =. To faktycznie daje definicję f "później", gdy użytkownik f podał wartości argumentów. Zobacz SetDelayed.

  2. Zdefiniuj f za pomocą t_?NumericQ zamiast t_. Oznacza to, że t może być dowolnym numerem (Pi, 7, 0 itd.). Ale nie cokolwiek nieliczbowego (t, x, "foo", itp.).

0

Uncja analizy ...

można uzyskać dokładny odpowiedź i całkowicie unikać podnoszenia ciężkich integracji numerycznej, tak długo, jak Mathematica może zrobić symboliczne integracji G [t, x] wrt x, a następnie symboliczne wrt t. Mniej trywialne przykład z bardziej skomplikowanym G [t, X], w tym produktów wielomian X i 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]; 

w wyniku:

⁃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 funkcji może być jedynie w zerowym punkty jego pochodnej, więc po co w ogóle integrować?

  • Można użyć FindRoot lub Solve znaleźć korzenie g
  • Następnie można sprawdzić, czy punkty są naprawdę lokalne minima, sprawdzając pochodne g (powinien być dodatni w tym punkcie).
  • Następnie można NIntegrate znaleźć minimalną wartość f - tylko jedną integrację numeryczną!
+0

-1, @phadej, przepraszam za ten spóźniony komentarz, ale właśnie natknąłem się na to. Niestety, twoja matematyka jest niepoprawna, ponieważ 'g [x, t] == ​​0' najprawdopodobniej nie pojawi się, gdy' f [t] == ​​0'.Prostym przykładem licznika jest "Sin [x + t]" i narysowanie 'ContourPlot [Oceń [{# == 0, D [Zintegruj [#, {x, 0, 1}], t] == ​​0}], {x, 0, 1}, {t, -5, 5}] & @ Sin [x + t] 'pokazuje, że istnieją obszary w przestrzeni {x, t}, gdzie' g [t, x]! = D [ Zintegruj [g [t, x]], t] '. Tak więc, chociaż może działać w szczególnych okolicznościach, np. 'g [x, t] == ​​T [t] X [x]' lub 'g [x, t] == ​​T [t] + X [x]', nie może być generalnie zastosowany. – rcollyer

Powiązane problemy