sympifyで大文字の"S"を数式に変換するには (Python Sympy)
文字列から、MathMLのコードを生成するプログラムtest001.py
を書いています。
test001.py
import sys
sys.path.append('/home/vagrant/.local/lib/python3.4/site-packages')
from sympy import *
from sympy.printing.mathml import mathml
def returnMathML(value):
str = "<math>"
if '=' in value:#文字列中に=(イコール)が含まれている場合
str += mathml(Eq(*map(sympify, value.split('='))),printer='presentation')
else:
str += mathml(sympify(value),printer='presentation')
str += "</math>"
return str
print(returnMathML("A"))
test001.pyを実行すると、以下のようにMathMLのコードが出力されます。
<math><mi>A</mi></math>
test001.pyの15行目で、渡す引数を"y=a*x**2+b*x+c"に変更して以下のように書き換えて実行してもMathMLのコードが出力されます。
・引数を"y=a*x**2+b*x+c"に変更した場合
print(returnMathML("y=a*x**2+b*x+c"))
・引数を"y=a*x**2+b*x+c"に変更した場合の実行結果
$ python test001.py
<math><mrow><mi>y</mi><mo>=</mo><mrow><mrow><mi>a</mi><mo>⁢</mo><msup><mi>x</mi><mn>2</mn></msup></mrow><mo>+</mo><mrow><mi>b</mi><mo>⁢</mo><mi>x</mi></mrow><mo>+</mo><mi>c</mi></mrow></mrow></math>
ただ、文字列に大文字の"S"が加わると、エラーが出てしまいます。
・引数を"S"に変更した場合
print(returnMathML("S"))
・引数を"S"に変更した場合の実行結果
$ python test001.py
Traceback (most recent call last):
File "test001.py", line 15, in <module>
print(returnMathML("S"))
File "test001.py", line 11, in returnMathML
str += mathml(sympify(value),printer='presentation')
File "/home/vagrant/.pyenv/versions/3.6.7/lib/python3.6/site-packages/sympy/printing/mathml.py", line 1904, in mathml
return MathMLPresentationPrinter(settings).doprint(expr)
File "/home/vagrant/.pyenv/versions/3.6.7/lib/python3.6/site-packages/sympy/printing/mathml.py", line 68, in doprint
unistr = mathML.toxml()
AttributeError: 'str' object has no attribute 'toxml'
これはおそらく、sympify関数のエイリアスが「S」であるため、名前かぶりが起きているんではないかと思います。
大文字のS以外の、BやCやDといったアルファベットはprintすることが出来ました。また、小文字のsなども大丈夫でした。大文字のSだけがうまく出力できません。
以下のように、面積の"S"を表すのに使用したいです。
print(returnMathML("S=abs(a)*(β-α)**3/6"))
どうすればこの問題を解決できますでしょうか?