найти минимум функции, определенной интегрированием в Mathematica - PullRequest
5 голосов
/ 13 августа 2010

Мне нужно найти минимум функции f (t) = int g (t, x) dx над [0,1].В Mathematica я сделал следующее:

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

Однако Mathematica останавливается с первой попытки, потому что NIntegrate не работает с символическим символом t.Это требует определенного значения для оценки.Хотя график [f [t], {t, 0,1}] работает безупречно, FindMinimum останавливается в начальной точке.

Я не могу заменить NIntegrate на Integrate, потому что функция g немного сложна, и еслитипа Интегрируй, математика просто продолжай работать ...

Есть ли способ обойти это?Спасибо!

Ответы [ 3 ]

10 голосов
/ 13 августа 2010

Попробуйте это:

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

Два соответствующих изменения, которые я внес в ваш код:

  1. Определите f с помощью := вместо =. Это фактически дает определение для f «позже», когда пользователь f предоставил значения аргументов. См. SetDelayed .

  2. Определите f с помощью t_?NumericQ вместо t_. Это говорит о том, что t может быть чем угодно числовым (Pi, 7, 0 и т. Д.). Но не все нечисловые (t, x, "foo" и т. Д.).

0 голосов
/ 25 августа 2010

Минимум функции может быть только в нулевых точках ее производного, так зачем интегрировать в первую очередь?

  • Вы можете использовать FindRoot или Solve, чтобы найти корниg
  • Затем вы можете проверить, что точки действительно являются локальными минимумами, проверив производные от g (он должен быть положительным в этой точке).
  • Затем вы можете NIntegrate найтиминимальное значение f - только одно числовое интегрирование!
0 голосов
/ 13 августа 2010

унция анализа ...

Вы можете получить точный ответ и полностью избежать тяжелого подъема числовой интеграции, если Mathematica может выполнять символическую интеграцию g [t, x] по x, а затем по символической дифференциации по сравнению с менее тривиальным примером с более сложным g [t, x], включающим полиномиальные произведения по x и 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];

с результатом:

⁃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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...