加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

【方法与技巧】在jupyternotebook输出latex公式的几种方法

(2020-12-06 11:27:12)
分类: 方法与技巧

1、方法一:配置并启用mathjax.js

在jupter notebook环境(adaconda)中配置并启用mathjax.js,将cell的设置称为markdown标记,在标记中输入latex文本,latex形式的输出原理是用mathjax.js解析。示例如下:

\begin{bmatrix}
0 & 0\\
0 & 0\\
0 & 0\\
0 & 1\\
2 & 3\\
4 & 5\\
0 & 0\\
0 & 0\\
0 & 0
\end{bmatrix}

$$
DME = \begin{bmatrix}
0 &0 &0 &0 &2 &3 &0 &1\\
0 &0 &0 &0 &4 &5 &2 &3\\
0 &1 &2 &3 &0 &0 &0 &0\\
2 &3 &4 &5 &0 &0 &0 &0
\end{bmatrix}
$$
运行即得latex的显示公式。
 
特点:用户输入的是标记,需要输入latex字符串,正确性由用户自己确认,用户需要熟悉latex的语法;或者将如matlab、mathmatics、word等软件产生公式的latex字符串拷贝。


2、方法二:使用sympy模块


将cell设置为代码,引用sympy模块,latex的输出解析方法不明,猜想应该是使用了mathjax.js,但是用户在配置jupter notebook环境时很可能未配置mathjax.js,也可能是sympy模块安装时同时安装了mathjax.js,如果显示不成功配置即可。

sympy的display函数的原理是将函数的表达式树转换成latex字符串。示例如下:

from sympy import *

init_session()

r, s = symbols("r s")
N = S(1)/4 *Matrix([
[(1 - r)*(1 - s)],
[(1 + r)*(1 - s)],
[(1 + r)*(1 + s)],
[(1 - r)*(1 + s)]])

dHdr = zeros(2, 4)
for cont in range(4):
    dHdr[0, cont] = diff(N[cont], r)
    dHdr[1, cont] = diff(N[cont], s)

#显示变量dHdr 的letex公式
display(dHdr)
#显示变量dHdr化简后的letex公式
display( simplify(dHdr))
#显示变量dHdr的latex字符串,显示的字符串如果要单独使用,将两个斜杠替换成一个斜杠
display( latex(dHdr))

特点:用户输入是代码,不用手工输入latex字符串,正确性由程序编译负责。难以构造积分导数之类的latex输出。

又一个例子:
from sympy import *
init_session()

#定义变量
alpha, b, c = symbols("alpha b c")
#定义函数表达式
X = (-b + b**2 - 4*alpha*c) / (2*alpha*sin(b)*pi)/7*(alpha+1)*cos(b)
#定义矩阵
Y = Matrix([
[X],
[X+1]])

#显示latex公式
X
Y
Y.T
Y *Y.T

#输出latex的字符串
latex(X)
latex(Y)
latex(Y.T)
latex(Y *Y.T)


3、使用latexify模块


anaconda安装包未缺省导入latexify模块,需要下载安装。将cell设置成代码,latexify的原理是将函数定义体的语法树转换成latex。示例如下:

import math
import latexify

@latexify.with_latex
def solve(a, b, c):
    return (-b + math.sqrt(b**2 - 4*a*c)) / (2*a)

"输出函数的计算结果"
print(solve(1, 4, 3))
"输出函数公式的latex字符串"
print(solve)
"输出函数公式的latex形式"
Solve

"又一个示例"
@latexify.with_latex
def sinc(x):
    if x == 0:
        return 1
    else:
        return math.sin(x) / x

print(sinc)
print()
sinc

特点:用户输入是代码,不用手工输入latex字符串,正确性由程序编译以及latexify负责,如果变量的名称是alpha之类,会自动显示为希腊字符。难以构造积分导数之类的latex输出。函数的定义只解析python中math模块的原生函数,如果包含用户的自定义函数,只解析函数名称。

复杂一些的示例:

import math
import latexify

@latexify.with_latex
def solve(alpha, b, c):
    if b == 0:
        return b+c
    elif b == 1:
        return b-c
    else :
        return (-b + math.sqrt(b**2 - 4*alpha*c)) / (2*alpha)

@latexify.with_latex
def plus(alpha,delta):
    return alpha+delta

@latexify.with_latex
def minus(a,b):
    return a-b

@latexify.with_latex
def times(a,b):
    return a*b

@latexify.with_latex
def devide(a,b):
    return a/b

@latexify.with_latex
def F(x,y,op):
    if op == 0:
        return plus(x,y)/x
    elif op ==1:
        return minus(x,y)/x
    elif op ==2:
        return times(x,y)/plus(x,y)
    elif op ==3:
        return devide(x,y)/x    
    elif op ==4:
        return solve(x-1, x, y)    

    else :
        return math.sin(x) / x

#输出latex字符串
print(F)
#输出latex公式
F
solve
plus
minus
times
devide



0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有