質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

2274閲覧

Python: sympy.collectで式の並びが降べきの順にならない問題を解決したい

kensoon

総合スコア48

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/11/22 03:15

前提・実現したいこと

中学生が文字計算の練習に使えるプリントを出力するシステムを作成しています。ブラウザ経由で問題のタイプを選択し、ランダムに問題が作成されるシステムです。
通常計算から方程式までこなせるということでsympyを利用しているのですが、特定の値で文字式が降べきの順に整理できない問題が発生しています。

該当のソースコード

python

1import sympy as sy 2 3x = sy.Symbol("x", real=True) 4 5result1 = 3 * x + 4 6print(result1) 7print(sy.collect(result1, x)) 8result2 = 3 * x - 4 9print(result2) 10print(sy.collect(result2, x)) 11result3 = -4 * x + 4 12print(result3) 13print(sy.collect(result3, x)) 14result4 = 3 - 2 * x 15print(result4) 16print(sy.collect(result4, x))
3*x + 4 3*x + 4 3*x - 4 3*x - 4 4 - 4*x 4 - 4*x 3 - 2*x 3 - 2*x

このようにxの係数で負の数、定数項に正の数を設定した際、逆に出力されてしまいます。

試したこと

整数をsy.Integerで定義したり、掛け算や足し算をsympyのadd,mulなどで処理したりしましたが、結果は変わりませんでした。
また、evaluate=Falseでパラメータを指定して、辞書をdefaultdictに変換し、そこから手動で計算結果を作成することも試みましたが、次数がランダムにx,x^2,x^6,xy,x/y,y/x,y^2/xなど設定されるので、限られた範囲しか対応できていません。

補足情報(FW/ツールのバージョンなど)

python=3.6
sympy=1.9

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

sympy.init_printingorder='grevlex'(reversed graded lexographic order) を指定して、sympypprint(pretty print) を使ってみてはどうでしょうか。

python

1import sympy as sy 2from sympy import pprint 3 4sy.init_printing(order='grevlex') 5 6x = sy.Symbol("x", real=True) 7 8result1 = 3 * x + 4 9pprint(result1) 10pprint(sy.collect(result1, x)) 11result2 = 3 * x - 4 12pprint(result2) 13pprint(sy.collect(result2, x)) 14result3 = -4 * x + 4 15pprint(result3) 16pprint(sy.collect(result3, x)) 17result4 = 3 - 2 * x 18pprint(result4) 19pprint(sy.collect(result4, x)) 20 21# 223⋅x + 4 233⋅x + 4 243⋅x - 4 253⋅x - 4 26-4⋅x + 4 27-4⋅x + 4 28-2⋅x + 3 29-2⋅x + 3

sympy.pprint を使うことで * ではなく (DOT OPERATOR(U+22c5)) が表示されます

投稿2021/11/22 06:10

melian

総合スコア19865

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kensoon

2021/11/23 05:32

ご対応ありがとうございます。完璧に解決できました。 参考にしたサイトで「init_printinはjupyter notebook用の表示である」という旨の知識を得ていたため、勘違いしていました。今後は公式ドキュメントの方も確認しておくようにしておきます。 繰り返しになりますが、本当にありがとうございました。本当に助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問