我最近开始使用Jupyter笔记本为Fluid Dynamics课程编写家庭作业。我使用带有Sympy的IPython内核进行符号计算。通常,我需要将符号计算的结果打印为LaTeX输出。例如,请参阅以下代码
import sympy as s
s.init_printing()
from IPython.display import display
r,t = s.symbols('r,theta')
u_x = r*s.sin(t)
display(u_x)
这将在代码下方的单元格中打印$r\sin\theta$
的LaTeX渲染。
有没有我可以在输出前添加$u_x = $
?在此示例中,所需的输出将是
我的目的是在Jupyter笔记本中输出我的display(u_x)
语句应该像LaTeX文档中的常规方程一样。读者不必阅读代码部分以了解我在等式中显示的数量。
答案 0 :(得分:3)
在通过IPython的ast.literal_eval
模块进行扫描之后,事实证明我可以使用下面的函数
display
现在,from sympy import latex
from IPython.display import display_latex
def disp(idx, symObj):
eqn = '\\[' + idx + ' = ' + latex(symObj) + '\\]'
display_latex(eqn,raw=True)
return
提供了所需的输出。
答案 1 :(得分:2)
我想通过创建一个自定义类来提出一个(当然非常难看)的方法:
import sympy as sp
from sympy.printing.pretty.stringpict import prettyForm
class NamedExpression(sp.Expr):
def __init__(self, name, expr=None, **kwargs):
self._symbol = sp.Symbol(name, **kwargs)
self._expr = expr
def assign(self, expr):
self._expr = expr
def as_symbol(self):
return self._symbol
def as_eq(self):
if self._expr is None:
raise RuntimeError('No expression available')
return sp.Eq(self._symbol, self._expr)
def _print_myself(self, printer):
return _print_function(self, printer)
_sympystr = _sympyrepr = _latex = _print_myself
def _pretty(self, printer):
return prettyForm(_print_function(self, printer))
def __getattribute__(self, name):
if name in ['_symbol', '_expr', 'assign', 'as_symbol', 'as_eq',
'_pretty', '_sympystr', '_sympyrepr', '_latex']:
return super().__getattribute__(name)
expr = self._expr
if expr is not None:
return expr.__getattribute__(name)
return self._symbol.__getattribute__(name)
def _print_function(obj, printer):
expr = obj._expr
what = obj._symbol if expr is None else expr
return printer.doprint(what)
使用此课程,您可以创建如下符号:
u_x = NamedExpression('u_x')
您可以在SymPy表达式中使用它,它将像普通符号一样显示。
在某些时候,您可以为此符号指定一些内容:
u_x.assign(r * sp.sin(t))
之后,您可以再次在SymPy表达式中使用它,它的行为就像指定的表达式一样。
如果要显示定义,只需执行
u_x.as_eq()
答案 2 :(得分:1)
我创造了my previous answer稍微不那么丑陋的变体,避免了所有复杂的印刷品。 但是,我失去了以后分配表达式的能力;必须在施工时指定表达式。但这可能不是什么大问题。
我没有定义单个类,而是按需定义自定义类:
import sympy as sp
def named_expression(symbol, expr):
class NamedExpression(type(expr)):
def __new__(cls, sym, ex):
# NB: we don't call the base class' __new__()!
self = object.__new__(cls)
if isinstance(sym, sp.Symbol):
self._symbol = sym
else:
self._symbol = sp.Symbol(sym)
self._expr = ex
return self
def __getattribute__(self, name):
if name in ['_symbol', '_expr', 'as_symbol', 'as_eq']:
return super().__getattribute__(name)
return self._expr.__getattribute__(name)
def as_symbol(self):
return self._symbol
def as_eq(self):
return sp.Eq(self._symbol, self._expr)
return NamedExpression(symbol, expr)
可以像这样使用:
u_x = named_expression('u_x', r * sp.sin(t))
或者,如果您已经有一个名为u_x
的符号,则可以像这样覆盖它:
u_x = named_expression(u_x, r * sp.sin(t))
和以前一样,平等可以这样显示:
u_x.as_eq()
请注意,这与IPython无关,它应该在SymPy可用的任何地方都有效。
答案 3 :(得分:0)
添加
u_x
在输入同情之后。
然后,简单地把
client.js
单元格中的将正确呈现,无需调用显示。
答案 4 :(得分:0)
我一直在使用一种略有不同的方法,该方法直接从赋值语句生成这种输出。我简称为library("xml2")
library("XML")
setwd("/xml")
dir <- dir()
tabela=matrix(NA,nrow=length(a),ncol=1)
for(i in 1:length(dir)){
visitNode <- function(node) {#Recursive Function to visit the XML tree (depth first)
if (is.null(node)) {#leaf node reached. Turn back
return()
}
print(paste("Node: ", xmlName(node)))
num.children = xmlSize(node)
if(num.children == 0 ) {# Add your code to process the leaf node here
print( paste(" ", xmlValue(node)))
}
if (num.children > 0){#Go one level deeper
for (i in 1 : num.children) {
visitNode(node[[i]][["NFe"]]) #the i-th child of node
}
}
}
xmlfile <- dir[i]
xtree <- xmlInternalTreeParse(xmlfile)
root <- xmlRoot(xtree)
dataxml <- visitNode(root)
dataxml <- xmlToList(root)
df<- as.data.frame(matrix(unlist(dataxml$NFe$infNFe$infAdic$infCpl), nrow=length(dataxml$NFe$infNFe$infAdic$infCpl),byrow=TRUE))
或display math operation
。您可以拨打dmo
之类的电话,并在Jupyter笔记本中显示排版输出dmo(p=a*b/c**2)
。
与此同时,我也在研究如何更广泛地扩展sympy函数以显示已完成的操作。我有一些差异化和集成化的工作示例。我希望有时间研究如何将其嵌入sympy中,而不是用螺栓固定。
您可以在mybinder中尝试以下示例: git存储库为https://github.com/gutow/Easy_Pretty_Math。请把建议和问题放在git仓库issues中。