我试图找到一种方法来使用Maxima(wxMaxima)获取函数的最大值和最小值,但直到现在我还没有找到如何做到这一点。
你能告诉我你会怎么做?
例如,假设我有以下代码:
f(x) := (3*x)/(x^2 - 2*x + 4);
然后我在-10,10范围内绘制此函数,并获得:
我知道最大值是3/2,最小值应该是-1/2。
答案 0 :(得分:9)
我的建议是以与手动操作相同的方式找到极值:计算导数,求解导数= 0,并将找到的任何值替换回原始函数。 E.g:
(%i1) f(x) := (3*x)/(x^2 - 2*x + 4);
3 x
(%o1) f(x) := ------------
2
x - 2 x + 4
(%i2) diff (f(x), x);
3 3 x (2 x - 2)
(%o2) ------------ - ---------------
2 2 2
x - 2 x + 4 (x - 2 x + 4)
(%i3) ratsimp (%);
2
3 x - 12
(%o3) - -----------------------------
4 3 2
x - 4 x + 12 x - 16 x + 16
(%i4) num (%);
2
(%o4) 12 - 3 x
(%i5) solve (%, x);
(%o5) [x = - 2, x = 2]
(%i6) map (lambda ([e], subst (e, f(x))), %);
1 3
(%o6) [- -, -]
2 2
如果我小心,我会证实x = -2和x = 2确实是极值而不仅仅是拐点,我会证实%o3的分母在x = -2时非零在尝试评估这些点的f(x)之前,x = 2。
答案 1 :(得分:1)
使用此功能lbfgs
:
lbfgs(-f(x), [x], [1.0], 1e-4, [-1,0]);
上面的代码给出了函数最大值的位置[x = 2]。
答案 2 :(得分:1)
答案 3 :(得分:0)
lbfgs
找到最小值。
Tim的代码找到-f(x)
的最小值,因此找到f(x)
的最大值。 [x]
=变量。 [1.0]
=初步估算。 [-1,0]
=在 x = -1
和x = 0
之间找到最大值。 1e-4
= epsilon,我认为基本上这最终会达到准确度或步长值。