2023华为杯研究生数学建模B题|思路代码深度剖析|小熊学姐带你深入浅出轻松玩转数模

小熊学姐来啦!小熊学姐带了好多数学建模呢,我用浅显易懂的语言,将复杂抽象的数学建模知识讲解得通俗易懂。无论你是建模小白,还是资深建模者,在小熊学姐这里都可以学到适合自己的建模技巧。
2023华为杯研究生数学建模B题|思路代码深度剖析|小熊学姐带你深入浅出轻松玩转数模_第1张图片

问题重述

  1. 目标是研究DFT矩阵的低复杂度计算方案,以替代当前基于FFT的高复杂度方案。

  2. 通过将DFT矩阵F_N分解为多个矩阵的乘积来降低复杂度。要求分解后的矩阵满足一定的约束条件。

  3. 要综合考虑分解精度(通过最小化目标函数RMSE来评估)和复杂度(受矩阵非零元素个数和取值范围的影响)。

  4. 给出5个具体问题,分别在不同约束条件下优化分解方案并计算精度和复杂度。

  5. 问题1:仅限制矩阵的稀疏性;问题2:仅限制矩阵元素的取值范围;问题3:同时限制稀疏性和取值范围。

  6. 问题4:考虑Kronecker积矩阵的分解;问题5:在要求精度RMSE≤0.1的前提下,优化取值范围以最小化复杂度。

问题一

  1. 定义变量和参数:

    • 和问题描述中的定义相同
    • N:DFT矩阵维数
    • F_N:N维DFT矩阵
    • K:分解矩阵个数
    • A={A_1,A_2,…,A_K}:K个分解矩阵
    • β:缩放因子
    • C:复杂度
  2. 约束条件:

    • 每个A_k的行最多只有2个非零元素
  3. 目标函数:

    • 将F_N表示为βA_1…*A_K
    • 最小化F_N和分解结果的误差:
      min β,A RMSE(β,A) = ||βF_N - A_1…*A_K||_F
  4. 复杂度计算:

    • 矩阵行只有2个非零元素,可以大大减少乘法次数
    • 假设元素取值范围为[-2^15, 2^15],即q=16
    • 则复杂度C可以表示为:C = q*L
    • 其中L为非零元素个数,可以通过遍历A_k获得
  5. 求解思路:

    • 遍历不同的K值
    • 对每个K,随机初始化A_k,满足约束条件
    • 使用优化算法调整每个A_k,最小化误差
    • 计算对应的L和C
    • 记录最优解A*,β*,C*
  6. 输出结果:

    • 最小化的RMSE
    • 对应的复杂度C
    • 优化得到的最优A*,β*
import numpy as np
from scipy.linalg import frobenius
from scipy.optimize import minimize

# 1. 输入参数
N = 8 
F_N = np.fft.fft(np.eye(N)) # 构建N阶DFT矩阵

# 2. 定义变量
K = 3 # 分解矩阵个数

# 初始化K个全零分解矩阵
A = []  
for i in range(K):
  A.append(np.zeros((N,N)))

beta = 1 # 缩放因子  

# 3. 设置约束条件
for k in range(K): # 遍历每个分解矩阵
  
  for i in range(N): # 遍历每个行 
    idx = np.random.permutation(N)[:2] # 随机取2个列索引
    
    # 给取出的2个列索引位置赋随机值
    A[k][i, idx[0]] = np.random.randn()  

模型分析

  1. DFT矩阵结构

可以绘制DFT矩阵的实部和虚部,以直观显示DFT矩阵的特殊结构性。

  1. 分解矩阵稀疏性

可以绘制分解矩阵的热力图,用颜色深浅表示矩阵元素的大小,从而直观显示分解矩阵的稀疏性。

  1. 误差曲线

可以绘制优化过程中目标函数误差的变化曲线,观察误差下降的过程。

  1. 复杂度曲线

同样可以绘制优化过程中复杂度C的变化曲线,看到复杂度是如何受约束条件影响。

  1. 比较不同K值

可以绘制不同分解矩阵个数K下误差和复杂度的关系图,找到最优平衡点。

2023华为杯研究生数学建模B题|思路代码深度剖析|小熊学姐带你深入浅出轻松玩转数模_第2张图片

问题二

  1. 定义变量和参数

    • N N N:DFT矩阵的维数
    • F N \mathbf{F}_N FN:N维DFT矩阵
    • K K K:分解矩阵的个数
    • A = { A 1 , A 2 , . . . , A K } \mathbf{A} = \{\mathbf{A}_1, \mathbf{A}_2, ..., \mathbf{A}_K\} A={A1,A2,...,AK}:分解得到的K个矩阵
    • β \beta β:缩放因子
  2. 约束条件

    • A k [ i , j ] ∈ { 0 , ± 1 , ± 2 , . . . , ± 2 q − 1 } , k = 1 , 2 , . . . , K ; i , j = 1 , 2 , . . . , N \mathbf{A}_k[i,j] \in \{0, ±1, ±2,...,±2^{q-1}\}, k=1,2,...,K; i,j=1,2,...,N Ak[i,j]{0,±1,±2,...,±2q1},k=1,2,...,K;i,j=1,2,...,N
    • 其中 q = 3 q=3 q=3
  3. 目标函数

    • F N \mathbf{F}_N FN表示为 β A 1 A 2 . . . A K \beta\mathbf{A}_1\mathbf{A}_2...\mathbf{A}_K βA1A2...AK
    • 最小化误差: min ⁡ A , β 1 N ∥ β F N − A 1 A 2 . . . A K ∥ Fro \min\limits_{\mathbf{A},\beta} \frac{1}{N}\|\beta \mathbf{F}_N - \mathbf{A}_1\mathbf{A}_2...\mathbf{A}_K\|_{\text{Fro}} A,βminN1βFNA1A2...AKFro
  4. 计算复杂度

    • C = q × L C = q \times L C=q×L
    • 其中 L L L为复数乘法次数
  5. 求解思路

    • 遍历不同的 K K K
    • 对每个 K K K,随机初始化 A k \mathbf{A}_k Ak,满足约束条件
    • 使用优化算法最小化目标函数
    • 计算对应的复杂度 C C C
    • 记录最优解
import numpy as np
from scipy.optimize import minimize
from scipy.linalg import frobenius

# 1. 输入
N = 8  
F_N = np.fft.fft(np.eye(N))

# 2. 定义变量
K = 3   
q = 3
A = [np.random.randint(-2, 3, size=(N,N)) for _ in range(K)] 
beta = 1  

# 3. 设置约束条件
A = [np.clip(a, -2, 2) for a in A]

# 4. 定义目标函数
def objective(params):
    A, beta = params
    return frobenius(beta*F_N - np.linalg.multi_dot(A)) / N

完整版的代码和思路看看我的专栏哦~
如何评价2023华为杯研究生数学建模竞赛B题?

你可能感兴趣的:(数学建模,华为)