mathematica作为数学三巨头(matlab、mathematica和maple)之一,功能涵盖数据可视化、机器学习、图论、符号计算、数值计算、图像处理和自然语言识别等。从mathematica官方帮助文档可以看出其强大之处。在解决数学问题方面,比起matlab,个人更喜欢用mathematica。那么如何在python中调用mathematica解决数学问题呢?官方给出了mathematica和python的接口的帮助文档。
以下通过解决一个简单的概率论问题来展示python调用mathematica的方式。现有10个随机变量,这10个随机变量服从同一分布N(1,3),先要求得这10个随机变量的和所服从的分布,以及和的分布的期望和方差。(这个简单例子只是为了展示python对mathematica的利用。也许纯粹用python自带模块会更加简单)
#以下两行加载mathematica的python模块
from wolframclient.evaluation import WolframLanguageSession
from wolframclient.language import wl, wlexpr,Global
#这一行设置安装在本地的mathematica的核心地址,可设置为免费的wolfram云,即不需要本地安装mathematica。
wlpath="D:\\Program Files\\Wolfram Research\\Mathematica\\11.3\\MathKernel.exe"
sess=WolframLanguageSession(wlpath) #mathmatica会话
#以下代码块,按照mathematica语法输入待计算问题,此处为计算,10个都服从于N(1,3)的随机变量的和,所服从的分布及其期望方差。
exp=wlexpr('''
dist1=NormalDistribution[1,3];
V = Table[Subscript[v, i], {i, 10}];
sum = Total[V];
dist2=TransformedDistribution[sum,Table[Subscript[v, i] \[Distributed] dist1, {i, 10}]]
e=Expectation[x, x \[Distributed] dist2]
d=Variance[dist2]
''')
sess.evaluate(exp)#会话启动,进行计算,类似tensorflow,计算后才有实际值
#计算后所得变量保存在Global里,同样需要计算来获得实际值
dist=sess.evaluate(Global.dist2) #输出元组类型数据
e_d=sess.evaluate([Global.e,Global.d]) #输出元组类型数据
#打印结果
print("结果分布:",dist) #此处按照mathematica语法输出新的分布
print("期望:",e_d[0],"方差:",e_d[1]) #输出新分布的期望和方差
运行结果如下:(此处结果为mathematica语法,其显著特征为函数名首字母都会大写,这与python语法是有区别的)
结果分布: NormalDistribution[10, Times[3, Power[10, Rational[1, 2]]]]
期望: 10 方差: 90
目前本人还在学习中,并且也是第一次发博客,如有纰漏请斧正。