制表球谐函数
Tabulate Spherical Harmonic Functions
嘿,我正在尝试以紧凑的方式表达球谐函数。我不知道如何在 table 中表达这一点 我在列表中得到了 l = 0,1,2 和 m = -l, ...,+l 的球谐函数。但是想要一个 Table 的形式:
m -2 -1 0 1 2
l
0 x
1 x x x
2 x x x x x
有谁知道如何做到这一点,因为我只是想创建更简单的 tables,并使用普通 headers 进行制表。我有列表中的函数 sph_harmonics[].
from sympy import Ynm
from tabulate import tabulate
sph_harmonics = []
for l in range (0, 3):
for m in range(-l, l+1):
print('l =', l)
print('m =',m)
print(sp.simplify(Ynm(l, m, theta, phi).expand(func=True)))
sph_harmonics.append(sp.simplify(Ynm(l, m, theta, phi).expand(func=True)))
Mathjax 本身没有 table
/tabular
环境,但仍然可以为此使用 array
环境 (link1 ; link2 ; link3)。
因此,基于此,我编写了以下名为 fmt_table
的格式化函数,它可以像您提到的那样格式化公式:
from sympy import Ynm, simplify, symbols, latex
theta, phi = symbols('\Theta \phi')
from IPython.display import HTML, display, Math, Latex
def fmt_table(data,center_data=False,add_row_nums=False):
from math import ceil
buf='''
\newcommand\T{\Rule{0pt}{1em}{.3em}}
\begin{array}{%s}
'''
max_cols = max(len(r) for r in data)
column_spec = '|' + '|'.join(['c']*max_cols) + '|'
buf = buf % column_spec
row_idx = 0
for row_data in data:
row = ''
if add_row_nums and row_idx > 0:
row += str(row_idx) + " & "
if center_data and row_idx > 0:
to_add = ceil( (max_cols - len(row_data))/2 )
row += ' & '.join([''] * to_add)
row += ' & '.join(row_data)
if row_idx == 0:
row = '''\hline''' + row + '''\\\hline'''
else:
row += '''\\\hline'''
row += "\n"
buf +=row
row_idx += 1
buf += '''\end{array}'''
# print(buf)
return buf
tbl = []
tbl.append(['\texttt{m/l}','-2','-1','0','1','2'])
for l in range (0, 3):
new_row = []
for m in range(-l, l+1):
h = simplify(Ynm(l, m, theta, phi).expand(func=True))
new_row.append(latex(h))
tbl.append(new_row)
display(Math(fmt_table(tbl,add_row_nums=True,center_data=True)))
输出:
这个答案中的所有代码都是also available here。
嘿,我正在尝试以紧凑的方式表达球谐函数。我不知道如何在 table 中表达这一点 我在列表中得到了 l = 0,1,2 和 m = -l, ...,+l 的球谐函数。但是想要一个 Table 的形式:
m -2 -1 0 1 2
l
0 x
1 x x x
2 x x x x x
有谁知道如何做到这一点,因为我只是想创建更简单的 tables,并使用普通 headers 进行制表。我有列表中的函数 sph_harmonics[].
from sympy import Ynm
from tabulate import tabulate
sph_harmonics = []
for l in range (0, 3):
for m in range(-l, l+1):
print('l =', l)
print('m =',m)
print(sp.simplify(Ynm(l, m, theta, phi).expand(func=True)))
sph_harmonics.append(sp.simplify(Ynm(l, m, theta, phi).expand(func=True)))
Mathjax 本身没有 table
/tabular
环境,但仍然可以为此使用 array
环境 (link1 ; link2 ; link3)。
因此,基于此,我编写了以下名为 fmt_table
的格式化函数,它可以像您提到的那样格式化公式:
from sympy import Ynm, simplify, symbols, latex
theta, phi = symbols('\Theta \phi')
from IPython.display import HTML, display, Math, Latex
def fmt_table(data,center_data=False,add_row_nums=False):
from math import ceil
buf='''
\newcommand\T{\Rule{0pt}{1em}{.3em}}
\begin{array}{%s}
'''
max_cols = max(len(r) for r in data)
column_spec = '|' + '|'.join(['c']*max_cols) + '|'
buf = buf % column_spec
row_idx = 0
for row_data in data:
row = ''
if add_row_nums and row_idx > 0:
row += str(row_idx) + " & "
if center_data and row_idx > 0:
to_add = ceil( (max_cols - len(row_data))/2 )
row += ' & '.join([''] * to_add)
row += ' & '.join(row_data)
if row_idx == 0:
row = '''\hline''' + row + '''\\\hline'''
else:
row += '''\\\hline'''
row += "\n"
buf +=row
row_idx += 1
buf += '''\end{array}'''
# print(buf)
return buf
tbl = []
tbl.append(['\texttt{m/l}','-2','-1','0','1','2'])
for l in range (0, 3):
new_row = []
for m in range(-l, l+1):
h = simplify(Ynm(l, m, theta, phi).expand(func=True))
new_row.append(latex(h))
tbl.append(new_row)
display(Math(fmt_table(tbl,add_row_nums=True,center_data=True)))
输出:
这个答案中的所有代码都是also available here。