home / junkbox / math / pyoyline ぴょい線

 ぴょい線というのはたった今名づけました。 pyoylineなので、なんとなくpolylineに見える(笑)。 こんなのです。

pyoy-line

スクリプトで図をゴリゴリ描いているときに、こういう「いい感じの」曲線を自動で配置するのは難しいので、2次関数で書かせてみようと思ったのがきっかけ。 解いてみたら意外と深い問題だった。

 設問としては、

 点 \((x_0, y_0)\) と \((x_1, y_1)\) を通り、 \(x_0\lt x\lt x_1\) で最大値 \(y=y_2\) をとるような放物線の式 \(y = f(x)\) を求めよ。

というシンプルな問題です。 上の「ぴょい線」の絵を見ればどんな関数かだいたい分かるでしょう。 設問としては \(x\) の範囲を制限していないので、左右に無限に続く2次曲線が得られますが。 まずは解いてみてください。 結果は \(x\) の降べきの順に整理しなくていいです。 整理しようとすると泥沼にハマると思います。 十分美しいと思う形にまとめてください。

ヒント1: 暗黙の条件

 問題文から、放物線は上に凸、 \(x_0\lt x_1\) で、 \(y_0,\ y_1,\ y_2\) を比べると \(y_2\) が一番大きい、という暗黙の条件があることが分かります。

ヒント2: 式の置き方

 解き方としては、 \(y=ax^2+bx+c\) と置いて愚直に条件を代入していく方法と、最大値が与えられていることから平方完成した式を使う方法があり、平方完成も \(y=a(x+b)^2+c\) の形と \(y=(ax+b)^2+c\) の形が考えられますが、最後の形以外はどういうわけか計算しているうちに式がぐちゃぐちゃになって、手計算ではやってられなくなります。 なお、上に凸と分かっているので、最後の式は式の前にマイナスを付けて \(y=-(ax+b)^2+c\) としないといけないことに注意。

ヒント3: 原点を通るように工夫する

 たとえば、 \((x_0,y_0)\) が原点となるようにしてから計算して、あとで元に戻します。


解いてみる 開く

 まず、条件が3つあってこのままでは計算が面倒くさいので、 \((x_0,y_0)\) が原点になるようにシフトしてしまいます。 つまり、

\begin{align*} \left\{\begin{aligned} x'&=x-x_0 \eol y'&=y-y_0 \end{aligned}\right. \end{align*}

と変数変換してしまいます。 すると、各条件は以下のようになります。

\begin{align*} x_1'&=x_1-x_0 \eol y_1'&=y_1-y_0 \eol y_2'&=y_2-y_0 \eol \end{align*}

この状態で、放物線が上に凸であることから、

\begin{align*} y' = -(ax'-b)^2+c \end{align*}

の各係数を求め、変数変換を元に戻します。 \(b\) の前にマイナスを付けたのは、 \(ax'=b\) つまり \(x'=b/a\) のときに最大値にしたかったからで、マイナスを付けておかないと \(ax'=-b\) になってしまうからです。 あと、 \(a\) の前に負号を付けると、

\begin{align*} y' &= -(-ax'-b)^2+c\eol y' &= -\{-(ax'+b)\}^2+c\eol y' &= -(-1)^2(ax'+b)^2+c\eol y' &= -(ax'+b)^2+c \end{align*}

