在Mathematica中找到由集成定义的函数的最小值

时间:2010-08-13 07:58:53

标签: wolfram-mathematica

我需要在[0,1]上找到函数f(t)= int g(t,x)dx的最小值。我在mathematica中所做的如下:

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

然而,mathematica在第一次尝试时停止,因为NIntegrate不适用于符号t。它需要一个特定的值来评估。虽然Plot [f [t],{t,0,1}]完全有效,但FindMinimum在初始点停止。

我不能用Integrate替换NIntegrate,因为函数g有点复杂,如果你输入Integrate,mathematica就会继续运行......

有什么方法可以绕过它吗?谢谢!

3 个答案:

答案 0 :(得分:10)

试试这个:

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“later”的定义。请参阅SetDelayed

  2. 使用t_?NumericQ而不是t_定义f。这说,t可以是任何数字(Pi,7,0等)。但不是任何非数字(t,x,“foo”等)。

答案 1 :(得分:0)

一盎司分析......

只要Mathematica可以对g [t,x] w.r.t x进行符号积分,然后符号微分w.r.t.你可以得到一个精确答案,并完全避免数值积分的繁重。吨。一个不太简单的例子,更复杂的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

答案 2 :(得分:-1)

函数的最小值只能是它的推导零点,那么为什么要首先集成呢?

  • 您可以使用FindRootSolve查找g的根
  • 然后你可以通过检查g的派生来验证点是否真的是局部最小值(此时它应该是正数)。
  • 然后您可以NIntegrate找到f的最小值 - 只有一个数值积分!