Maximaで関数の最小値を得るための引数を計算する

Atcoderのabc204問題E(E - Rush Hour 2)では  \frac{D}{t+1} + t の最小値を得るための tを計算する必要があった。

後で調べたMaximaでの計算方法であるが、記録のため保存する。

How to find the maximum and minimum of a function using Maxima? - Stack Overflow

に参考して、Maximaには以下のように入力する。

 f(t):=d/(t+1) + t;

 (関数定義)

f_deriv: diff(f(t),t); 

 (関数の微分を求める)

solve(f_deriv=0,t);

 (微分が0の解を求める)

結果としては

 [t = (- sqrt(d)) - 1, t = sqrt(d) - 1]

 と出力されるが、本来関数の最大値と最小値のときの両方のtが入っている。今回はE問題の解説で \sqrt{t} - 1が回答となることがわかる(E問題ではまた整数に丸める必要がある)。

念のため、グラフでの確認も可能ですが、Maximaで関数に dのような変数が定義されている場合のグラフの出力する方法がわからず、とりあえずd=10のときのグラフを出力してみた。

 f(x):=10/(t+1)+t;

plot2d(f(x), [t,0,10])$

 出力されたのは以下のようなグラフ

f:id:hanaokaiwa:20210607044849p:plain

 \sqrt{10} - 1 \approx 2.16 のところに最小値になっていることが確認できる。