建议从这里下载这篇文章对应的.ipynb文件和相关资源。这样你就能在Jupyter中边阅读,边测试文中的代码。
from IPython.display import display, Math, Latex
from sympy import *
init_printing()
from helper import comparator_factory, comparator_eval_factory, comparator_method_factory
x,y,z = symbols('x y z')
func_comparator = comparator_factory('使用{}前:','使用后:')
method_comparator = comparator_method_factory('调用{}前:','调用后:')
eval_comparator = comparator_eval_factory('计算前:','计算后:')
m = Matrix(
[
[1, -1],
[3, 4],
[0, 2]
]
)
m
如果只传入单层的list,那么会创建一个$n \times 1$矩阵。
m = Matrix([1,2,3])
m
有一些创建常用矩阵的方法。
M = eye(3)
M
通过zero(n)
去创建零矩阵。
M = zeros(3,4)
display(M)
M = ones(3,2)
M
M = diag(-1, ones(2, 2), Matrix([5, 7, 5]))
M
用shape
获得矩阵的形状。
M.shape
M.row(0)
获取单列。
M.col(-1)
M = Matrix([[1, 2, 3], [3, 2, 1]])
display('删除前:',M)
M.row_del(0)
M.col_del(-1)
display('删除后:',M)
M = Matrix([[1, 2, 3], [4, 5, 6]])
display('原矩阵:',M)
display('转职后矩阵:',M.T)
M = Matrix([[1, 2, 3], [3, 2, 1]])
method_comparator(M, 'row_insert', 0, Matrix([[6,6,6]]))
col_insert()
接受位置和$n \times 1$矩阵。
M = Matrix([[1, 2, 3], [3, 2, 1]])
method_comparator(M, 'col_insert', -1, Matrix([6,6]))
M = Matrix([[1, 3], [-2, 3]])
N = Matrix([[0, 3], [0, 7]])
print('M')
display(M)
print('N')
display(N)
print('M+N')
display(M+N)
M = Matrix([[1, 3], [-2, 3]])
N = Matrix([[0, 3], [0, 7]])
print('M')
display(M)
print('N')
display(N)
print('M-N')
display(M-N)
M = Matrix([[1, 2, 3], [3, 2, 1]])
N = Matrix([0, 1, 1])
print('M')
display(M)
print('N')
display(N)
display('MxN')
display(M*N)
M = Matrix([[1, 3], [-2, 3]])
print('M')
display(M)
print('inverse of M:')
display(M**(-1))
M = Matrix([[1, 0, 1], [2, -1, 3], [4, 3, 2]])
method_comparator(M,'det')
M = Matrix([[1, 0, 1, 3], [2, 3, 4, 7], [-1, -3, -3, -4]])
M_rref, pivot_columns = M.rref()
print('原矩阵:')
display(M)
print('阶梯型:')
display(M_rref)
print('主元index:')
display(pivot_columns)
nullspace()
返回一个能够张成矩阵零空间的向量组成的list。
M = Matrix([[1, 2, 3, 0, 0], [4, 10, 0, 0, 1]])
print('原矩阵M:')
display(M)
print('矩阵M的零空间的张成向量:')
display(M.nullspace())
columnspace()
返回一个能够张成矩阵列空间的向量组成的list。
M = Matrix([[1, 1, 2], [2 ,1 , 3], [3 , 1, 4]])
print('矩阵M:')
display(M)
print('张成矩阵M的列空间的向量:')
display(M.columnspace())
M = Matrix([[3, -2, 4, -2], [5, 3, -3, -2], [5, -2, 2, -2], [5, -2, -3, 3]])
print('矩阵M')
display(M)
print('矩阵M的特征值和它们的代数重数:')
display(M.eigenvals())
eigenvectors
返回由特征值,几何重数,特征向量列表组成的tuple。
M = Matrix(
[
[3, -2, 4, -2],
[5, 3, -3, -2],
[5, -2, 2, -2],
[5, -2, -3, 3]
]
)
print('矩阵M')
display(M)
print('特征值,几何重数,特征向量:')
display(M.eigenvects())
如果只是想获得特征多项式, 用charpoly()
和factor()
print('矩阵M')
display(M)
lamda = symbols('lamda')
p = M.charpoly(lamda).factor()
print('矩阵M的特征多项式')
display(p)
M = Matrix(
[
[3, -2, 4, -2],
[5, 3, -3, -2],
[5, -2, 2, -2],
[5, -2, -3, 3]
]
)
P, D = M.diagonalize()
print('矩阵M')
display(M)
print('矩阵P')
display(P)
print('矩阵D')
display(D)
display(Latex('$PDP^{-1}$'))
display(P*D*P**-1)
eq = Eq(x**2-1, 0)
func_comparator(eq, solveset, x)
如果solveset()
中传入一个表达式而非等式, 那么它会被假设等于0,。
expr = x**2-1
func_comparator(expr, solveset, x)
求解结果可以是无限集合。
eq = Eq(sin(x) - 1)
func_comparator(eq, solveset, x)
求解结果可以是空集。
eq = Eq(exp(x))
func_comparator(eq, solveset, x)
如果求解失败,会返回一个条件集合。
eq = Eq(cos(x) - x)
func_comparator(eq, solveset, x)
solveset()
只会显示每个解一次。
eq = Eq(x**3 - 6*x**2 + 9*x,0)
func_comparator(eq, solveset, x)
如果要获得多项等式每个解的重数,可以用roots()
eq = Eq(x**3 - 6*x**2 + 9*x,0)
func_comparator(eq, roots, x)
ls = [
Eq(x + y + z - 1),
Eq(x + y + 2*z - 3)
]
func_comparator(ls,linsolve, x, z)
等式list可以简化成表达式list, 如果这些表达式都等于0。
ls = [
x + y + z - 1,
x + y + 2*z - 3
]
func_comparator(ls,linsolve, x, z)
M = Matrix(
[
[1, 1, 1, 1],
[1, 1, 2, 3]
]
)
func_comparator(M,linsolve, x, y, z)
M = Matrix(
[
[1, 1, 1, 1],
[1, 1, 2, 3]
]
)
ls = A, b = M[:, :-1], M[:, -1]
func_comparator(ls,linsolve, x, y, z)
solvset()
不能解非线性多元系统。 遇到这样的需求用solve()
代替。
eq_list = [
Eq(x*y - 1, 0),
Eq(x-2, 0)
]
func_comparator(eq_list, solve, x, y)
f = symbols('f', cls = Function)
然后定义微分方程,例如,$f''(x) - 2f'(x) + f(x) = \sin(x)$
diffeq = Eq(f(x).diff(x, 2) - 2*f(x).diff(x) + f(x), sin(x))
然后用dsolve()
求解。
func_comparator(diffeq, dsolve, f(x))
如果无法得到显式的解, dsolve()
返回一个隐函数形式。
diffeq = Eq(f(x).diff(x)*(1 - sin(f(x))), 0)
func_comparator(diffeq, dsolve, f(x))