A learning tool for linear algebra
hellomrgeorge / linearalgebramachine Goto Github PK
View Code? Open in Web Editor NEWA learning tool for linear algebra
License: MIT License
A learning tool for linear algebra
License: MIT License
GESolver可以对给定的矩阵实行高斯消元法,使之变为阶梯型
Source: lam/linequ/guasselimination.py
用给定的矩阵mat构造一个求解器
Parameter
无返回,但执行化矩阵阶梯型的操作,并将化阶梯型矩阵的过程存储在求解器对象的course字段中。
LinequSolver用高斯消元法解形如AX = b的线性方程组,无论A是否是方阵都可以求解
Source: lam/linequ/linequsolver.py
用系数矩阵mat和常数项b构造一个求解器
Parameter
当方程AX = b只有唯一解时,solveset不含未知量;有无穷多个解时,会出现自由未知量,自由未知量默认为希腊字母$\tau$;无解时,solveset是sympy.sets.sets.EmptySet类型,即它是空集
无返回,如果构造对象时evaluate=False,则执行一次求解运算,并把结果和过程存储在对象的属性(properties)中。
增广矩阵:C = (A, b)=
\left[\begin{matrix}1 & 1 & 1 & 1\1 & 1 & 1 & 1\2 & 1 & 3 & 2\end{matrix}\right]
\rightarrow
\left[\begin{matrix}1 & 1 & 1 & 1\0 & 0 & 0 & 0\2 & 1 & 3 & 2\end{matrix}\right] \
\rightarrow
\left[\begin{matrix}1 & 1 & 1 & 1\0 & 0 & 0 & 0\0 & -1 & 1 & 0\end{matrix}\right]
\rightarrow
\left[\begin{matrix}1 & 1 & 1 & 1\0 & -1 & 1 & 0\0 & 0 & 0 & 0\end{matrix}\right]
$$
Source: lam/linspace/lincombination.py
判断vect是否是group的线性组合。
Parameter:
Return: bool
如果vect是group的线性组合则返回True,否则返回False。vect的类型应该与group中单个元素的类型相同。
当需要获取线性组合的系数时,可以用coef存储线性组合的系数,以引用参数的形式返回。当存在多组系数可以线性表示vect时,coef只存储一组系数。
Note: 目前该方法只支持vect是MutableDenseMatrix类型
Source: lam/linspace/MLIG.py
该类用于求解一个给定向量组的极大无关组
Parameter:
用向量组group构造一个求解器,向量可以矩阵类型,多项式类型等。(暂时只支持矩阵类型)
无返回,计算给定向量组group的极大无关向量组,结果存储在成员变量中
Return: MLIGSolver
调用filtrate_MLIG()后,返回对象本身,计算过程所需要的内容均可以从成员变量中得到。
引用区块的内容无需显示到网页中(即本句话的区块样式)
筛选法求极大无关向量组
向量组$(a_1, a_2)$线性无关;
向量组$(a_1, a_2, a_3)$线性无关;
向量组$(a_1, a_2, a_3, a_4)$线性相关,因为$\frac{1}{2}a_1+\frac{1}{2}a_2 = a_4$
向量组$(a_1, a_2, a_3, a_5)$线性相关,因为$a_2+a_3 = a_5$
所以极大线性无关组是$(a_1, a_2, a_3)$
这个例子的coefs可以表示为[[], [], [1/2, 1/2, 0], [0, 1, 1]],空列表表示线性无关,非空列表则存储线性组合的系数
Source code: lam/readtext/readtext.py
接收用户输入的字符串形式的矩阵数据text,返回text对应的sympy.matrices.dense.MutableDenseMatrix对象,即一个矩阵。
建议支持python的列表格式,如输入字符串'[[1,2,3],[4,5,6],[7,8,9]]'
,则返回一个3阶矩阵。
具体需要调用的接口,请参考issue二次型模块,该链接的文本中还包含一个规范化二次型的示例,返回的json文件要求包含示例中所有矩阵的latex文本信息
Source code: lam/readtext/latextext
(已实现)
补足了不能sympy不能打印行列式定界符的功能。打印行列式时,可以使用latex(expr, mat_delim = '|')
。expr代表你输入的矩阵对象。
请为网页HOME.html添加求解器功能入口,需要添加的入口包括:行列式展开,Gauss消元,筛选法求极大无关组,特征值和特征向量,矩阵对角化,Schmidt正交化,二次型化标准形。要求功能入口的网页元素占据网页中间位置,调整大小使得网页不要显得太空,并去掉该页面的求解器文本框(因为本页面不需要提供求解功能)。功能入口需要附加相应的url链接,比如行列式展开需要链接到之前编写的行列式网页的url,其他入口先留出url位置,之后再填写。
建议:功能入口可以用块级元素,里面再附加链接元素。
提示:HOME.html在templates文件夹,它是首页的网页文件,在启动服务器后可以通过地址IP:Port直接访问,比如127.0.0.1:8080
该任务的源代码不建议放在lam包内,建议新建文件夹/process作为子程序的目录。
django框架的view模块将常常调用子程序,并且一般使用subprocess模块的run()函数或者Popen()函数调用,调用子程序将写入一个json文件,以便与前端交换数据。
读取用户输入的矩阵文本,并利用lam包的determinant模块求解该行列式,得到返回来的一个字典,并将字典中sympy对象变成latex文本,得到新的字典,再将字典作为数据写入json文件中。
可能要利用的函数
该题目页面应当作为其他题目页面的模板网页,以便之后使用django框架的继承功能,该页面应配合首页的设计风格。
Source code: mysite/template/promblemTemp.html
Source: lam/quad/quadratic.py
二次型模块求解器,用于求二次型的标准型
用矩阵对象构造一个求解器。矩阵必须是对称矩阵,否则不能化标准型
Parameter
返回矩阵的标准型,即矩阵对应二次型的标准型。
Return: MutableDenseMatrix
返回化矩阵的标准型的过程。
Return: List[Tuple[MutableDenseMatrix, MutableDenseMatrix]]
以下面的过程的为例,如果公式不能正常显示,请下载documentation文件夹中对应名字的文档查看。
$
A_0 = \left[\begin{matrix}1 & 3 & 4 & 6\3 & 2 & 3 & 0\4 & 3 & 7 & 8\6 & 0 & 8 & 10\end{matrix}\right]
$
$
T_1 = \left[\begin{matrix}1 & -3 & -4 & -6\0 & 1 & 0 & 0\0 & 0 & 1 & 0\0 & 0 & 0 & 1\end{matrix}\right],
$
配平方项得
$
A_1 = T_1'A_0T_1 = \left[\begin{matrix}1 & 0 & 0 & 0\0 & -7 & -9 & -18\0 & -9 & -9 & -16\0 & -18 & -16 & -26\end{matrix}\right]
$
$
T_2 = \left[\begin{matrix}1 & 0 & 0 & 0\0 & 1 & - \frac{9}{7} & - \frac{18}{7}\0 & 0 & 1 & 0\0 & 0 & 0 & 1\end{matrix}\right],
$
配平方项得
$
A_2 = T_2'A_1T_2 = \left[\begin{matrix}1 & 0 & 0 & 0\0 & -7 & 0 & 0\0 & 0 & \frac{18}{7} & \frac{50}{7}\0 & 0 & \frac{50}{7} & \frac{142}{7}\end{matrix}\right]
$
$
T_3 = \left[\begin{matrix}1 & 0 & 0 & 0\0 & 1 & 0 & 0\0 & 0 & 1 & - \frac{25}{9}\0 & 0 & 0 & 1\end{matrix}\right],
$
配平方项得
$
A_3 = T_3'A_2T_3 = \left[\begin{matrix}1 & 0 & 0 & 0\0 & -7 & 0 & 0\0 & 0 & \frac{18}{7} & 0\0 & 0 & 0 & \frac{4}{9}\end{matrix}\right]
$
get_course()将返回一个列表,列表中的每个元素都是元组,元组中有两个元素分别是变数矩阵T和结果矩阵A。按上面的例子,返回值可以表示为[(
使用startapp命令创建。
请将处理http请求的函数写入views文件,前端会将用户输入的矩阵数据通过POST或GET请求发送到后端,该数据是一个json对象(字典),它包含一个"matrix"
键,该键的值是一个格式化的矩阵文本,该函数通过标准输入接口调用之前写好的程序slvdeter.py,并读取该程序生成的json文件数据作为一个json对象返回到前端。
Source code: lam/eigen/eigenvalue.py
特征值模块求解器,可以求解特征值,特征多项式,特征向量。
将需要求解的矩阵作为参数输入,构造一个求解器。
Parameters
返回矩阵的特征值。
Return: dict
返回值是一个字典,它是存储键值对(特征值:特征值重数),比如{2: 1, 1 - sqrt(3): 1, 1 + sqrt(3): 1}
表示特征值2重数为1,特征值1 - sqrt(3)重数为1,特征值1 + sqrt(3)重数为1。
返回矩阵的特征多项式。
Return: sympy.PurePoly
返回值是PurePoly类,它是sympy模块多项式类的一个子类,使用它的对象方法as_expr()可将它转化为sympy.Expr类。
返回矩阵的一组无关特征向量,每个向量对应一个特征值,如果特征值有n重则向量有n个。
Return: list[tuple]
返回值是元组列表,其中每个元组的格式(特征值, 重数, 特征向量列表)。
返回描述求解矩阵特征向量过程所需的数学元素。
Return: dict
dict含有字段'matrix','charpoly','eigenvectors','matrix'是构造求解器时的矩阵,'charpoly'是getCharpoly()返回值,存储矩阵的特征多项式,'eigenvectors'是getEigenvectors()的返回值,存储矩阵的特征向量,特征值和重数。
判断矩阵是否可对角化
Parameter
Return: bool
该方法是属性方法,将布尔值作为返回,应直接调用is_diagonalizable
得到返回值。
Source code: lam/eigen/diagnoalize.py
对角化求解器,可以求对角化,继承自EigenSolver。
返回矩阵mat的对角矩阵以及过渡矩阵T,$(T^{-1}AT)$。
Return: list
返回值的第一个是过渡矩阵,第二个是对角矩阵。
不定阶矩阵(即中间含省略号的矩阵)的基类,不建议直接用该类的构造方法
Source: lam/mnmatrix/mnmatrix.py
获取矩阵第x行,第y列的元素
Parameter
x, y是获取元素的坐标,行和列的序号以1开始计数,x,y可以是sympy中的Expr, Number, Symbol类。
如要获取倒数第一行,倒数第一列的元素,可以参考以下语句
mat = corner_matrix(tl, tr, bl, br, square=True)
element = mat.get(mat.m, mat.n)
以此类推,倒数第二行可以表示为mat.m-1
。
Source: lam/mnmatrix/cornermatrix.py
一个可定制的不定阶矩阵,该类适用于辅助生成latex代码,不需要严谨的数学逻辑。corner_matrix继承自mn_matrix,包含了mn_matrix所有的成员变量和方法。
在数学文章中,一般的不定阶矩阵只有四个角落的元素会显示,所以该类只开放了编辑矩阵四个角落元素的功能。以下面的矩阵为例,A,B,C,D四个位置的元素是可编辑的内容,A,B,C,D可以不单是一个元素,还可以视为整个矩阵的一个分块矩阵。
用四个角落的分块矩阵构造一个不定阶矩阵
Parameter
tl, tr, bl, br分别代表一个矩阵的左上角,右上角,左下角,右下角的元素,即A,B,C,D四个分块矩阵,这四个必须是MutableDenseMatrix类,即便他们是一个纯粹的数字。square用于标志该矩阵是否是方阵,square=True时,不定阶矩阵将以方阵的形式生成。
继承自mn_matrix的成员变量不做赘述
该方法继承自mn_matrix类,也没有修改父类的任何内容
Source: lam/mnmatrix/mnmatrix.py
用于实现矩阵数乘的类,scalar_mul_matrix继承自mn_matrix,包含了mn_matrix所有的成员变量和方法,故之后重复的成员变量和方法不在叙述。
构造矩阵mat和标量k相乘得到的矩阵对象
Parameter
Source: lam/mnmatrix/mnmatrix.py
用于实现矩阵加法的类,add_matrix继承自mn_matrix,包含了mn_matrix所有的成员变量和方法。
构造矩阵ma和矩阵mb相加得到的矩阵对象
Parameter
Source: lam/mnmatrix/eletran.py
该类实现了矩阵初等行变换:交换m,n行
ele_row_tran_mn继承自mn_matrix,包含了mn_matrix所有的成员变量和方法。
构造矩阵mat交换自身m_ind,n_ind行后得到的矩阵对象
Parameter
Source: lam/mnmatrix/eletran.py
该类实现了矩阵初等行变换:m行乘k
ele_row_tran_km继承自mn_matrix,包含了mn_matrix所有的成员变量和方法。
构造矩阵mat的第m_ind行乘k后得到的矩阵对象
Parameter
Source: lam/mnmatrix/eletran.py
该类实现了矩阵初等行变换:m行乘k
ele_row_tran_kmn继承自mn_matrix,包含了mn_matrix所有的成员变量和方法。
构造矩阵mat的第m_ind行乘k后加到n_ind行得到的矩阵对象
Parameter
同样的,也有对应的初等列变换,它们分别是ele_row_tran_mn, ele_row_tran_km, ele_row_tran_kmn这三个类,用法和行变换相同。
Source: lam/mnmatrix/lammatrix
定义了单位矩阵,继承自mn_matrix,用于调试和后续拓展。
构造一个单位矩阵。
Source: lam/mnmatrix/lammatrix
定义了三对角矩阵,即主对角线和次对角线不为0的对称矩阵。
构造一个三对角矩阵。diag, diag2nd分别指主对角,次对角上的元素
Parameter
Source: lam/mnmatrix/lammatrix
定义了一个典型的循环矩阵,即1到n的序列在每行不断循环的矩阵。
构造一个典型的循环矩阵。
getCharpoly()
getEigenvalues()
getEigenvectors()
getEigenvectorsCourse()
注1: 前端发送的矩阵数据存储在json对象中的
'matrix'
键当中,返回时也请返回一个json对象,json对象包含必要latex文本形式的数学元素,其键值对可能有多个,请自行斟酌名字,并在issue上或者文档中附带必要的说明。注2:实现过程中可能用到的方法已备注在每一条的末尾,详情查看特征值模块概述。
注3: 虽然
getEigenvectorsCourse()
已经给出了过程中必要的数学元素,但是部分过程还需进一步补全,请参照下面的图示。需要补充的矩阵数据可以简单地用的sympy的加减和代入实现。没有框出的数学元素和已框出的是类似的,如倒数第二行的矩阵是需要补充的。补充完这些矩阵后,请一并作为第四条功能的返回。
Source code: lam/inverse/inverse.py
逆矩阵的求解器,可以用Gauss-Jordan消元法求逆矩阵,以及输出消元过程
将需要求解的矩阵作为参数输入,构造一个求解器。
Parameters
获取用Gauss-Jordan消元法对mat求逆的过程,返回一个列表。
直接返回mat的逆矩阵。
你可以通过向地址
{% url 'eigenCourse' %}
(django中有提到这个形式的url)发送矩阵文本,从而得到后端返回的数据,对数据的内容如有疑问,可以询问 @half-lang 。
特征值模块后端的图片示例中,前三行是在求解特征多项式的根,后面每两行求解一个根对应的特征向量。
用户在问题输入框输入文本,按下相应按钮后,前端可以通过表单或者ajax技术以GET或POST请求的形式,实现对数据的发送,发送的数据应该是一个json对象,它包含一个"matrix"字段,这个字段用于存储用户输入的文本。相关的url链接可以暂时空置,待后端定义好后填上。
前端接收到后端发送的json对象后,将该对象解包,对象的元素只有字符串数据,它满足latex语法,可以被MathJax组件转换为数学文本。将解包后的元素放到答案显示区,适当排版使得有所间隔即可,之后看效果再做调整。
Source: latexparser
请在根目录新建latexparser库以完成任务,不要引用lam库的功能防止交叉引用。
latex语法分析器需要提供一个接口,接收str
类型的参数,返回sympy.MutableDenseMatrix
类型的对象。因为前端发送的数据到目前为止总是矩阵形式的文本,如
[[1, 2, 3], [3.3, 5.2, 1.3], [7, 11, 32]]
所以需要矩阵形式的返回值,故建议使用sympy.MutableDenseMatrix
作为返回值。返回的矩阵的每个元素都应属于sympy库当中的类型,这些元素对应着输入的文本参数的每个单元。对于之前举的例子,它每个单元对应的类型就是(省略sympy前缀)
[[Integer, Integer, Integer], [Float, Float, Float], [Integer, Integer, Integer]]
这个例子,并没有涉及任何latex命令,详细的每个数学元素与sympy类型对应关系可以参考后面的类型对照表,注意latex命令的反斜杠字符,如\sqrt
,请不要变成转义字符。
此外除了一般形式的矩阵文本,latex语法分析器也应支持解析latex语法的矩阵文本(\left[\begin{matrix} ... \end{matrix}\right]
),仍然用第一个例子,它的latex语法是
\left[\begin{matrix} 1 & 2 & 3 \\3.3 & 5.2 & 1.3 \\7 & 11 & 32 \end{matrix}\right]
如果前端发送的latex矩阵形式的文本,那么接口也应返回相应的MutableDenseMatrix
对象。
类型一栏均省略了sympy的前缀,具体内容请查询sympy文档
数学元素 | 示例 | 类型 | 备注 |
---|---|---|---|
整数 | 10 | Integer | 纯数字文本 |
小数 | 10.1 | Float | 纯数字文本 |
拉丁字母 | a | Symbol | 不要用Symbol的构造函数创建,而是用sympy.abc的内建对象创建,它已经内置了所有拉丁和希腊字母 |
希腊字母 | \epsilon | Symbol | 用sympy.abc的内建对象创建,示例对应的内建对象是sympy.abc.epsilon |
加法 | a+b | Add | 加法需要兼容字母运算 |
减法 | a-b | Add | a减b视为加-b |
乘法 | ab | Mul | 乘法需要兼容字母运算 |
乘方 | a^{b} | Pow | 乘方需要兼容字母运算, 当指数只有一个字符可以省略大括号,如a^b |
分式 | \frac{a}{b} | Mul | a除以b视为乘b^{-1},故用Mul类型 |
根式 | \sqrt{a} | Pow | 开方视为1/2次幂 |
除了以上提到的内容,显然还有对数,三角函数等数学元素,我们分阶段实现,这些内容可以放到后面拓展。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.