となり、 \(b\) の符号を逆にすれば元と同じ式になります。 \(a=0\) の場合は放物線になりませんので、 \(a\gt 0\) だけを考えればよいことになります。

 平方完成しているので最大値はすぐに分かって \(c\) になります。 つまり、 \(c=y'_2\) がすぐに分かります。 また、 \(x'=0,\ y'=0\) を通るように変数変換したので、

\begin{align*} 0&=-(a\cdot 0-b)^2+c\eol 0&=-(-b)^2+y'_2\eol 0&=-b^2+y'_2\eol b^2&=y'_2 \end{align*}

もすぐに分かります。 \(a\) がカッコの外に出ていると、ここで \(a\) が消えてくれなくて面倒なことになります。 \(b\) は \(\pm\sqrt{y'_2}\) になります。 根号の中身を確認しておきます。 暗黙の条件から \(y_2\gt y_0\) つまり \(y_2-y_0\gt 0\) なので、変数変換から \(y'_2=y_2-y_0>0\) で、根号の中は必ず正になり、 \(b\) は実数解があることが分かります。

 次にプラスかマイナスかですが、平方完成の性質から最大値をとるのは \(x'=b/a\) のときです。 最大値をとるのは \(x_0\lt x\lt x_1\) のときという条件なので、変数変換すると

\begin{alignat*}{8} x_0-x_0&\ \lt\ && x&&-x_0&\ \lt\ & x_1-x_0\eol 0&\ \lt\ &&&&x'&\ \lt\ & x'_1\label{eqn1}\tag{*} \end{alignat*}

となり、 \(x'=b/a\gt 0\) です。 \(a\gt 0\) と約束したので、 \(b\gt 0\) です。 したがって、 \(b=\sqrt{y'_2}\) と分かります。

 あと使っていない条件は \(x'=x'_1,\ y'=y'_1\) ですから、代入してゴリゴリやります。

\begin{align*} y'_1&=-(ax'_1-b)^2+y'_2\eol &=-(a^2{x'_1}^2+b^2-2abx'_1)+y'_2\eol &=-a^2{x'_1}^2-b^2+2abx'_1+y'_2 \end{align*}

ここで \(b^2=y'_2\) なので、

\begin{align*} y'_1&=-a^2{x'_1}^2-b^2+2abx'_1+y'_2\eol &=-a^2{x'_1}^2-y'_2+2abx'_1+y'_2\eol &=-a^2{x'_1}^2+2abx'_1 \end{align*}

といい具合に消えてくれます。 これを\(a\)について2次方程式だと思って解きます。

\begin{align*} y'_1=-a^2{x'_1}^2+2abx'_1\eol a^2{x'_1}^2-2abx'_1+y'_1=0\eol {x'_1}^2a^2-2bx'_1a+y'_1=0 \end{align*}

2次方程式の解の公式から、

\begin{align*} a&=\frac{2bx'_1\pm\sqrt{4b^2{x'_1}^2-4{x'_1}^2y'_1}}{2{x'_1}^2}\eol &=\frac{2bx'_1\pm\sqrt{4{x'_1}^2(b^2-y'_1)}}{2{x'_1}^2}\eol &=\frac{2bx'_1\pm2x'_1\sqrt{b^2-y'_1}}{2{x'_1}^2}\eol &=\frac{2x'_1\left(b\pm\sqrt{b^2-y'_1}\right)}{2{x'_1}^2}\eol &=\frac{b\pm\sqrt{b^2-y'_1}}{x'_1} \end{align*}

\(b=\sqrt{y'_2}\) なので、

\begin{align*} a&=\frac{\sqrt{y'_2}\pm\sqrt{y'_2-y'_1}}{x'_1} \end{align*}

です。 後ろの根号の中身(つまり判別式)を確認しておきます。 変数変換から、

\begin{align*} y'_2-y'_1&=y_2-y_0-(y_1-y_0)\eol &=y_2-y_0-y_1+y_0)\eol &=y_2-y_1 \end{align*}

ですが、暗黙の条件から \(y_2\gt y_1\) つまり \(y_2-y_1\gt 0\) です。 したがって根号の中身は必ず正であり、 \(a\) には実数解があることが分かります。 一方、 \((\ref{eqn1})\) から \(x'_1\gt 0\) で \(a\) は正と約束しましたから、分子全体 \(\sqrt{y'_2}\pm\sqrt{y'_2-y'_1}\) も正でなければならないことに気をつけてください(あとで使います)。

 もう一度最大値を取るときを考えてみると、 \(x'=b/a\) ですから、

\begin{align*} x'&=\frac{b}{a}\eol &=\frac{x'_1\sqrt{y'_2}}{\sqrt{y'_2}\pm\sqrt{y'_2-y'_1}} \end{align*}

です。 \((\ref{eqn1})\) で書いたように \(0\lt x'\lt x'_1\) なので、 \(x'/x'_1\lt 1\) です。

\begin{align*} x'&=\frac{x'_1\sqrt{y'_2}}{\sqrt{y'_2}\pm\sqrt{y'_2-y'_1}}\eol \frac{x'}{x'_1}&=\frac{\sqrt{y'_2}}{\sqrt{y'_2}\pm\sqrt{y'_2-y'_1}}\lt 1 \end{align*}

より、分母の \(\sqrt{y'_2}\pm\sqrt{y'_2-y'_1}\) は先ほど正だと確認したので、両辺にかけても不等号の向きは変わらず、計算を進めると、

\begin{align*} \frac{\sqrt{y'_2}}{\sqrt{y'_2}\pm\sqrt{y'_2-y'_1}}&\lt 1\eol \sqrt{y'_2}&\lt\sqrt{y'_2}\pm\sqrt{y'_2-y'_1}\eol 0&\lt\pm\sqrt{y'_2-y'_1} \end{align*}

を満たさなければなりません。 したがって、複号はプラスになり、

\begin{align*} a=\frac{\sqrt{y'_2}+\sqrt{y'_2-y'_1}}{x'_1} \end{align*}

です。

 変数変換を元に戻してまとめると、

\begin{align*} y'&=-\left(\frac{\sqrt{y'_2}+\sqrt{y'_2-y'_1}}{x'_1}x'-\sqrt{y'_2}\right)^2+y'_2\eol y-y_0&=-\left\{\frac{\sqrt{y_2-y_0}+\sqrt{y_2-y_0-(y_1-y_0)}}{x_1-x_0}(x-x_0)-\sqrt{y_2-y_0}\right\}^2+(y_2-y_0)\eol y&=-\left\{\frac{\sqrt{y_2-y_0}+\sqrt{y_2-y_0-y_1+y_0)}}{x_1-x_0}(x-x_0)-\sqrt{y_2-y_0}\right\}^2+y_2-y_0+y_0\eol y&=-\left\{\frac{\sqrt{y_2-y_0}+\sqrt{y_2-y_1}}{x_1-x_0}(x-x_0)-\sqrt{y_2-y_0}\right\}^2+y_2 \end{align*}

が答えです。 これで十分美しいので、これ以上計算しようと思わない方がいいです。 最後まで計算すればきれいになるのかもしれませんが、途中は間違いなく沼でしょう。

 ちなみに、ふたつ目の複号、プラスマイナス両方についてグラフを書くとこんな感じになります。

 一方は条件を満たすぴょい線に、もう一方は \(x0\) と \(x1\) の外で最大値 \(y2\) をとる放物線になることが分かります。 複号を決めるときにこの放物線がイメージできれば、複号の片方は条件を満たさない、つまり、複号はどちらかを選ばないといけないことに気づくでしょう。 ちなみに、この図の左側の引き出し線はぴょい線です。 右側はまた違う条件の放物線です。

 試験問題にする場合は、 \(y=-(ax-b)^2+c\) と置く部分は誘導した方がいいと思います。 また、 \(x\) の降べきの順に整理しなくてもよい、と明記しておいた方がよいでしょう。 それでも結構難易度は高いと思います。 難易度を下げるには変数変換を小問として設定するか、さらに下げるには \((x_0,y_0)\) をやめて最初から「原点を通る」としてしまえば変数変換なしで解けます。 というか、ぴょい線を実際に描画する場合は、描画するときにシフトすればいいので、最初はそうやって解きました。 それでもふたつ出てくる複号は \(0\lt x'\lt x'_1\) を利用して両方とも確定しなければなりませんから、場合分けが必要な2次関数の問題としては解答者の力量を推し量るちょうどいい難易度なのではないかと思います。


Copyright (C) 2019 akamoz.jp

$Id: pyoyline.htm,v 1.15 2019/02/24 04:23:13 you Exp $