科讯怎么建设网站,网页制作学校,广州网站制作网页,网站开发语言分析列主元方法是一种用于求解矩阵逆的数值方法#xff0c;特别适用于在计算机上实现。其基本思想是通过高斯消元法将矩阵转换为上三角矩阵#xff0c;然后通过回代求解矩阵的逆。以下是列主元方法求解矩阵 A A A 的逆的步骤#xff1a; [精确算法] 列主元高斯消元法 步骤 1特别适用于在计算机上实现。其基本思想是通过高斯消元法将矩阵转换为上三角矩阵然后通过回代求解矩阵的逆。以下是列主元方法求解矩阵 A A A 的逆的步骤 [精确算法] 列主元高斯消元法 步骤 1初始化 构造增广矩阵 [ A ∣ I ] [A | I] [A∣I]其中 I I I 是 n n n 阶单位矩阵。 步骤 2列主元选择 对于第 k k k 列 k 1 , 2 , … , n k 1, 2, \ldots, n k1,2,…,n找到列主元即找到 i k i_k ik 使得 ∣ a i k , k ∣ max i ≥ k ∣ a i , k ∣ |a_{i_k,k}| \max_{i \geq k} |a_{i,k}| ∣aik,k∣i≥kmax∣ai,k∣ 如果 i k ≠ k i_k \neq k ikk则交换第 k k k 行和第 i k i_k ik 行。 步骤 3高斯消元 对于每一列 k k k k 1 , 2 , … , n − 1 k 1, 2, \ldots, n-1 k1,2,…,n−1进行以下操作
归一化第 k k k 行的列主元 a k , k ← 1 a k , k a_{k,k} \leftarrow \frac{1}{a_{k,k}} ak,k←ak,k1更新第 k k k 行的其他元素 a k , j ← a k , j a k , k 对于所有 j ≠ k a_{k,j} \leftarrow \frac{a_{k,j}}{a_{k,k}} \quad \text{对于所有 } j \neq k ak,j←ak,kak,j对于所有 jk消去下方所有行的第 k k k 列元素 对于所有 i k i k ik计算 m i , k a i , k m_{i,k} a_{i,k} mi,kai,k 然后更新第 i i i 行 a i , j ← a i , j − m i , k ⋅ a k , j 对于所有 j a_{i,j} \leftarrow a_{i,j} - m_{i,k} \cdot a_{k,j} \quad \text{对于所有 } j ai,j←ai,j−mi,k⋅ak,j对于所有 j 步骤 4回代求解 当矩阵 A A A 被转换为上三角矩阵后从最后一行开始回代 对于每一行 k k k k n , n − 1 , … , 1 k n, n-1, \ldots, 1 kn,n−1,…,1进行以下操作归一化第 k k k 行的最后一个非零元素即对角线元素 a k , k ← 1 a k , k a_{k,k} \leftarrow \frac{1}{a_{k,k}} ak,k←ak,k1更新第 k k k 行的其他元素 a k , j ← a k , j a k , k 对于所有 j ≠ k a_{k,j} \leftarrow \frac{a_{k,j}}{a_{k,k}} \quad \text{对于所有 } j \neq k ak,j←ak,kak,j对于所有 jk消去上方所有行的第 k k k 列元素 对于所有 i k i k ik计算 m i , k a i , k m_{i,k} a_{i,k} mi,kai,k 然后更新第 i i i 行 a i , j ← a i , j − m i , k ⋅ a k , j 对于所有 j a_{i,j} \leftarrow a_{i,j} - m_{i,k} \cdot a_{k,j} \quad \text{对于所有 } j ai,j←ai,j−mi,k⋅ak,j对于所有 j 步骤 5结果提取 经过上述步骤后增广矩阵的左侧变为单位矩阵而右侧则变为了 A A A 的逆矩阵 A − 1 A^{-1} A−1。提取右侧的矩阵即为所求的逆矩阵。 需要注意的是上述公式中的 a i , j a_{i,j} ai,j 表示增广矩阵中的元素包括原矩阵 A A A 和单位矩阵 I I I 的部分。在实际计算中这些操作会同时应用于 A A A 和 I I I最终 I I I 的位置会被 A − 1 A^{-1} A−1 所取代。 此外如果在任何步骤中发现对角线上的元素 a k , k a_{k,k} ak,k 为零或非常接近零那么矩阵 A A A 可能是奇异矩阵无法求逆。在这种情况下算法应该停止并报错。
Julia 代码
美化数据格式
using DataFrames
function pm(A,b)m,nsize(A); z[]for i1:n stiz[z; a:$st]endfor i1:nstiz[z;b:$st]endprintln(DataFrame([A b],z))
end function luInv(A,parfalse)nsize(A,1);Ttypeof(A[1,1])Acopy(A); E zeros(T,n,n); for i1:n E[i,i]1//1 endif par pm(A, E) endif par println(化为上三角) endfor i1:n-1idargmax(abs.(A[i:n,i])) # 寻找列主元 idid-1A[i,i:n], A[iid,i:n] A[iid,i:n],A[i,i:n]E[i,:], E[iid,:] E[iid,:], E[i,:]for ji1:ncA[j,i]/A[i,i]E[j,:]E[j,:]-E[i,:]*cA[j,i:n]A[j,i:n]-A[i,i:n]*cendif par pm(A, E) endendif par println(化为对角) endfor in:-1:2for j1:i-1cA[j,i]/A[i,i]E[j,:]E[j,:]-E[i,:]*cA[j,1:i]A[j,1:i]-A[i,1:i]*cendif par pm(A, E) endendIAcopy(E);for j1:nIA[j,:] E[j,:]/A[j,j]; A[j,j]A[j,j]/A[j,j]endif par pm(A, IA) endreturn(IA)
end举例
n3;
Azeros(Rational,n,n)
for i1:n-1A[i,i]0;A[i,i1]11//1;A[i1,i]7//1;
end
A[n,n]3//1;
IAluInv(A,true)结果