解线性方程组的直接方法:高斯消元法与其程序实现

解线性方程组的直接方法:高斯消元法与其程序实现

1.顺序高斯消元法

设线性方程组 A x = b \boldsymbol{Ax}=\boldsymbol{b} Ax=b
如果 a k k ( k ) ≠ 0 a_{kk}^{\left( k \right)}\ne 0 akk(k)=0
可以通过高斯消元法转化为等价的三角形线性方程组:
[ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a n 1 a n 2 ⋯ a n n ] [ x 1 x 2 ⋮ x n ] = [ b 1 b 2 ⋮ b n ] → 高斯消元法 [ a 11 ( 1 ) a 12 ( 1 ) ⋯ a 1 n ( 1 ) 0 a 22 ( 2 ) ⋯ a 2 n ( 2 ) ⋮ ⋮ ⋱ ⋮ 0 0 ⋯ a n n ( n ) ] [ x 1 x 2 ⋮ x n ] = [ b 1 ( 1 ) b 2 ( 2 ) ⋮ b n ( n ) ] \left[ \begin{matrix} a_{11}& a_{12}& \cdots& a_{1n}\\ a_{21}& a_{22}& \cdots& a_{2n}\\ \vdots& \vdots& \ddots& \vdots\\ a_{n1}& a_{n2}& \cdots& a_{nn}\\ \end{matrix} \right] \left[ \begin{array}{c} x_1\\ x_2\\ \vdots\\ x_n\\ \end{array} \right] =\left[ \begin{array}{c} b_1\\ b_2\\ \vdots\\ b_n\\ \end{array} \right] \\ \overset{\text{高斯消元法}}{\rightarrow}\left[ \begin{matrix} a_{11}^{\left( 1 \right)}& a_{12}^{\left( 1 \right)}& \cdots& a_{1n}^{\left( 1 \right)}\\ 0& a_{22}^{\left( 2 \right)}& \cdots& a_{2n}^{\left( 2 \right)}\\ \vdots& \vdots& \ddots& \vdots\\ 0& 0& \cdots& a_{nn}^{\left( n \right)}\\ \end{matrix} \right] \left[ \begin{array}{c} x_1\\ x_2\\ \vdots\\ x_n\\ \end{array} \right] =\left[ \begin{array}{c} b_{1}^{\left( 1 \right)}\\ b_{2}^{\left( 2 \right)}\\ \vdots\\ b_{n}^{\left( n \right)}\\ \end{array} \right] a11a21an1a12a22an2a1na2nannx1x2xn=b1b2bn高斯消元法a11(1)00a12(1)a22(2)0a1n(1)a2n(2)ann(n)x1x2xn=b1(1)b2(2)bn(n)

2.列主元高斯消元法

由于顺序高斯消元法存在以下缺陷:

  • 当线性方程组的系数行列式 ∣ A ∣ ≠ 0 \left|\boldsymbol{A}\right| \ne 0 A=0,且存在 1 1 1个主元素为 0 0 0,线性方程组有为一解,但是顺序高斯消元法不能解出。
  • 小主元可以求解但是误差比较大。

通过交换行来避免小主元和 0 0 0主元,然后继续使用消元法求解的方法,称为选主元高斯消元法
其改进之处在于:
选主元
∣ a p k ( k ) ∣ = max ⁡ k ≤ i ≤ n ∣ a i k ( k ) ∣ \left|a_{pk}^{(k)}\right| = \max_{k \le i \le n} \left|a_{ik}^{(k)}\right| apk(k)=kinmaxaik(k)

