17ec084
@17ec084 (智剛 平田)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

sympy で a == -b (a,bは非負) を解きたい

解決したいこと

$0\leq a , 0 \leq b$ のとき、 $a=-b$ は $a=0, b=0$ と解けます。
このことを sympy で解く方法が分からずにおります。

失敗例

sympyのインポート
import sympy
from sympy import *
sympy.__version__
sympyのバージョン
'1.9'

失敗例1: assumptionを用いる

assumption
a = Symbol("a", nonnegative=True)
b = Symbol("b", nonnegative=True)

assert a.is_nonnegative and b.is_nonnegative
solve(Eq(a,-b), a, dict=True)
結果
[{a: -b}]

失敗例2: solveに不等式をぶち込む (python 演算子)

python
solve([Eq(a,-b), a>=0, b>=0])
結果
{a:-b}

ちなみに a>=0b>=0True と評価されているので、本質的には solve([Eq(a,-b)]) と同じ。

失敗例3: solveに不等式をぶち込む (sympyの不等式型)

python
solve([Eq(a,-b), GreaterThan(a,0, evaluate=False), GreaterThan(b,0, evaluate=False)])
結果(例外発生)
NotImplementedError: 
inequality has more than one symbol of interest.

solve に 変数の不等式を持ち込むこと自体が not implemented のようだ。

失敗例4: solveset

python
solveset(Eq(a,-b), a)
結果
{-b}

失敗例5: solveset

python
solveset(Eq(a,-b) & GreaterThan(a,0, evaluate=False) & GreaterThan(b,0, evaluate=False), a)
結果
ValueError: (a >= 0) & (b >= 0) & Eq(a, -b) is not a valid SymPy expression

失敗例6: nsolve

数値的に解けないか試した

python
nsolve(Eq(a,-b), a, dict=True)
結果
ValueError: 
expected a one-dimensional and numerical function
0

1Answer

sympyはそもそも数学の定理を記述し、その証明が可能なライブラリーですか?

わざわざプログラミングで証明するより、数学の定理を机上で解いた方が簡単なのでは?

例えば、行列演算でa>=0 b>=0 を試行しても、証明にはならないような気がします。

0Like

Comments

  1. @17ec084

    Questioner

    ご回答ありがとうございます。
    実は、aとbやc, d, …は、a+b+c+d =1 など、連立方程式で与えられる条件を満たす変数で、かつ確率です。
    その分布の一様分布に対する交差エントロピー
    -α( log a + log b + log c + log d + …)を、
    log 0 を有限の値と無理矢理みなし、交差エントロピーを最小化のですが、
    条件によっては表題の通り、a=-b になってしまいます。
    この場合、 sympy.minimum を動かすと、 log の引数が負になってしまうため、エラーになってしまうのです。
    そこで、 a=-bが出た時に、a=b=0を仮定したいのです。

  2. a>=0 b>=0 を a>0 b>0 と a=0 b=0 
    に分離し、a>0 b>0 を試行すると a=-b の式は成り立ちません。

    同様にa>0 b=0 、a=0 b>0 のケースもa=-b の式は成り立ちません。

    唯一、分離した、a=0 b=0 の時に a=-b の式は成り立ちます。

    a=-bが出た時に、a=b=0を仮定したいのです

    a=b=0時以外a=-b が存在しないケースにたいしてプログラミングすることは間違いではないでしょうか?

Your answer might help someone💌