33821

[code]

    from sympy import *
    var('x y')
    def MYprint(h):
      print('#h=',h)   #この行をどのようになおしたらいいですか？
    f=x+1
    g=y+2
    MYprint(f)
    MYprint(g)
    #WANT f= x + 1
    #WANT g= y + 2
    
[/code]

(参考)シンボルを文字列に変換します。  
<http://ref.xaio.jp/ruby/classes/symbol/to_s>


CC BY-SA 3.0
2017-04-06T13:32:19.767
33820
2017-10-17T06:57:51.143
2017-10-17T06:57:51.143
754
17199
question
python sympy
sympyでシンボル名を文字列に変換にする方法を教えて下さい


通常、呼び出し元での引数の変数名は関数内からでは分かりません。ただ、Python には inspect
というモジュールが用意されていますので、これを使って当該の変数名を知ることができます。

**MYprint.py**

[code]

    #!/usr/bin/python3
    
    def MYprint(h):
      import inspect, re
      frame = inspect.getouterframes(inspect.currentframe())[1][0]
      arg_str = inspect.getframeinfo(frame).code_context[0]
      arg = re.search('\((.+?)\)', arg_str).group(1)
      if arg.find('='):
        arg = arg.split('=')[0].strip()
      print('{0} = {1}'.format(arg, h))
    
    
    from sympy import *
    var('x y')
    
    f = x + 1
    g = y + 2
    
    MYprint(f)
    MYprint(g)
    MYprint(h = x ** 2 + 3 * x - 1)
    
[/code]

**実行**

[code]

    $ ./MYprint.py
    f = x + 1
    g = y + 2
    h = x**2 + 3*x - 1
    
[/code]

しかし、

[code]

    MYprint(f + 1)
    
[/code]

などとすると、

[code]

    f + 1 = x + 2
    
[/code]

と表示されてしまいます。

まぁ、MYprint() 関数が変数名(文字列)を受け取る様にするのも考えられますが、

[code]

    def MYprint(h):
      print('{0} = {1}'.format(h, eval(h)))
    
    MYprint('f')
    MYprint('g')
    
[/code]

これなら直接 `print('{0} = {1}'.format('f', f))` とでもする方が良いでしょうね。


CC BY-SA 3.0
2017-04-06T16:09:01.827
33821
2017-04-06T16:09:01.827
33820
answer


metropolis様  
ありがとうございました。

[code]

    from sympy import *
    var('x')
    def MYprint(h):
    print('#{0} = {1}'.format(h, eval(h)),type(eval(h)))
    f = x + 1
    MYprint('x')
    MYprint('f')
    #x = x <class 'sympy.core.symbol.Symbol'>
    #f = x + 1 <class 'sympy.core.add.Add'>
    
[/code]


CC BY-SA 3.0
2017-04-07T13:24:15.810
33839
2017-04-07T13:24:15.810
17199
33820
answer


以下は,失敗したプログラムです。  
関数syの関数prは、できませんでした。  
"("をはずしてもネストネストとなると、意味はありませんでした。

[code]

    from sympy import *
    var('x')
    def symbol2str(h):
      import inspect, re
      frame = inspect.getouterframes(inspect.currentframe())[1][0]
      arg_str = inspect.getframeinfo(frame).code_context[0]
      arg = re.search('\((.+?)\)', arg_str).group(1)
      return arg
    f = x + 1
    c=symbol2str(f)       #cに代入しています
    print(c)
    print(symbol2str(f))  #cに代入していません。残念でした。
    #結果
    #f
    #symbol2str(f
    
[/code]


CC BY-SA 3.0
2017-04-07T14:27:17.793
33842
2017-04-07T14:27:17.793
17199
33820
answer


cosで実行してみました。

[code]

    from sympy import *
    var('x')
    print('#x=',x,type(x))
    f=cos(x)
    print('#f=',f,type(f))
    g=diff(cos(x), x, 2)
    print('#g=',g,type(g))
    print('#f=',f,type(cos))
    #x= x <class 'sympy.core.symbol.Symbol'>
    #f= cos(x) cos
    #g= -cos(x) <class 'sympy.core.mul.Mul'>
    #f= cos(x) <class 'sympy.core.function.FunctionClass'>
    
[/code]

[code]

    from sympy import *
    var('x y C1 C2')
    eq = Eq(y(x).diff(x, 2) , -y(x))
    g=dsolve(eq)
    h=simplify(g.rhs)
    hh=simplify(g.rhs.diff(x, 1))
    w=solve([h.subs(x,0)-1,hh.subs(x,0)], [C1,C2])
    k=h.subs(C1,w[C1])
    l=k.subs(C2,w[C2])
    print("#y(x)=",l)
    #y(x)= cos(x)
    
[/code]


CC BY-SA 3.0
2017-04-10T13:24:15.500
33910
2017-04-10T13:24:15.500
17199
33820
answer