如何解决Sympy 和 Scipy/Numpy
我刚刚开始自学线性代数,并且正在尝试自学一些基本的 Python 模块。如果可以的话,我决定学习 Scipy 和 Numpy 的线性代数组件,以及一些 Sympy。
我遇到过如下练习:
我已经手动解决了第一步(我相信):
我想使用 Numpy 和/或 Scipy 以及 Sympy 来解决这个问题。我今天花了一些时间试图找出使用什么结构来解决这个问题(显然是 Numpy 数组,然后是 Sympy 矩阵),但我不确定如何将其转换为三角形数组。我在求解方面看到了很多,但没有什么可以简单地产生上三角系统。
有人对使用其中一个或所有软件包执行此操作有任何建议吗?
解决方法
除上述之外,我还注意到 here 关于对矩阵进行基本运算。这样做似乎总是很尴尬,您可能会写一些东西来帮助您在学习如何使用矩阵时更自然地工作。下面是一个 do
例程,它可能是这样的帮手或如何编写自己的建议:
def do(self,s,i,j,k=1):
"""return self after doing row (`s` starts with 'r') or column (`s` starts with 'c') operation.
Examples
========
>>> from sympy import Matrix
>>> Matrix.do = do
>>> m = Matrix(3,3,list(range(9))); m
Matrix([
[0,1,2],[3,4,5],[6,7,8]])
swap rows 0 and 1
>>> m.do('rs',1)
Matrix([
[3,[0,8]])
To row 0,add row 1 multiplied by 2
>>> m.do('ra',2)
Matrix([
[6,9,12],8]])
Multiply row 0 by 2
>>> m.do('rm',2)
Matrix([
[0,2,4],8]])
To operate on columns,replace the 'r' with 'c' in the
examples above.
If you want to keep working with the modified matrix
you can either re-assign the output to the variable used for
the original matrix (e.g. `m = m.do('rs',1)`) or make the
modifications in place by appending an 'i' to `s`:
>>> m.do('rsi',1)
>>> m
Matrix([
[3,8]])
>>> m.do('csi',1)
>>> m
Matrix([
[4,[1,[7,6,8]])
"""
rc,op = s.lower()[:2]
assert op in 'sma'
assert rc in 'rc'
if len(s) > 2:
# in place
if rc == 'r':
if op == 's':
self.row_swap(i,j)
elif op == 'm':
self.row_op(i,lambda v,_: v*j)
else:
self.row_op(i,_: v + self[j,_]*k)
else:
if op == 's':
self.col_swap(i,j)
elif op == 'm':
self.col_op(i,_: v*j)
else:
self.col_op(i,_: v + self[_,j]*k)
else:
f = getattr(self,'elementary_%s_op' % (
'row' if rc=='r' else 'col'))
if op == 's':
return f('n<->m',None,j)
elif op == 'a':
return f('n->n+km',k,j)
else:
return f('n->kn',j)
,
In [731]: arr = np.array([[2,-3,3],[4,-5,7],[2,-1,5]])
您可以通过以下两个步骤完成:
减去第一行的倍数:
In [732]: arr -= arr[0,:]*np.array([0,1])[:,None]
In [733]: arr
Out[733]:
array([[ 2,[ 0,1],2]])
减去第二行的倍数:
In [734]: arr -= arr[1,2])[:,None]
In [735]: arr
Out[735]:
array([[ 2,0]])
但我不确定这对你学习线性代数有帮助。虽然我想出了如何去做,但这不是我们在使用 numpy
时通常会做的事情。
我不确定您到底想做什么,但这是您在 SymPy 中执行一些基本线性代数例程的方法:
In [1]: import sympy as sym
In [2]: M = sym.Matrix([[2,5]])
In [3]: M
Out[3]:
⎡2 -3 0 3⎤
⎢ ⎥
⎢4 -5 1 7⎥
⎢ ⎥
⎣2 -1 -3 5⎦
In [4]: M.echelon_form()
Out[4]:
⎡2 -3 0 3⎤
⎢ ⎥
⎢0 2 2 2⎥
⎢ ⎥
⎣0 0 -20 0⎦
In [5]: M.rref()
Out[5]:
⎛⎡1 0 0 3⎤ ⎞
⎜⎢ ⎥ ⎟
⎜⎢0 1 0 1⎥,(0,2)⎟
⎜⎢ ⎥ ⎟
⎝⎣0 0 1 0⎦ ⎠
In [9]: sym.linsolve(M)
Out[9]: {(3,0)}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。