71606


例えば以下の様に記述しても `x**2`
と表示される訳ではありません。しかし僕は表示させたいです。自分で定義しても関数の形がわからないことだってあるじゃないですか？それを解決したいのです。

[code]

    def f(x):
        return x**2
    print(f(x))
    
[/code]

以下のような場合、返値は定義できても関数形は不明です。それを表示させたいのです。

よろしくお願いします。

[code]

    A=np.matrix(input("A行列。数を打ち込んで、スペースで次の数、；で改行"))
    print("A=","\n" , A)
    
    B=np.matrix(input("B行列。数を打ち込んで、スペースで次の数、；で改行"))
    print("B=","\n" , B)
    
    C=np.matrix(input("C行列。数を打ち込んで、スペースで次の数、；で改行"))
    print("C=","\n" , C)
    
    def g(t):
        A_t=A*t
        return C*(np.exp(A_t))*B
    
[/code]


CC BY-SA 4.0
2020-10-29T21:34:06.910
71605
2020-11-17T04:15:51.837
2020-10-30T00:44:46.490
3060
41334
question
python3 numpy sympy
定義した関数を表示したい


`inspect`というモジュールの`getsource`というメソッドで出来るようです。  
[inspect.getsource(object)](https://docs.python.org/ja/3.8/library/inspect.html#inspect.getsource)

>
> オブジェクトのソースコードを返します。引数にはモジュール、クラス、メソッド、関数、トレースバック、フレーム、コードオブジェクトを指定することができます。ソースコードは単一の文字列で返します。ソースコードを取得できない場合は
> OSError が発生します。

例えばこんな感じで作ると：

[code]

    import inspect
    
    def f(x):
        return x**2
    
    print(f(5))
    
    print(inspect.getsource(f))
    
[/code]

こんな結果が表示されます。

[code]

    25
    def f(x):
        return x**2
    
    
[/code]

* * *

あまりフィットしている感じは無いですが、「関数の形」から連想されるものというと、[ast ---
抽象構文木](https://docs.python.org/ja/3/library/ast.html)
とか静的解析ツールでのFlowChart/CallGraph抽出とかでしょうか。

この辺の記事にヒントがあるかもしれません。  
[Pythonスクリプトが実行されるまでにできるもの](https://qiita.com/intermezzo-
fr/items/3ae7645bd7d4414d9607)  
[Python: ast (Abstract Syntax Tree: 抽象構文木)
モジュールについて](https://blog.amedama.jp/entry/2016/04/01/233835)  
[Python の ast モジュール入門 (NodeVisitor
を使う)](https://qiita.com/t2y/items/c8877cf5d3d22cdcf2a8)  
[Python の ast モジュール入門
(抽象構文木を辿る)](https://qiita.com/t2y/items/0964d01bf3db0233e3c1)

[Doxygen ソースコード・ドキュメンテーション・ツール](http://www.doxygen.jp/)  
[Technologicat/pyan](https://github.com/Technologicat/pyan)  
[thebjorn/pydeps](https://github.com/thebjorn/pydeps)  
[Python directed dependency graphs](https://www.scivision.dev/python-
dependency-graph/)  
[Convert python code to flowchart social
advice](https://softadvice.informer.com/Convert_Python_Code_To_Flowchart.html)

* * *

次にこちらもあまりフィットしている感じは無いのですが、もしかしたら「関数の形」というのは数学の書籍に出てくるような数式の表記でしょうか？  
つらつらと検索していたら、Maximaというツールが出てきました。周辺のGUIも複数作られているようです。

[Maxima, a Computer Algebra System](http://maxima.sourceforge.net/)  
[Maxima -- GPL CAS based on DOE-
MACSYMA](https://sourceforge.net/projects/maxima/)

wxMaxima系(wxPythonと関連しそうな名前ですが実態は調べていません)  
インストールと簡単な使い方の解説  
[wxMaxima(Maximaマキシマ）](http://edu.isc.chubu.ac.jp/hsuzuki/iip/maxima/maxima1.html)

[Maximaの入門書](https://qiita.com/KatsunoriNakamura/items/4075337a4b8e355ce384)  
上記からリンクされたpdf [Maxma入門](http://www.k-techlabo.org/www_maxima/maxima_main.pdf)

[wxMaxima
による数式処理とグラフ作成](https://home.hirosaki-u.ac.jp/heroic-2020/%e5%88%a9%e7%94%a8%e4%be%8b/wxmaxima/)  
上記からリンクされたpdf [wxmaxima.pdf](https://home.hirosaki-u.ac.jp/heroic-2020/wp-
content/uploads/sites/25/wxmaxima.pdf)  
SympyとJupyterによる同等内容 [SymPy による数式処理とグラフ作成 – 弘前大学 Home Sweet
Home](https://home.hirosaki-u.ac.jp/jupyter/sympy/)

* * *

Maxima-jupyter系(こちらは明確にPythonベース)  
インストール  
[macOS に Maxima-Jupyter
をインストールする](https://home.hirosaki-u.ac.jp/heroic-2020/1141/)  
[Ubuntu に Maxima-Jupyter
をインストールする](https://home.hirosaki-u.ac.jp/heroic-2020/1253/)  
[robert-dodier/maxima-jupyter](https://github.com/robert-dodier/maxima-
jupyter)

使い方解説  
[Maxima-Jupyter による数式処理とグラフ作成 – 弘前大学 Home Sweet
Home](https://home.hirosaki-u.ac.jp/jupyter/maxima/)

別サイトの記事  
[-その他- Maximaの環境整備(1)
Githubに置いたMaximaプログラムの実行](https://maxima.hatenablog.jp/entry/2020/05/22/234554)  
[-その他- Maximaの環境整備(2) Jupyter lab /
notebook](https://maxima.hatenablog.jp/entry/2020/05/25/001814)  
[-その他- Maximaの環境整備(3) maxima jupyterとmaxima asdfのコンテナ をWindows 10 home version
2004のWSL2で！！](https://maxima.hatenablog.jp/entry/2020/06/10/194316)

* * *

ちなみにPythonでは無くMATLABですが、MathVizというものもあるようです。  
[MathViz: Math expression code
visualizer](http://people.csail.mit.edu/pgbovine/mathviz/)

* * *

**追記：**

@SpaceTAKA さんの新しい質問に関して検索していたら、sympy単独で上記Maximaの数式表示相当の機能があるようなのを見つけました。  
参考までに。

[コンピュータ処理 ドキュメント »
Sympyによる代数計算](https://amorphous.tf.chiba-u.jp/lecture.files/chem_computer/15_Sympy%E3%81%AB%E3%82%88%E3%82%8B%E4%BB%A3%E6%95%B0%E8%A8%88%E7%AE%97/15.html)

> 数式は、sympy.latex()に渡せばlatex形式で出力することもできます。


CC BY-SA 4.0
2020-10-29T23:40:08.293
71606
2020-11-16T23:38:09.950
2020-11-16T23:38:09.950
26370
26370
71605
answer


sympyモジュールを使うのが良いかと思います。

[code]

    import sympy
    
    x =sympy.symbols('x')
    f = x**2
    
    print(f)
    # x**2
    
    print(f.subs(x, 5))
    # 25
    
[/code]


CC BY-SA 4.0
2020-11-17T04:15:51.837
71997
2020-11-17T04:15:51.837
39819
71605
answer