文章目录
行列式可以用来解线性方程组。对于常数项都是0并且系数矩阵是个方针的齐次线性方程组来说,如果行列式不为0,那么方程组只有零解,行列式为零的话,则有无穷个解。对于常数项不为0的非齐次线性方程组,那就复杂了。如果系数矩阵是个方阵,这时候可以用到克拉默法则,但是我不建议使用克拉默法则,因为计算量太大了。具体为什么计算量大,且让我慢慢说。
克拉默法则Cramer’s rule说的是对于系数矩阵为方阵的方程组来说,如果行列式不为0,那么方程的解为:
x
i
=
∣
B
i
∣
∣
A
∣
x_i=\frac{|B_i|}{|A|}
xi=∣A∣∣Bi∣
B
i
B_i
Bi是什么?
B
i
B_i
Bi就是将常数项代替系数矩阵的第
i
i
i列形成的新矩阵。所以我说计算量大嘛,对于一个
n
n
n元方程组来说,这得计算
n
+
1
n+1
n+1次行列式,简直就是折磨。解方程还是高斯消元最香,计算量小。
我举个用克拉默法则解方程的例子:
(
−
1
1
−
1
2
1
−
1
2
2
1
1
2
−
1
2
−
1
1
1
)
x
=
(
1
3
4
5
)
∣
−
1
1
−
1
2
1
−
1
2
2
1
1
2
−
1
2
−
1
1
1
∣
=
21
x
=
(
∣
1
1
−
1
2
3
−
1
2
2
4
1
2
−
1
5
−
1
1
1
∣
21
∣
−
1
1
−
1
2
1
3
2
2
1
4
2
−
1
2
5
1
1
∣
21
∣
−
1
1
1
2
1
−
1
3
2
1
1
4
−
1
2
−
1
5
1
∣
21
∣
−
1
1
−
1
1
1
−
1
2
3
1
1
2
4
2
−
1
1
5
∣
21
)
=
(
3
2
0
1
)
\begin{pmatrix}-1 & 1 & -1 & 2\\ 1 & -1 & 2 & 2\\ 1 & 1 & 2 & -1\\ 2 & -1 & 1 & 1\\ \end{pmatrix}x=\begin{pmatrix}1\\ 3\\ 4\\ 5\\ \end{pmatrix}\\ \begin{vmatrix}-1 & 1 & -1 & 2\\ 1 & -1 & 2 & 2\\ 1 & 1 & 2 & -1\\ 2 & -1 & 1 & 1\\ \end{vmatrix}=21\\ x=\begin{pmatrix} \frac{ \begin{vmatrix}1 & 1 & -1 & 2\\ 3 & -1 & 2 & 2\\ 4 & 1 & 2 & -1\\ 5 & -1 & 1 & 1\\ \end{vmatrix}}{21}\\ \frac{ \begin{vmatrix}-1 & 1 & -1 & 2\\ 1 & 3 & 2 & 2\\ 1 & 4 & 2 & -1\\ 2 & 5 & 1 & 1\\ \end{vmatrix}}{21}\\ \frac{ \begin{vmatrix}-1 & 1 & 1 & 2\\ 1 & -1 & 3 & 2\\ 1 & 1 & 4 & -1\\ 2 & -1 & 5 & 1\\ \end{vmatrix}}{21}\\ \frac{ \begin{vmatrix}-1 & 1 & -1 & 1\\ 1 & -1 & 2 & 3\\ 1 & 1 & 2 & 4\\ 2 & -1 & 1 & 5\\ \end{vmatrix}}{21}\\ \end{pmatrix}=\begin{pmatrix}3\\ 2\\ 0\\ 1\\ \end{pmatrix}
−11121−11−1−122122−11
x=
1345
−11121−11−1−122122−11
=21x=
21
13451−11−1−122122−11
21
−11121345−122122−11
21
−11121−11−1134522−11
21
−11121−11−1−12211345
=
3201
直接按照公式来计算就行了:
# 克拉默法则求方程组的解
def cramer(self, values):
det = self.cofactor_expansion()
if det == 0:
return
result = [0 for _ in self.__vectors]
for i, vector in enumerate(self.__vectors):
array = copy.deepcopy(self.__vectors)
array[i] = values
matrix = Matrix(array)
result[i] = matrix.cofactor_expansion() / det
return result
测试代码:
# _*_ coding:utf-8 _*_
import unittest
from com.youngthing.mathalgorithm.matrix import Matrix
class MyTestCase(unittest.TestCase):
def test(self):
a = Matrix(
[[-1, 1, 1, 2],
[1, -1, 1, -1],
[-1, 2, 2, 1],
[2, 2, -1, 1]
])
print("A=", a.to_latex())
values = [1, 3, 4, 5]
print(Matrix([values]).to_latex())
cramer = a.cramer(values)
print(Matrix([cramer]).to_latex())
if __name__ == '__main__':
if __name__ == '__main__':
unittest.main()
其实克拉默法则不是用来解方程的,而是用来判断方程组有没有解的。因为克拉默法则要除于系数矩阵的行列式,所以可以用行列式是否为0来判断方程有没有解,有多少个解。但是有比行列式更好的东西可以用来分析方程组解的情况,这就是接下来我要介绍的——矩阵的秩。
即使作为经验丰富的JS开发人员,我也经常对对象的浅拷贝和深拷贝感到惊讶。对于主要对象类型,当JavaScript值是按引用而不是按值复制时,是否有任何经验法则?例如,我知道字符串值总是按值而不是引用进行复制。 最佳答案 在JavaScript中,所有对象都是“通过引用”存储和传递的。vara={v:'a'},b={v:'b'};a=b;b.v='c';a和b将引用同一个对象;a.v=='c'和b.v=='c'。原始数据类型(string、number、boolean、null和undefined)是不可变的;它们按值传递。vara=
如果我使用属性View在XML模式中编写多行文档,它会创建包含它的标签。每当我格式化文件(CTRL+SHIFT+F)时,除了第一行之外的所有行都缩进,有时由于这种缩进而换行。这种缩进和换行有效地破坏了从文件生成美观文档的所有努力。特别是如果我想记录一个允许值的表。格式化前:1stlineofcomment2ndlineisindentedandalsowrappedasitexceedsthemaxlinelengthsetting.3rdlineisjustindented.格式化后:1stlineofcomment2ndlineisindentedandalsowrappedasi
我正在尝试在Windows上测试一些异步功能。我正在使用Python3.7。这会提示一些NotImplementedErrorimportasyncioimportosimporttimeimportsys#thisworksasyncdefsay_after(delay,what):awaitasyncio.sleep(delay)print(what)#thisdoesn'tasyncdeftest_async(num):print('Task#{0}start'.format(num))proc=awaitasyncio.create_subprocess_shell('C:/P
我已将python.exe重命名为python37.exe以避免与其他版本冲突。它适用于运行python,但如果我运行pip37.exe(位于/Scripts),我会收到以下错误:Fatalerrorinlauncher:Unabletocreateprocessusing'"c:\python37-32\python.exe""C:\Python37-32\Scripts\pip37.exe"有没有办法让python.exe重命名为python37.exe,但保持所有python工具正常工作? 最佳答案 这听起来像是个坏主意。有些
我安装了Python3.6.3和Python3.7,当我尝试使用3.6.3设置虚拟环境时,它抛出一个错误,尽管尝试遵循SO的建议,但似乎正在调用Python3.7下面列出的链接。Windows10并首先检查Python3.6.3可执行文件的位置:C:\>py-3.6Python3.6.3(v3.6.3:2c5fed8,Oct32017,18:11:49)[MSCv.190064bit(AMD64)]onwin32importsysprint(sys.executable)#C:\Python\python.exe现在遵循来自here的已接受答案:C:\>mkdirpyvirtenv&&
我正在尝试使用Python3.7获取系统用户的登录时间。我已经尝试过win32net和Python的平台模块,但是平台模块中没有定义函数,Win32net与Python3等不兼容。我尝试了以下代码:importplatformplatform.uname()importplatformos_name=platform.uname()[0].lower()ifos_name=="windows":get_win_login_time()elifos_name.endswith("nix"):get_nix_login_time() 最佳答案
我刚刚将我的python版本更新到3.7,但每次我激活我的virtualenv时,我都会收到以下错误消息:参数格式不正确-65001有人知道这是什么意思以及如何解决这个问题吗?提前致谢! 最佳答案 我目前遇到了同样的问题。请查看本页here还有这个bugreport.Theissuecanbesolvedbymodifyingthecodepagegrepofactivate.bat:for/f"tokens=2delims=:."%%ain('"%SystemRoot%\System32\chcp.com"')do(...只需添加
我正在寻找在IEnumerables上调用ToList/ToArray/MemoizeAll(Rx)的经验法则,而不是在返回时返回查询本身IEnumerable的东西。我经常发现最好只返回查询并让调用者决定是否需要列表,但有时由于linq的懒惰特性,它可能会回来咬你一口。我想收集指南,例如:CallToListif:youcreatenewobjects(eg.inaselect)youhavesideeffectsinyourqueryOtherwise,returnthequery 最佳答案 首先,您永远不应该在查询中产生副作用
我正在玩Backbone.js和Backbone.Marionette我想知道trigger和触发方法。特别是,是否有任何经验法则来决定何时使用前者或后者?例如,在我看来,事件对于DOM元素与其View之间的通信很有用。triggerMethod在Marionette中用于更新级联不同的组件,例如布局调用show方法给它的子元素(子元素响应onShow)。所以,对我来说,这与在其上调用直接方法相同。这是真的吗?触发器呢?提前致谢。 最佳答案 没有太大的区别,这只是取决于你想做什么......trigger会触发一个事件trigger
lawofnon-contradiction规定两个相互矛盾的陈述不能同时为真。这意味着表达式(a&&!a)(a==!a)(a===!a)应该总是计算出一个假值,并且(a||!a)应该始终评估为真值。幸运的是,Javascript是一种有趣的语言allowsyoutodoallsortsofsickthings.我和某人打赌说有可能说服Javascript打破不矛盾法则,或者至少令人信服地让它看起来像是违反了不矛盾法则。现在,我正在尝试使上述所有四个代码示例都给出意想不到的结果。解决这个问题的好方法是什么? 最佳答案 我能做的最好的