我需要在[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就会继续运行......
有什么方法可以绕过它吗?谢谢!
答案 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}]
我对您的代码进行了两项相关更改:
使用:=
而不是=
定义f。当f的用户提供了参数的值时,这有效地给出了f“later”的定义。请参阅SetDelayed。
使用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)
函数的最小值只能是它的推导零点,那么为什么要首先集成呢?
FindRoot
或Solve
查找g
的根g
的派生来验证点是否真的是局部最小值(此时它应该是正数)。NIntegrate
找到f
的最小值 - 只有一个数值积分!