from IPython.display import display
from sympy import *
前置知识
理解这份笔记的内容需,读者需要具备基础的python知识并且对函数,微积分和矩阵有一定的基础。
辅助函数
由于后面的笔记中, 我们会大量将一个Sympy object和应用某个函数之后,调用某个方法之后, 或是和执行计算之后的结果比较。 为了减少代码的重复,我编写了helper.py帮忙做这事。
from helper import comparator_factory
func_comparator = comparator_factory('应用函数{}前:','使用后:')
comparator_factory返回的comparator是一个函数, 他否则使用的语法是comparator(target, func, *args, *kwargs)。 target是待处理的Sympy对象, func是希望应用的Sympy函数,args,kwargs是传给func的额外位置参数和关键字参数。
from helper import comparator_method_factory
method_comparator = comparator_method_factory('Before calling {}:','After:')
comparator_method_factory返回的使用的语法是comparator(target, method_name, *args, *kwargs)。 target是待处理的Sympy对象, method_name是希望调用的方法的名字,args,kwargs是传给调用方法的额外位置参数和关键字参数。
from helper import comparator_eval_factory
eval_comparator = comparator_eval_factory('计算前:','计算后')
comparator_eval_factory返回的comparator使用的语法是comparator(uneval)。 uneval是未执行计算的Sympy object。
符号计算是什么?
Sympy能以符号形式进行数学计算。数学表达式中未经计算的变量可以以符号的形式存在。我们看下面的例子。首先,我们用python的内置函数计算开方,我们可能会这么做。
from math import sqrt
sqrt(8)
2.8284271247461903
这个结果并不能精确的表达$\sqrt{8}$而且我们也很难从这一大串float数值推出原来的表达式是什么。这就是为什么我们需要符号计算。在像Sympy这样的符号计算系统中,不能准确表达的开发运算会保留未经计算的符号形态。
from sympy import sqrt
sqrt(8)
2*sqrt(2)
更好的显示效果
上面的例子中,结果很棒。但是在Jupyter中的显示效果看起来并不怎么样。如果我们要更好的显示效果,可以调用sympy.init_printing()方法
from sympy import init_printing
init_printing()
sqrt(8)
$2 \sqrt{2}$
看上去棒极了!!
对变量进行符号计算
Sympy能够对包含符号变量的表达式进行计算。下面是个例子。
from sympy import symbols
x, y = symbols('x y')
expr = x + 2*y
expr
$x + 2 y$
Sympy能自动应用一些明显的化简。 所以下面的例子里,我们得到的结果是$y$而不是$x+2y-x-y$
expr-x-y
$$y$$
如果没有像Sympy这样的符号计算系统的帮助,我们是实现不了这样的效果的。因为大部分情况下,编程语言都没法去处理一个没有赋上具体值的变量。
Sympy的效果演示
为了满足你的好奇心,下面挑了一小部分例子,演示Sympy在符号计算的威力。 先创建一写符号变量。
x, t, z, nu = symbols('x t z nu')
求微分
计算$\sin{(x)}e^x$的微分
s = Derivative(sin(x)*exp(x),x)
eval_comparator(s)
计算前:
$$\frac{d}{d x}\left(e^{x} \sin{\left (x \right )}\right)$$
计算后
$$e^{x} \sin{\left (x \right )} + e^{x} \cos{\left (x \right )}$$
求积分
计算$\int(e^x\sin{(x)} + e^x\cos{(x)})\,dx$
s = Integral(exp(x)*sin(x) + exp(x)*cos(x))
eval_comparator(s)
计算前:
$$\int e^{x} \sin{\left (x \right )} + e^{x} \cos{\left (x \right )}\, dx$$
计算后
$$e^{x} \sin{\left (x \right )}$$
计算$\int_{-\infty}^\infty \sin{(x^2)}\,dx$
s = Integral(sin(x**2),(x,-oo,oo))
eval_comparator(s)
计算前:
$$\int_{-\infty}^{\infty} \sin{\left (x^{2} \right )}\, dx$$
计算后
$$\frac{\sqrt{2} \sqrt{\pi}}{2}$$
计算$\lim_{x\to 0}\frac{\sin{(x)}}{x}$
求极限
s = Limit(sin(x)/x, x, 0)
eval_comparator(s)
计算前:
$$\lim_{x \to 0^+}\left(\frac{1}{x} \sin{\left (x \right )}\right)$$
计算后
$$1$$
求解 $x^2 - 2 = 0$
求解等式
s = Eq(x**2 - 2, 0)
func_comparator(s, solve, x)
应用函数solve()前:
$$x^{2} - 2 &