どうも、木村(@kimu3_slime)です。
今回は、Julia(SymPy)で1次不等式、2次不等式を解く方法を紹介します。
準備
SymPyを使うので、持っていなければインストールしておきましょう。
1 2 | using Pkg Pkg.add("SymPy") |
準備として、以下のコードを実行しておきます。
1 | using SymPy |
不等式を解く方法
\(x\)を変数、記号として用意しましょう。
1 | x= symbols("x", real=true) |
オプション「real=true」で変数が実数であると仮定しておくと、結果の表示がシンプルになります。
1次不等式
「LessThan(左辺,右辺)」で不等式を定めて、「solve(不等式)」で解くことができます。LessThanは\(\leq\)、「左辺は右辺と同じか小さい(小なりイコール)」を表すものです。
1 2 | LessThan(2*x,1) solve(LessThan(2*x,1)) |
\[ \begin{aligned}2 x \leq 1\end{aligned} \]
\[ \begin{aligned}x \leq \frac{1}{2}\end{aligned} \]
等号を含まない、狭義の不等号\(<\)による不等式は、「StrictLessThan」を使います。
1 2 | StrictLessThan(2*x,-1) solve(StrictLessThan(2*x,-1)) |
\[ \begin{aligned}2 x < -1\end{aligned} \]
\[ \begin{aligned}x < – \frac{1}{2}\end{aligned} \]
2次不等式
2次不等式も同様にして解けます。「GreaterThan」はLessThanの逆向きで、\(\geq\)(大なりイコール、左辺は右辺と同じか大きい)の意味です。
1 2 | GreaterThan(2*x^2-3,4) solve(GreaterThan(2*x^2-3,4)) |
\[ \begin{aligned}2 x^{2} – 3 \geq 4\end{aligned} \]
\[ \begin{aligned}\frac{\sqrt{14}}{2} \leq x \vee x \leq – \frac{\sqrt{14}}{2}\end{aligned} \]
\(\vee\)は「または(or)」の意味です。\(x\leq – \frac{\sqrt{14}}{2}\)または\(\frac{\sqrt{14}}{2} \leq x\)を満たす\(x\)が不等式を成立させます。
1 2 | LessThan(x^2-2*x+1,3) solve(LessThan(x^2-2*x+1,3)) |
\[ \begin{aligned}x^{2} – 2 x + 1 \leq 3\end{aligned} \]
\[ \begin{aligned}x \leq 1 + \sqrt{3} \wedge 1 – \sqrt{3} \leq x\end{aligned} \]
\(\wedge\)は「かつ(and)」の意味です。\(1 – \sqrt{3} \leq x\)と\(x \leq 1 + \sqrt{3} \)の両方を満たす\(x\)が、不等式の解です。
1 2 | LessThan(x^2,0) solve(LessThan(x^2,0)) |
\[ \begin{aligned}x^{2} \leq 0\end{aligned} \]
\[ \begin{aligned}x = 0\end{aligned} \]
不等式の解がただ一点となるケースも解けます。
1 2 | StrictLessThan(x^2,0) solve(StrictLessThan(x^2,0)) |
\[ \begin{aligned}x^{2} < 0\end{aligned} \]
Any[]
「Any[]」は結果が存在しないこと、つまり不等式に解がないことを意味します。2乗して負になる実数は存在しません。
一般の不等式
多項式が定める不等式だけでなく、より一般の関数が定める不等式も解けます。
1 2 3 | solve(GreaterThan(abs(x-1),2)) solve(GreaterThan(log(x),0)) solve(GreaterThan(sin(x),0)) |
\[ \begin{aligned}3 \leq x \vee x \leq -1\end{aligned} \]
\[ \begin{aligned}1 \leq x\end{aligned} \]
\[ \begin{aligned}0 \leq x \wedge x \leq \pi\end{aligned} \]
\(|x-1| \geq 2\)の解が\(3 \leq x \vee x \leq -1\)であること、\(\log x \geq 0\)の解が\(1 \leq x\)であることは正しいです。
しかし、\(\sin x \geq 0\)の解が\(0 \leq x \wedge x \leq \pi\)であるという結果は微妙です。確かにこれを満たす\(x\)は不等式を満たしますが、解のすべてではありません。例えば、\(\sin(2\pi)=0\)です。一般には、\(2k \pi \leq x \leq (2k+1)\pi\)を満たすような整数\(k\)が存在する\(x\)が解と言えます。
以上、Julia(SymPy)で1次不等式、2次不等式を解く方法を紹介してきました。
等式(方程式)も代数的に解くことができますが、不等式も特殊な値を求めるだけでなく、範囲を求めてきちんと解けるのは嬉しいです。
木村すらいむ(@kimu3_slime)でした。ではでは。
コロナ社 (2020-03-26T00:00:01Z)
¥7,353 (コレクター商品)
こちらもおすすめ
Julia(SymPy)によるテイラー級数展開の求め方(指数対数、三角、双曲線)
Julia(SymPy)で1変数関数を積分する方法(多項式、指数対数、三角関数)
Julia(SymPy)で1変数関数を微分する方法(多項式、指数対数、三角関数)
.Julia(SymPy)で有理関数を部分分数分解、通分する方法
Julia(SymPy)で多項式の展開・因数分解、方程式を解く方法
Juliaで1変数関数のグラフを描く方法(多項式、指数対数、三角関数)