眠気.jl

投稿=不定期

Juliaで微積CLIを作る(Fire.jl+SymEngine.jl)

動機

関数電卓コマンドラインで出来たらいいなと思った,ありきたりな動機

やっていく

下記をfunc_calc.jlとして保存
今回は小文字アルファベット全部をシンボル扱いする

using Fire
using SymEngine


# シンボル扱いする文字の定義,書き方 1/3
a=symbols(:a); b=symbols(:b)
# シンボル扱いする文字の定義,書き方 2/3
c,d = symbols("c d")
# シンボル扱いする文字の定義, 書き方 3/3
@vars e f g h i j k l m n o p q r s t u v w x y z


"微分する,Argument type Basic is not supported by Fire.jlらしいのでString受取してタイプ変換"
@main function diff_func(f::String, respect_to::String)
    f = Basic(f)
    respect_to = Basic(respect_to)
    result = diff(f,respect_to)
    println(f,"を",respect_to,"で1回微分すると:",result)
end

"代入,この文章はjulia func_calc.jl subsitution --helpで見れる"
@main function subsitution(f::String,respect_to::String,num::Float64)
    f = Basic(f)
    respect_to = Basic(respect_to)
    result = subs(f,respect_to=>num)
    println(f,"において",respect_to,"に",num,"を代入すると:",result)
end

動作確認

微分

:~
$ julia func_calc.jl diff_func 5*x^3+6*x^2+2x+1 x
1 + 2*x + 6*x^2 + 5*x^3をxで1回微分すると:2 + 12*x + 15*x^2
:~
$ julia func_calc.jl diff_func 5*x^3+6*x^2+2x+1 y
1 + 2*x + 6*x^2 + 5*x^3をyで1回微分すると:0

代入

:~
$ julia func_calc.jl subsitution x^2+x+1 x 3
1 + x + x^2においてxに3.0を代入すると:13.0

感想など

Fire.jlでそのまま受け取れると思ったので少し詰まった(typeof()で見ていって解決)

参考URL等

Fire.jl
GitHub - ylxdzsw/Fire.jl: Fire.jl is a library for automatically generating command line interfaces (CLIs) for julia functions.
Fire.jlはgooglepython-fire↓にインスパイヤされたらしい
GitHub - google/python-fire: Python Fire is a library for automatically generating command line interfaces (CLIs) from absolutely any Python object.
SymEngine.jl C++のSymEngineというライブラリのJuliaラッパー
GitHub - symengine/SymEngine.jl: Julia wrappers of SymEngine
Sympy.jl,SymEngine.jl,Reduce.jlで一番スター数が多いのがSymEngine.jl
SymPy.jl vs SymEngine.jl vs Reduce.jl vs - Usage - JuliaLang