交换行
{ a k j ( k ) ↔ a p j ( k ) , j = k , k + 1 , ⋯ , n , b k ( k ) ↔ b p ( k ) . \begin{cases} a_{kj}^{(k)} \leftrightarrow a_{pj}^{(k)}, & j = k, k+1, \cdots, n, \\ b_k^{(k)} \leftrightarrow b_p^{(k)}. \end{cases} {akj(k)apj(k),bk(k)bp(k).j=k,k+1,,n,

消元公式
m i k = a i k ( k ) a k k ( k ) , i = k + 1 , ⋯ , n , m_{ik} = \frac{a_{ik}^{(k)}}{a_{kk}^{(k)}}, \quad i = k+1, \cdots, n, mik=akk(k)aik(k),i=k+1,,n,
{ a i j ( k + 1 ) = a i j ( k ) − m i k a k j ( k ) , i , j = k + 1 , ⋯ , n , b i ( k + 1 ) = b i ( k ) − m i k b k ( k ) , i = k + 1 , ⋯ , n . \begin{cases} a_{ij}^{(k+1)} = a_{ij}^{(k)} - m_{ik}a_{kj}^{(k)}, & i,j = k+1, \cdots, n, \\ b_i^{(k+1)} = b_i^{(k)} - m_{ik}b_k^{(k)}, & i = k+1, \cdots, n. \end{cases} {aij(k+1)=aij(k)mikakj(k),bi(k+1)=bi(k)mikbk(k),i,j=k+1,,n,i=k+1,,n.

3.全主元高斯消元法

列主元高斯消元法虽然在一定程度上避免了零主元和小主元带来的问题,但它仅在当前列中选取主元。而全主元高斯消元法更为严格,它在整个未处理的子矩阵中选取主元,从而能进一步减少计算误差,提高求解的稳定性。

对于线性方程组 A x = b \boldsymbol{Ax}=\boldsymbol{b} Ax=b,其中 A \boldsymbol{A} A n × n n\times n n×n 系数矩阵, b \boldsymbol{b} b n n n 维常数向量,求解步骤如下:
对于线性方程组 A x = b \boldsymbol{Ax}=\boldsymbol{b} Ax=b,其中 A \boldsymbol{A} A n × n n\times n n×n 系数矩阵, b \boldsymbol{b} b n n n 维常数向量,求解步骤如下:

步骤 1:初始化

设初始矩阵为 A ( 1 ) = A \boldsymbol{A}^{(1)}=\boldsymbol{A} A(1)=A b ( 1 ) = b \boldsymbol{b}^{(1)}=\boldsymbol{b} b(1)=b k = 1 k = 1 k=1

步骤 2:选主元(在第 k k k 步)

在子矩阵 A ( k ) \boldsymbol{A}^{(k)} A(k) 的右下角 ( n − k + 1 ) × ( n − k + 1 ) (n - k+1)\times(n - k + 1) (nk+1)×(nk+1) 子矩阵中选取绝对值最大的元素作为主元,即
∣ a p q ( k ) ∣ = max ⁡ k ≤ i ≤ n , k ≤ j ≤ n ∣ a i j ( k ) ∣ \left|a_{p q}^{(k)}\right|=\max_{k\leq i\leq n,k\leq j\leq n}\left|a_{i j}^{(k)}\right| apq(k)=kin,kjnmaxaij(k)
其中, p p p 表示主元所在的行, q q q 表示主元所在的列。

步骤 3:交换行和列

p ≠ k p\neq k p=k,交换 A ( k ) \boldsymbol{A}^{(k)} A(k) 的第 k k k 行和第 p p p 行,同时交换 b ( k ) \boldsymbol{b}^{(k)} b(k) 的第 k k k 个和第 p p p 个元素;若 q ≠ k q\neq k q=k,交换 A ( k ) \boldsymbol{A}^{(k)} A(k) 的第 k k k 列和第 q q q 列。记录列交换的信息,用于后续恢复解的顺序。交换规则如下:
{ a k j ( k ) ↔ a p j ( k ) , j = 1 , ⋯ , n b k ( k ) ↔ b p ( k ) \begin{cases} a_{k j}^{(k)}\leftrightarrow a_{p j}^{(k)},&j = 1,\cdots,n\\ b_{k}^{(k)}\leftrightarrow b_{p}^{(k)} \end{cases} {akj(k)apj(k),bk(k)bp(k)j=1,,n
{ a i k ( k ) ↔ a i q ( k ) , i = 1 , ⋯ , n \begin{cases} a_{i k}^{(k)}\leftrightarrow a_{i q}^{(k)},&i = 1,\cdots,n \end{cases} {aik(k)aiq(k),i=1,,n

步骤 4:消元计算

计算乘数:
m i k = a i k ( k ) a k k ( k ) , i = k + 1 , ⋯ , n m_{i k}=\frac{a_{i k}^{(k)}}{a_{k k}^{(k)}}, \quad i=k + 1,\cdots,n mik=akk(k)aik(k),i=k+1,,n
更新系数矩阵和常数向量:
{ a i j ( k + 1 ) = a i j ( k ) − m i k a k j ( k ) , i = k + 1 , ⋯ , n ; j = k + 1 , ⋯ , n b i ( k + 1 ) = b i ( k ) − m i k b k ( k ) , i = k + 1 , ⋯ , n \begin{cases} a_{i j}^{(k + 1)}=a_{i j}^{(k)}-m_{i k}a_{k j}^{(k)},&i = k + 1,\cdots,n;j = k+1,\cdots,n\\ b_{i}^{(k + 1)}=b_{i}^{(k)}-m_{i k}b_{k}^{(k)},&i = k + 1,\cdots,n \end{cases} {aij(k+1)=aij(k)mikakj(k),bi(k+1)=bi(k)mikbk(k),i=k+1,,n;j=k+1,,ni=k+1,,n

步骤 5:循环更新

k = k + 1 k=k + 1 k=k+1,若 k < n k\lt n k<n,返回步骤 2 继续进行;若 k = n k = n k=n,则消元过程结束。

步骤 6:回代求解

经过消元后,得到上三角方程组 A ( n ) x = b ( n ) \boldsymbol{A}^{(n)}\boldsymbol{x}=\boldsymbol{b}^{(n)} A(n)x=b(n),通过回代法求解 x \boldsymbol{x} x。回代公式为:
x n = b n ( n ) a n n ( n ) x_{n}=\frac{b_{n}^{(n)}}{a_{n n}^{(n)}} xn=ann(n)bn(n)
x i = b i ( i ) − ∑ j = i + 1 n a i j ( i ) x j a i i ( i ) , i = n − 1 , ⋯ , 1 x_{i}=\frac{b_{i}^{(i)}-\sum_{j = i+1}^{n}a_{i j}^{(i)}x_{j}}{a_{i i}^{(i)}}, \quad i=n - 1,\cdots,1 xi=aii(i)bi(i)j=i+1naij(i)xj,i=n1,,1

4.高斯——若尔当消元法

以下是高斯-若尔当消元法的分步解释和公式表示:


高斯-若尔当消元法(Gauss-Jordan Elimination)

核心思想
在消元过程中,不仅通过前向消元将系数矩阵化为上三角矩阵(如普通高斯消元法),进一步通过反向消元将矩阵化为对角矩阵或单位矩阵,从而直接得到解,无需回代。


分步矩阵变换过程

初始线性方程组(增广矩阵形式):
[ a 11 ( 1 ) a 12 ( 1 ) ⋯ a 1 n ( 1 ) b 1 ( 1 ) a 21 ( 1 ) a 22 ( 1 ) ⋯ a 2 n ( 1 ) b 2 ( 1 ) ⋮ ⋮ ⋱ ⋮ ⋮ a n 1 ( 1 ) a n 2 ( 1 ) ⋯ a n n ( 1 ) b n ( 1 ) ] \left[\begin{array}{cccc|c} a_{11}^{(1)} & a_{12}^{(1)} & \cdots & a_{1n}^{(1)} & b_1^{(1)}\\ a_{21}^{(1)} & a_{22}^{(1)} & \cdots & a_{2n}^{(1)} & b_2^{(1)}\\ \vdots & \vdots & \ddots & \vdots & \vdots\\ a_{n1}^{(1)} & a_{n2}^{(1)} & \cdots & a_{nn}^{(1)} & b_n^{(1)} \end{array}\right] a11(1)a21(1)an1(1)a12(1)a22(1)an2(1)a1n(1)a2n(1)ann(1)b1(1)b2(1)bn(1)

k k k 步消元(共 n n n 步)

  1. 选取主元:在第 k k k列中选取绝对值最大的元素作为主元(部分选主元法)。
  2. 归一化主元行:将主元所在行除以主元值,使主元位置为 1 1 1
  3. 消去主元列的所有非主元元素
    • i ≠ k i \neq k i=k 的所有行,用主元行消去第 k k k 列的元素,使其为 0 0 0

分步过程
→ 第1步消元 [ 1 a 12 ( 2 ) ⋯ a 1 n ( 2 ) b 1 ( 2 ) 0 a 22 ( 2 ) ⋯ a 2 n ( 2 ) b 2 ( 2 ) ⋮ ⋮ ⋱ ⋮ ⋮ 0 a n 2 ( 2 ) ⋯ a n n ( 2 ) b n ( 2 ) ] → 第2步消元 [ 1 0 ⋯ a 1 n ( 3 ) b 1 ( 3 ) 0 1 ⋯ a 2 n ( 3 ) b 2 ( 3 ) ⋮ ⋮ ⋱ ⋮ ⋮ 0 0 ⋯ a n n ( 3 ) b n ( 3 ) ] ⋮ → 第n步消元 [ 1 0 ⋯ 0 b 1 ( n + 1 ) 0 1 ⋯ 0 b 2 ( n + 1 ) ⋮ ⋮ ⋱ ⋮ ⋮ 0 0 ⋯ 1 b n ( n + 1 ) ] \begin{aligned} &\xrightarrow{\text{第1步消元}} \begin{bmatrix} 1 & a_{12}^{(2)} & \cdots & a_{1n}^{(2)} & b_1^{(2)} \\ 0 & a_{22}^{(2)} & \cdots & a_{2n}^{(2)} & b_2^{(2)} \\ \vdots & \vdots & \ddots & \vdots & \vdots \\ 0 & a_{n2}^{(2)} & \cdots & a_{nn}^{(2)} & b_n^{(2)} \end{bmatrix} \\[2ex] &\xrightarrow{\text{第2步消元}} \begin{bmatrix} 1 & 0 & \cdots & a_{1n}^{(3)} & b_1^{(3)} \\ 0 & 1 & \cdots & a_{2n}^{(3)} & b_2^{(3)} \\ \vdots & \vdots & \ddots & \vdots & \vdots \\ 0 & 0 & \cdots & a_{nn}^{(3)} & b_n^{(3)} \end{bmatrix} \\[2ex] &\quad\ \ \vdots \\[2ex] &\xrightarrow{\text{第n步消元}} \begin{bmatrix} 1 & 0 & \cdots & 0 & b_1^{(n+1)} \\ 0 & 1 & \cdots & 0 & b_2^{(n+1)} \\ \vdots & \vdots & \ddots & \vdots & \vdots \\ 0 & 0 & \cdots & 1 & b_n^{(n+1)} \end{bmatrix} \end{aligned} 1步消元 100a12(2)a22(2)an2(2)a1n(2)a2n(2)ann(2)b1(2)b2(2)bn(2)2步消元 100010a1n(3)a2n(3)ann(3)b1(3)b2(3)bn(3)  n步消元 100010001b1(n+1)b2(n+1)bn(n+1)
最终增广矩阵的最后一列即为解:
x 1 = b 1 ( n + 1 ) , x 2 = b 2 ( n + 1 ) , … , x n = b n ( n + 1 ) . x_1 = b_1^{(n+1)}, \quad x_2 = b_2^{(n+1)}, \quad \dots, \quad x_n = b_n^{(n+1)}. x1=b1(n+1),x2=b2(n+1),,xn=bn(n+1).


元素更新公式

在第 (k) 步消元中,假设主元已归一化为 1(即 a k k ( k ) = 1 a_{kk}^{(k)} = 1 akk(k)=1),则对每行 i ≠ k i \neq k i=k
{ a i j ( k + 1 ) = a i j ( k ) − a i k ( k ) ⋅ a k j ( k ) , ∀ j ≥ k , b i ( k + 1 ) = b i ( k ) − a i k ( k ) ⋅ b k ( k ) , ∀ i ≠ k . \begin{cases} a_{ij}^{(k+1)} = a_{ij}^{(k)} - a_{ik}^{(k)} \cdot a_{kj}^{(k)}, & \forall j \geq k, \\ b_i^{(k+1)} = b_i^{(k)} - a_{ik}^{(k)} \cdot b_k^{(k)}, & \forall i \neq k. \end{cases} {aij(k+1)=aij(k)aik(k)akj(k),bi(k+1)=bi(k)aik(k)bk(k),jk,i=k.


特点与应用
  1. 直接求解:最终矩阵为单位矩阵,解直接显式给出,无需回代。
  2. 计算复杂度:计算量约为 (O(n^3)),略高于普通高斯消元法。
  3. 应用场景
    • 求矩阵的逆:对单位矩阵进行同步行变换。
    • 简化方程组:直接得到最简形式(如线性代数中的行最简形)。

一道实训题

import numpy as npclass GaussianElimination:def __init__(self, A, b, sol_method="principal"):self.A = np.asarray(A, dtype=np.float64)self.b = np.asarray(b, dtype=np.float64)if len(self.b) != self.A.shape[0]:raise ValueError("右端向量维度与系数矩阵维度不匹配!")if self.A.shape[0] != self.A.shape[1]:raise ValueError("系数矩阵不是方阵,不能用高斯消元法求解!")self.n = self.A.shape[0]self.augmented_matrix = np.c_[self.A, self.b]self.x = Noneself.eps = Noneself.sol_method = sol_methodself.jordan_inverse_matrix = Noneif self.sol_method == "sequential":self._solve_sequential_()elif self.sol_method == "column":self._solve_column_pivot_element_()elif self.sol_method == "complete":self._solve_complete_pivot_element_()elif self.sol_method == "jordan":self._solve_jordan_()else:raise ValueError("仅支持(sequential, column, complete, jordan)")def _elimination_process(self, i, k):if self.augmented_matrix[k, k] == 0:raise ValueError("系数矩阵不满足顺序高斯消元法求解!")multiplier = self.augmented_matrix[i, k] / self.augmented_matrix[k, k]self.augmented_matrix[i, k:] -= multiplier * self.augmented_matrix[k, k:]def _back_substitution_process_(self):x = np.zeros(self.n)for k in range(self.n - 1, -1, -1):sum_ = np.dot(self.augmented_matrix[k, k + 1:self.n], x[k + 1:self.n])x[k] = (self.augmented_matrix[k, -1] - sum_) / self.augmented_matrix[k, k]return xdef _solve_sequential_(self):for k in range(self.n - 1):for i in range(k + 1, self.n):self._elimination_process(i, k)self.x = self._back_substitution_process_()self.eps = np.dot(self.A, self.x) - self.bdef _solve_column_pivot_element_(self):for k in range(self.n - 1):idx = np.argmax(np.abs(self.augmented_matrix[k:, k])) + k# 修正索引错误,直接用 idxif idx != k:self.augmented_matrix[[k, idx]] = self.augmented_matrix[[idx, k]]for i in range(k + 1, self.n):self._elimination_process(i, k)self.x = self._back_substitution_process_()self.eps = np.dot(self.A, self.x) - self.bdef _solve_complete_pivot_element_(self):self.x = np.zeros(self.n)column_index = np.linspace(0, self.n - 1, self.n, dtype=np.int64)for k in range(self.n - 1):max_x = np.max(np.abs(self.augmented_matrix[k:, k:k + 1]))id_r, id_c = np.where(np.abs(self.augmented_matrix[k:, k:k + 1]) == max_x)id_r, id_c = int(id_r[0]), int(id_c[0])id_r = id_r + kif id_r != k:self.augmented_matrix[[k, id_r]] = self.augmented_matrix[[id_r, k]]id_c = id_c + kif id_c != k:pos = column_index[id_c]column_index[id_c] = column_index[k]column_index[k] = posself.augmented_matrix[:, [k, id_c]] = self.augmented_matrix[:, [id_c, k]]for i in range(k + 1, self.n):self._elimination_process(i, k)solve_x = self._back_substitution_process_()for k in range(self.n):for j in range(self.n):if k == column_index[j]:self.x[k] = solve_x[j]breakself.eps = np.dot(self.A, self.x) - self.bdef _solve_jordan_(self):self.augmented_matrix = np.c_[self.augmented_matrix, np.eye(self.n)]for k in range(self.n):idx = np.argmax(np.abs(self.augmented_matrix[k:, k])) + kif idx != k:self.augmented_matrix[[k, idx]] = self.augmented_matrix[[idx, k]]if self.augmented_matrix[k, k] == 0:raise ValueError("系数矩阵不满足高斯 - 若尔当消元法")self.augmented_matrix[k, :] /= self.augmented_matrix[k, k]for i in range(self.n):if i != k:factor = self.augmented_matrix[i, k]self.augmented_matrix[i, :] -= factor * self.augmented_matrix[k, :]self.jordan_inverse_matrix = self.augmented_matrix[:, self.n + 1:]self.x = self.augmented_matrix[:, -self.n - 1]self.eps = np.dot(self.A, self.x) - self.b# 给定的线性方程组
A = [[10, -7, 0, 1],[-3, 2.099999, 6, 2],[5, -1, 5, -1],[2, 1, 0, 2]
]
b = [8, 5.900001, 5, 1]# 使用列主元高斯消去法求解
solver = GaussianElimination(A, b, sol_method="column")# 输出结果
print("方程组的解:", solver.x)
print("解的精度验证:", solver.eps)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/74428.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LiteIDE中配置golang编译生成无CMD窗口EXE的步骤

LiteIDE中配置golang编译生成无CMD窗口EXE的步骤 一、环境配置1、设置GOROOT‌2、配置GOPATH‌ 二、项目编译参数设置1、新建/打开项目‌2、修改编译配置‌3、其他优化选项&#xff08;可选&#xff09;‌ 三、构建与验证1、编译生成EXE‌2、验证无窗口效果‌ 四、注意事项 一、…

Maya基本操作

基本操作 按住ALT键&#xff0c;左键旋转视角&#xff0c;中键平移视角&#xff0c;右键放大缩小视角。 按空格键切换4格视图。 导入FBX格式文件后&#xff0c;无贴图显示。 按6键开启。着色纹理显示 坐标轴相关 修改菜单-左键最上面的虚线。固定修改选项窗口。 选中物体…

Windows打开ftp局域网共享

前提是windows已经设置好开机账号密码了&#xff0c;否则教程不适用 第一先打开电脑ftp共享配置 点击保存即可 2.设置要共享到其他电脑的文件路径&#xff08;如果你要共享整个盘你就设置整个盘&#xff0c;如果是共享盘中某文件就设置某文件&#xff0c;这里是某文件&#x…

overleaf中会议参考文献使用什么标签:inproceedings

overleaf中会议参考文献使用什么标签 会议论文在LaTeX文献条目中应使用 @inproceedings 标签,而非 @article。根据你提供的内容,修正后的格式如下: @inproceedings{asai2023self, author = {Asai, Akari and Wu, Zeqiu and Wang, Yizhong and Sil, Avirup and Hajishirzi,…

一文详解redis

redis 5种数据类型 string 字符串是 Redis 里最基础的数据类型&#xff0c;一个键对应一个值。 设置值 SET key value例如&#xff1a; SET name "John"获取值 GET key例如&#xff1a; GET namelist 列表是简单的字符串列表&#xff0c;按插入顺序排序。 在列…

第16章:基于CNN和Transformer对心脏左心室的实验分析及改进策略

目录 1. 项目需求 2. 网络选择 2.1 UNet模块 2.2 TransUnet 2.2.1 SE模块 2.2.2 CBAM 2.3 关键代码 3 对比试验 3.1 unet 3.2 transformerSE 3.3 transformerCBAM 4. 结果分析 5. 推理 6. 下载 1. 项目需求 本文需要做的工作是基于CNN和Transformer的心脏左心室…

【AI】知识蒸馏-简单易懂版

1 缘起 最近要准备升级材料&#xff0c;里面有一骨碌是介绍LLM相关技术的&#xff0c;知识蒸馏就是其中一个点&#xff0c; 不过&#xff0c;只分享了蒸馏过程&#xff0c;没有讲述来龙去脉&#xff0c;比如没有讲解Softmax为什么引入T、损失函数为什么使用KL散度&#xff0c;…

批量将PPT转换成多张图片

以下是一个使用Python将PowerPoint文件&#xff08;PPT/PPTX&#xff09;批量转换为多张图片的代码示例。该方案通过comtypes库调用本地Office的COM接口实现转换&#xff0c;需确保已安装Microsoft PowerPoint。 import os import comtypes.client from comtypes import COMEr…

单例模式的经典实现

单例模式&#xff08;Singleton&#xff09;是一种创建型设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点。在MyBatis、Redisson、AMQP等依赖包中&#xff0c;单例模式被广泛应用。以下是这些框架中单例模式的经典实现及举例&#xff1a; 1. My…

2024年数维杯数学建模B题生物质和煤共热解问题的研究解题全过程论文及程序

2024年数维杯数学建模 B题 生物质和煤共热解问题的研究 原题再现&#xff1a; 随着全球能源需求的不断增长和对可再生能源的追求&#xff0c;生物质和煤共热解作为一种潜在的能源转化技术备受关注。生物质是指可再生能源&#xff0c;源自植物和动物的有机物质&#xff0c;而煤…

灵茶山艾府基础算法精讲

day1 &#xff08;1遍&#xff09;167. 两数之和 II - 输入有序数组 https://leetcode.cn/problems/two-sum-ii-input-array-is-sorted/solution/san-shu-zhi-he-bu-hui-xie-xiang-xiang-sh-6wbq/ 15. 三数之和 https://leetcode.cn/problems/3sum/solution/shuang-zhi-zhen-…

图解AUTOSAR_CP_LargeDataCOM

AUTOSAR LdCom模块详解 大型数据通信模块的架构与实现 目录 AUTOSAR LdCom模块详解 目录1. 概述2. 模块架构3. 数据流程 3.1 整体数据流3.2 数据发送流程3.3 数据接收流程4. 配置结构5. 总结1. 概述 LdCom(Large Data COM)是AUTOSAR中的轻量级通信模块,专为高效传输大型或动…

Flink 自定义数据源:从理论到实践的全方位指南

目录 第一章:自定义数据源的基础概念 数据源是什么?它在 Flink 中扮演什么角色? Flink 的内置数据源:开箱即用的 “标配” 为什么需要自定义数据源?它的杀手锏在哪? 第二章:自定义数据源的实现之道 接口选择:从简单到高级,选对工具事半功倍 SourceFunction:入门…

HarmonyOS Next~鸿蒙应用框架开发实战:Ability Kit与Accessibility Kit深度解析

HarmonyOS Next&#xff5e;鸿蒙应用框架开发实战&#xff1a;Ability Kit与Accessibility Kit深度解析 一、HarmonyOS应用框架设计理念 HarmonyOS作为全场景分布式操作系统&#xff0c;其应用框架设计遵循"一次开发&#xff0c;多端部署"的核心原则。通过创新的原…

Spring相关API

1是相对路径 2 是绝对路径 3 在注解时使用

Netty源码—客户端接入流程

1.关于Netty客户端连接接入问题整理 一.Netty是在哪里检测有新连接接入的&#xff1f; 答&#xff1a;boss线程第一个过程轮询出ACCEPT事件&#xff0c;然后boss线程第二个过程通过JDK底层Channel的accept()方法创建一条连接。 二.新连接是怎样注册到NioEventLoop线程的&#x…

python全栈-前端

python全栈-前端 文章目录 HTML标签段落p、换行br、水平线hr图片img路径src超文本链接a超链接之锚点href#id文本有序列表ol无序列表ul自定义列表表格table表格属性单元格合并 表单Forminput标签HTML5新增type属性HTML5新增常用属性 实体字符块元素与行内元素/内联元素容器元素d…

领域驱动设计(DDD)实践入门

文章目录 1.认识领域驱动设计1.1 简介1.2 发展历史1.3 DDD 的兴起 2.从一个简单案例2.1 转账需求2.2 设计的问题2.3 违反的设计原则 3.使用 DDD 进行重构抽象数据存储层抽象第三方服务抽象中间件封装业务逻辑重构后的架构 4.小结参考文献 1.认识领域驱动设计 1.1 简介 领域驱…

nuxt3网站文章分享微信 ,QQ功能

1.安装 npm install qrcode --save-dev 2.组件使用 <div class"share"><div style"line-height: 69px; color: #fff;width: 100px;"><p style"text-align: center;">分享:</p></div><div click"shareToMi…

VMWare Ubuntu 详细安装教程

VMWare Ubuntu 详细安装教程 一、下载安装VMware二、下载 Ubuntu 镜像文件三、安装 Ubuntu四、开启虚拟机 一、下载安装VMware 官网下载地址https://www.vmware.com/products/desktop-hypervisor/workstation-and-fusion知乎大佬的博客原文&#xff0c;含下载地址https://zhua…