环境
采用的编程方式是网页,会使用javascript
来实现线性代数中的计算方法。
比如文件linearAlgebra.html:1
2
3
4<script>
// 在控制台打印
console.log(123*2)
</script>
写入上面的代码,保存后用浏览器打开,然后右键打开审查元素点击控制台(Console)来查看输出。
更多网页相关知识网上可以搜得到,掌握基本
javascript
编程知识就行了。
解二元线性方程组
行列式
的概念是由解多元线性方程组而引出的。比如下面这个:
在坐标系中就是两根直线,分母为零的情况就是两根直线平行不相交。
1. 绘制坐标系
下面是我用canvas
绘制的坐标系,一般编程中涉及到坐标系的地方,跟数学里有些不同,y轴方向是向下为正。
那么来看看如何绘制出坐标系。下面主要是编程方面的东西,可以自己创建一个.html
文件试一试。
首先,创建canvas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19<html>
<body>
<canvas id="myCanvas"></canvas>
</body>
</html>
<!-- Javascript 代码放在标签script里 -->
<script type="text/javascript">
// 保存canvas的长宽
var W = 800.0, H = 600.0
// 获取canvas对象
var canvas = document.getElementById('myCanvas')
canvas.width = W
canvas.height = H
// 获取canvas的画布context,我们所有的绘制都将在context上完成。
// 这里也可以传3d,那么context就是一个3d的画布
var ctx = canvas.getContext('2d')
</script>
画布创建好后,接下来着手绘制直角坐标系的两根辅助线。
创建一个函数方便之后的重复调用。
1 |
|
moveTo
是设置一个起点,lineTo
是将线从上一个点连接到该点。
stroke
绘制线条,如果fill
,那么会将线包围的区域用颜色涂满。途中的黑色三角形方向标就是这样绘制的,设置三个点后调用fill
。
调用函数后得到下图:
阴影样式需要给canvas
加上一个box-shadow
:
<canvas id="myCanvas" style="box-shadow:1px 1px 10px #666;"></canvas>
2. 绘制坐标系刻度和方向标
同样,分别创建函数来专门绘制刻度和方向标:
1 | // 刻度长度 |
然后在drawCoordinateSystem
函数里追加调用drawScale(ctx, scaleD)
和drawDirectionArrow(ctx, scaleD)
,运行后如图:
如果想要在刻度上绘制数字标记,可以自行搜索相关文档,有一个叫fillText的函数。
3. 绘制直线
a11 * x1 + a12 * x2 = b1
此方程相当于 a * x + b * y = c
。
我们可以根据直线方程找到两个点,将两个点通过moveTo
和lineTo
连接并绘制出来。
1 | //---绘制直线--- |
然后调用该函数绘制:
1 | drawLine(ctx, 1, 1, 123, 'red') |
结果:
4. 求出两直线的交点
说了这么多,现在才开始解方程?😤
大多是基础的绘制工作。数学和编程相结合的地方就是如何根据直线方程绘制直线。
对于方程:
1 | ╭ a11*x1 + a12*x2 = b1 |
当a11*a22 - a12*a21 != 0
时,方程有唯一解:1
2
3x1 = (b1*a22 - a12*b2)/(a11*a22 - a12*a21)
x2 = (a11*b2 - b1*a21)/(a11*a22 - a12*a21)
1 | |a11 a12| |
那么我们就可以根据这个来得出两直线相交的点(x1, x2)
下面一个函数是根据两直线的常数计算出交点。第二个函数是在以(x, y)
为圆心,半径为10,绘制一个圆
1 | /* |
最后,我们的绘制函数大概是这样的:
1 |
|
结果如图:
总结
上面求两直线交点的思路是根据二阶行列式
来解二元线性方程组
。可以看到,行列式
是根据解多元线性方程组
总结出来的。二阶或三阶行列式我们可以比较轻松的计算出结果,但是随着阶数增加,计算量也会越来越大,n
的阶乘
(n*n(n-1)*...*3*2*1
)
我们来看看求二阶行列式
和三阶行列式
的值的计算:
1 | // 计算二阶行列式的值 |
如果是四阶行列式
,那么我们要写4!=24
个。所以我们要想办法简化计算,使用一种通用的方式来计算行列式
的值,而不是一个一个全部写出来计算。
那么编程上如何简化这个计算呢?
下一节将会来解决这个问题。