Symbolics.jl 简单使用
Contents
Symbolics.jl 简单使用
由于文档太难看懂,我这里简单地介绍下这个包的用法
变量符号
生成变量符号,只需要
@variables x y
这样,我们就有两个符号为 x
, y
的变量
变量表达式
用表达式生成符号变量
如同写一个算数表达式 1+1
一样,Julia 为符号变量类型重载了运算符,这里创建一个变量 p
,
用其来代表
p = -16x^2 + 100
注意, p
也是一个符号变量
用函数生成符号变量
或者我们还可以这样声明 p
f(x) = -16x^2 + 100
p = f(x)
替换表达式
写好了表达式还不够,有时候我们将其中一个函数看作另一个函数的参数,比如 f(g(x))
substitude(p, x => x^2)
得到结果为 -16x^4 + 100
如果是多元函数,替换的部分用字典来替代
简化/展开表达式
简化表达式,使用 simplify
函数,但是这个包里没有提供单独的 展开 函数,还好 simplify
有一个 expand
参数,为 true
时展开表达式,来看一个例子
@variables a b c x
quad = a*x^2 + b*x + c
quad + quad^2 - quad^3
simpify(quad, expand=true)
# julia> simplify(ans,expand=true)
# c + b*x + c^2 + (a + b^2)*(x^2) + (a^2)*(x^4) + 2a*c*(x^2) + 2b*c*x + 2a*b*(x^3) - (c^3) - (a^3)*(x^6) - (b^3)*(x^3) - 3a*(c^2)*(x^2) - 3a*(b^2)*(x^4) - 3b*x*(c^2) - 3c*(b^2)*(x^2) - 3c*(a^2)*(x^4) - 3b*(a^2)*(x^5) - 6a*b*c*(x^3)
求导表达式
与求导相关的函数是 Differential
,中文意思 微分
@variables t
D = Differential(t)
声明一个变量符号 t
, 再声明一个变量 D
代表有关 t
的微分
接着,声明有关 t
的表达式,调用 D(z)
得到导数表达式
z = t + t^2
D(z)
然而求导部分是惰性的,怕消耗太多时间,需要调用 expand_derivatives
来获取表达式
expand_derivatives(D(z)) # 1 + 2t
生成 Julia 函数
表达式可以看作函数的简化版本,比如
p = -16x^2 + 100
我们直接调用 p(1)
是会报错的,我们需要根据他来生成一个函数调用
f_expr = build_function(p, x)
f_func = eval(f_expr)
f_func(1) # 84
build_function
需要一个表达式,和其参数变量表- 如果是
f(x, y)
,应该输入build_function(f, x, y)
- 如果是
f([x, y])
, 应该输入build_function(f, [x, y])
build_function
返回的是 Julia 函数的Expr
类型,eval
他即可获得函数
疑问
怎么没有积分啊
这个包里确实没有写积分的函数,不过我已经提了个 Issue 给作者 https://github.com/JuliaSymbolics/Symbolics.jl/issues/532
我都已经给他跪了,不信他不理我