断断续续的写了五篇了,夸我!
可恶,优不见了
有一说一,矩阵的数值算法不是那么简单的写,我这里会推荐一些学习的资源假如你愿意学的话。
首先是最出名(国内的嗷)的一个教材
其中一个封面是这个
还有一个是这样的
当然了,还有一个黄皮的数值计算的书,和数学建模的封面是一样的。其实我收集了很多相关的图书,只是硬盘不在手边,有机会可以分享一下。
这里推荐一个课程,中科大的,当然没有什么视频资料,不过PPT做的很好。
科大的数值计算
PPT一观
课程的特点
课程研究的东西
关于代码也推荐一本C数值代码,就平平无奇的名字
对于视频的话,这里推荐苏州大学:
妈妈,我在B大学上课
反正万国造
你以后可以这样说,看的清华的教程,翻的中科大的PPT,研究的苏州大学的视频,抄的云深无际的公众号的代码。
不管怎么说,学会就行,一个确定的知识和结论不会随着载体的不一样而便便,因为你学的是本质。
我相信很多人的学校都寡,但是又没有剥夺你学习的权力,所以你不学才是蛋疼的地方。
开始正文了:
对于矩阵求解,我们大体分为,A稠密不稠密:
那么就会演化出来两个解决的办法
感谢CSDN一位作者的总结,绘制了一观漂亮的思维导图
雅克比迭代法的优点明显,计算公式简单,每迭代一次只需计算一次矩阵和向量的乘法,且计算过程中原始矩阵 A (A在上面说明了)始终不变,比较容易并行计算。然而这种迭代方式收敛速度较慢,而且占据的存储空间较大,所以工程中一般不直接用雅克比迭代法,而用其改进方法。
这个迭代法又称为辗转法,是用计算机解决问题的一种基本方法,为一种不断用变量的旧值递推新值的过程,与直接法相对应,一次性解决问题。迭代法分为精确迭代和近似迭代,“二分法”和“牛顿迭代法”属于近似迭代法。迭代法利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。
再说矩阵的求解:
考虑线性方程组Ax = b时,一般当A为低阶稠密矩阵时,用主元消去法解此方程组是有效方法。但是,对于由工程技术中产生的大型稀疏矩阵方程组(A的阶数很高,但零元素较多,例如求某些偏微分方程数值解所产生的线性方程组),利用迭代法求解此方程组就是合适的,在计算机内存和运算两方面,迭代法通常都可利用A中有大量零元素的特点。雅克比迭代法就是众多迭代法中比较早且较简单的一种,其命名也是为纪念普鲁士著名数学家雅可比。
这里总结一句话,雅可比算法是:用于确定严格对角占优的线性方程组的解。
在数学中,如果对于矩阵的每一行,一行中对角线条目的大小大于或等于所有其他(非对角线)的大小之和,则称方阵为对角占优该行中的条目。更准确地说,矩阵A是对角占优的,如果:
定义给出来了
多说无疑,你可以参考这个学习对角占优矩阵
所以这里的A是指非奇异的大规模稀疏矩阵。
什么是稀疏矩阵???毕竟一开始就写了。
概念:在实际问题中,特别是微分方程数值解法中,出现的线性代数方程组的系数矩阵往往系数很高,但其非零元素所占的比例很小,我们常把这类矩阵成为大型稀疏矩阵。
理解:零元素很多的多阶矩阵。
注意:求解此类系数矩阵若使用Gauss消元法常常会破坏矩阵稀疏性,另分解过程中出现大量非零元素。
再插一个:
什么是非奇异阵呢?非奇异矩阵是行列式不为 0 的矩阵,也就是可逆矩阵。意思是n 阶方阵 A 是非奇异方阵的充要条件是 A 为可逆矩阵,也即A的行列式不为零。即矩阵(方阵)A可逆与矩阵A非奇异是等价的概念。
理论的东西先说上面那么多,都是概念,说计算的时候的样子。
首先将方程组中的系数矩阵A分解成三部分,即:A = L+D+U,如下图所示,其中D为对角阵,L为下三角矩阵,U为上三角矩阵。
之后确定迭代格式,X^(k+1) = B*X^(k) +f ,(这里^表示的是上标,括号内数字即迭代次数),如下图所示,其中B称为迭代矩阵,雅克比迭代法中一般记为J。(k = 0,1,......)
再选取初始迭代向量X^(0),开始逐次迭代。
理论是这样的
也就是说,对角线分量D,下三角部分L,和上三角U
伪算法是这样的
其实这个算法除了矩阵符合要求以外,最重要的迭代格式的转换。
我们的线性方程组是这样的
把A可以分解成三个矩阵的加和
最终的迭代格式是这样的
对具体元素的迭代公式是这样
在代码实现的部分,频繁的会看到__future__这个库,SO?是什么。
是这样的
关于annotation其实是一个PEP的提案。
这也就是它的作用
我们对函数的设计是需要两个多维的数组,对应在我们的线性方程组,迭代的初始值也要设计,不然从哪里开始迭代呢?以及想迭代的次数。
对于此函数的一个输入来说是这样的
coefficient = np.array([[4, 1, 1], [1, 5, 2], [1, 2, 4]])
constant = np.array([[2], [-6], [-4]])
init_val = [0.5, -0.5, -0.5]
iterations = 3
jacobi_iteration_method(coefficient, constant, init_val, iterations)
[0.909375, -1.14375, -0.7484375]
看见这种代码其实就有一点优雅
为了确保我们的矩阵可以进行迭代,这里要做大量的参数上面的判断,对于一个算法来讲,正确的结果总是建立在正确的输入上。错误处理统一为值错误。
还缺了一个,迭代次数至少为1次
我们这里要把系数和常数矩阵连在一起,后面的参数在前面的文章里有解释
靓仔记得我上面写的对角占优的事情吗?某种意义上还是在对参数的判断
这代码按说看的懂吧?
对矩阵进行了严密的(笑死)
想了想,就是这么严密的计算,最后给个结论!接下来的迭代可以继续
迭代的次数是参数,接着一个列表来承接中间的值,行列开始计算
这就是迭代公式,最后下次要迭代的初值计算出来
写的有点早了,这样才对,最后是把迭代的值都发出去
现在请返回去再看看函数,可能就不是那么陌生了
前几天给地平线写的文章地平线机器人平台发布浅谈(可能是深谈),获得了一个X3派,今天拿到手了。
里面的内容物
剥皮摆线,重新拍一次
后背
因为在外面鬼混,手头没有内存卡,也测试不了
这里也可以随手抓个靓仔,评测一下体积,真的很小
接下来有时间会来一段时间地平线X3的相关文章,Logo好评
另外地平线的工作人员100昏,对开发者问的问题基本上手把手教了
这里突然发现还能内推地平线
实不相瞒,想去
联系客服