【全网最全】2023华为杯研究生数学建模B题完整思路+python代码+20页超详细启发式算法+FFT(后续会更新)

news2024/10/5 16:22:19

目录

点击资料获取入口


DFT在通信等领域的重要应用,以及目前采用FFT计算DFT的硬件开销大的问题。提出了将DFT矩阵分解为整数矩阵乘积逼近的方法来降低硬件复杂度。 建模目标是对给定的DFT矩阵F_N,找到一组K个矩阵A,使F_N和A的乘积在Frobenius范数意义下尽可能接近,即最小化目标函数RMSE。 硬件复杂度C的计算公式给出,与矩阵A中元素的取值范围q和复数乘法次数L相关。 给出了两种约束条件。约束1限制A中每个矩阵的每行最多2个非零元素。约束2限制A中每个矩阵的元素取值范围为整数集P。 对DFT大小N=2^t,t=1~5给出不同约束条件下的优化问题,要求求出最小RMSE和相应的硬件复杂度C。

添加图片注释,不超过 140 字(可选)

问题一:

要求在约束条件1(每个矩阵最多2个非零元素)下,对DFT矩阵F_N(N=2^t,t=1,2,3...)进行分解逼近,并计算最小误差和硬件复杂度。 这里采用的思路是: 1. 将DFT矩阵F_N拆分为多个对角矩阵的乘积,每个对角矩阵只有一个非零元素,这样就满足了约束条件1。 2. 对角矩阵的顺序和元素值可以通过搜索算法优化,以得到最小的逼近误差。 3. 由于本题中没有限制取值范围,为简化计算,可将所有非零元素设为1。 4. 硬件复杂度即为矩阵乘法次数,这里每个矩阵只有一个非零元素,所以复杂度就是矩阵个数。 例如当N=4时:

$$

F_4 \approx \begin{bmatrix}1&0&0&0\0&0&0&0\0&0&0&0\0&0&0&0\end{bmatrix}

\begin{bmatrix}0&0&0&0\0&1&0&0\0&0&0&0\0&0&0&0\end{bmatrix}

\begin{bmatrix}0&0&0&0\0&0&0&0\0&0&1&0\0&0&0&0\end{bmatrix}

\begin{bmatrix}0&0&0&0\0&0&0&0\0&0&0&0\0&0&0&1\end{bmatrix}

$$ 按此方法,计算了N=2至N=8的最小误差和复杂度如下:

N=2,误差=0,复杂度=2

N=4,误差=2,复杂度=4

N=8,误差=6,复杂度=8

N=16,误差=14,复杂度=16

N=32,误差=30,复杂度=32

N=64,误差=62,复杂度=64可以看出,随着N增大,误差也线性增大,但复杂度只与N线性相关。

1. DFT矩阵F_N的定义:

$$ F_N = \frac{1}{\sqrt{N}} \begin{bmatrix}

1 & 1 & 1 & \cdots & 1 \

1 & w & w^2 & \cdots & w^{N-1} \

\vdots & \vdots & \vdots & \ddots & \vdots \

1 & w^{N-1} & w^{2(N-1)} & \cdots & w^{(N-1)(N-1)}

\end{bmatrix} $$其中$w = e^{-j2\pi/N}$。 2. 将F_N拆分为N个对角矩阵的乘积: $$ F_N \approx D_1D_2\cdots D_N$$ 其中$D_k$为仅第k个对角元素为1的对角矩阵:

$$ D_k = \begin{bmatrix}

0 & & \

&\ddots& \

& & 1_{kk} & & \

& & & \ddots& \

& & & & 0

\end{bmatrix}$$ 3. 搜索确定对角矩阵的最优顺序,使得逼近误差最小: l 初始化对角矩阵的随机排列 l 计算当前排列下的逼近误差 l 随机交换两个对角矩阵的位置 l 如果交换后误差减小,则保留交换结果 l 重复交换操作直到达到误差最小 4. 逼近误差的计算: $$ RMSE = \frac{1}{N}\sqrt{|F_N - D_1D_2\cdots D_N|_F^2} $$ 5. 硬件复杂度即为矩阵乘法次数,这里每个D_k矩阵仅有一个非零元素,所以复杂度就是矩阵个数N。

6. 按此方法,计算从N=2到N=64时的最小逼近误差RMSE和硬件复杂度C。

import
numpy as np
from
numpy.linalg import norm
import
random

def
dft_matrix(N):
i, j = np.meshgrid(np.arange(N),
np.arange(N))
omega = np.exp(-2 * np.pi * 1j / N)
W = np.power(omega, i * j)
return W / np.sqrt(N)

def diagonal_matrix(N,
k):
D = np.zeros((N,N))
D[k,k] = 1
return D

def
matrix_decomposition(F, iters=100):
N = F.shape[0]
D = [diagonal_matrix(N,k) for k in
range(N)]

best_D = D.copy()
min_error = np.inf

for i in range(iters):
random.shuffle(D)
approx = np.identity(N)
for d in D:
approx = np.dot(approx, d)
error = norm(F - approx, 'fro') / N

if error < min_error:
min_error = error
best_D = D.copy()

return best_D, min_error

if __name__
== '__main__':
for N in [2, 4, 8, 16, 32, 64]:
F = dft_matrix(N)
D, error = matrix_decomposition(F)
print(f'N = {N}: error = {error:.4f},
complexity = {len(D)}')

问题二:

使用类似问题1的对角矩阵分解方法。

根据约束条件2,每个对角矩阵的非零元素取值为整数集P中的值。

通过穷举P中的值,选择肯定使逼近误差最小的元素值。

硬件复杂度计算同样根据矩阵乘法次数,且考虑元素取值范围q=3。

1. F_4 的定义如下:

$$

F_4 = \frac{1}{2} \begin{bmatrix}

1 & 1 & 1 & 1\

1 & j & -1 & -j\

1 & -1 & 1 & -1\

1 & -j & -1 & j

\end{bmatrix}

$$ 2. 将其分解为4个对角矩阵Di:

$$

F_4 \approx D_1D_2D_3D_4

$$ 其中Di是仅第i个对角元素非零的对角矩阵。 3. 根据元素取值范围P={0,±1,±2},对Di的非零元素取值进行穷举,选择误差最小的取值:

$$

\begin{aligned}

D_1 &= \begin{bmatrix}

1 & 0 & 0 & 0\

点击资料获取入口

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

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

相关文章

开源负载测试神器K6

简介&#xff1a;K6是一个强大的开源负载和性能测试工具&#xff0c;用于测试软件系统的性能和可靠性。K6的使用主要是编写测试脚本并运行&#xff0c;这些脚本主要用JavaScript编写&#xff0c;可以使用HTTP&#xff0c;WebSocket等多种协议进行测试。并且易于安装和运行&…

Java Web框架,如Spring MVC,是一种用于构建Web应用程序的软件框架:学生考试Web应用程序

文章目录 什么是Java Web框架&#xff1f;MVC模式在Spring MVC中的应用简单的学生考试Web应用程序设置Spring MVC项目创建实体类创建考试实体类创建控制器创建服务层创建数据库创建视图配置Spring MVC实现功能运行应用程序运行应用程序 &#x1f388;个人主页&#xff1a;程序员…

MySQL学习笔记3

MySQL的源码编译安装&#xff1a; 1、参考MySQL的源码安装官方文档&#xff1a; 2、源码安装定制选项&#xff1a; 3、源码安装三部曲&#xff1a;配置、编译、安装。 4、软件安装包&#xff1a; mysql-boost-5.7.43.tar.gz 5、安装需求&#xff1a; 安装需求具体配置安装目…

安装gpu版本的paddle和paddleclas

安装gpu版本的paddle python -m pip install paddlepaddle-gpu2.3.2.post111 -f https://www.paddlepaddle.org.cn/whl/windows/mkl/avx/stable.html以上支持cuda11.1版本 其他需求可查阅文档在这里 安装paddleclas 1 在虚拟环境中安装所需的Python库&#xff1a; pip inst…

Cortex-M3/M4堆栈

一、Cortex-M3/M4堆栈操作 Cortex-M3/M4 使用的是“向下生长的满栈”模型。堆栈指针 SP 指向最后一个被压入堆栈的 32 位数值。在下一次压栈时&#xff0c; SP 先自减 4&#xff0c; 再存入新的数值&#xff0c;如图所示为堆栈的PUSH操作。 POP 操作刚好相反&#xff1a;先从 …

电子信息工程专业课复习知识点总结:(五)通信原理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 第一章通信系统概述——通信系统的构成、各部分性质、性能指标1.通信系统的组成&#xff1f;2.通信系统的分类&#xff1f;3.调制、解调是什么&#xff1f;有什么用…

MySQL详解六:备份与恢复

文章目录 1. 数据库备份的分类1.1 从物理和逻辑上分类1.1.1 物理备份1.1.2 逻辑备份 1.2 从数据库的备份策略角度上分类1.2.1 完全备份1.2.2 差异备份1.2.3 增量备份 1.3 常见的备份方法 2. MySQL完全备份2.1 完全备份简介2.2 优点与缺点2.3 实现物理冷备份与恢复2.3.1 实现流程…

备受以太坊基金会青睐的 Hexlink,构建亿级用户涌入 Web3的入口

早在2021年9月&#xff0c;以太坊创始人Vitalik Buterin就曾提出了EIP-4337&#xff08;账户抽象&#xff09;提案&#xff0c;并在去年10月对该提案进一步更新&#xff0c;引发行业的进一步关注。在今年3月&#xff0c;EIP-4337提案正式通过审计&#xff0c;并成为了ERC-4337标…

conda常用指令

常用conda指令 查看当前有哪些环境&#xff0c;有base环境 conda env list 创建环境 # conda create -n 你的环境名 python版本号 # 创建python3.10&#xff0c;名为env虚拟环境 conda create -n env python3.10 激活环境 conda activate env

java框架-Spring-AOP

AOP:动态代理 开发步骤&#xff1a; 导入aop模块定义业务逻辑类定义切面类&#xff1b; -. 切面类标注&#xff1a;Aspect -. 切面类注解&#xff1a; Before: 前置通知, 在方法执行之前执行 After: 后置通知, 在方法执行之后执行 。 AfterRunning: 返回通知, 在方法返回结果之…

[杂谈]-快速了解半波和全波整流

快速了解半波和全波整流 文章目录 快速了解半波和全波整流1、滤波2、半波整流器3、全波整流器4、常见问题 整流器是一种将交流信号转换为脉动直流信号以及将交流电转换为直流电的电子电路。 我们日常生活中几乎所有的电子项目都会用到它。 根据周期传导&#xff0c;本文我们介绍…

【Python】ModuleNotFoundError: No module named ‘Crypto‘

今天在使用一个新的库Crypto时发生了报错 Crypto安装成功~ 导入Crypto模块也没有问题 运行时却发生了报错&#xff1a; 没有这个模块&#xff1f; 我明明安装成功了&#xff0c;为什么报错没有这个库呢&#xff1f; 于是我去查看了一下是不是没有安装上呢&#xff1f; 为什么…

sql注入挖掘

出现的条件 只要是和数据库有交互 没有过滤拼接的sql语句可以执行 判断 这个是在url筐里的

想要精通算法和SQL的成长之路 - 双指针【数组】

想要精通算法和SQL的成长之路 - 双指针【数组】 前言一. 合并两个有序数组二. 删除有序数组中的重复项 II 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 合并两个有序数组 原题链接 抓住重点信息&#xff1a; 两个数组都是非递减顺序排列。num1数组&#xff0c;末尾包…

在Bat To Exe Converter,修改为当异常结束或终止时,程序重新启动执行

在Bat To Exe Converter&#xff0c;修改为当异常结束或终止时&#xff0c;程序重新启动执行 .bat中的代码部分&#xff1a; .bat中的代码echo offpython E:\python\yoloProjectTestSmallLarge\detect.pypause&#xff0c;我想你能帮在Bat To Exe Converter&#xff0c;修改成…

JAVA入坑之嵌套类

一、嵌套类入门 1.1概述 Java嵌套类是指在一个类中定义另一个类的一种方式&#xff0c;它可以提高代码的可读性、可维护性和封装性。Java嵌套类分为两种类型&#xff1a;静态嵌套类和非静态嵌套类。 静态嵌套类&#xff1a;Static nested classes,即类前面有static修饰符 非静…

【进阶C语言】字符串与内存库函数认识与模拟实现

本章内容大致目录&#xff1a; 1.strlen函数 2.strcpy函数 3.strcmp函数 4.strcat函数 5.strstr函数 6.strtok函数 7.strerror与perror函数 8.字符操作函数 9.内存操作函数 10.总结 以上函数均属于库函数&#xff0c;有的函数则会介绍如何模拟实现。 一、strlen函数…

conda创建虚拟环境安装aix360

目录 创建虚拟环境查看已有虚拟环境进入所创建的虚拟环境查看已安装的程序查看已安装的python模块配置镜像pipconda 安装aix360将环境添加到jupyter删除虚拟环境 创建虚拟环境 建议装python3.7python3.7python3.7python3.7python3.7python3.7python3.7python3.7python3.7pytho…

YTM32的LIN通信协议引擎LinFlexD外设模块详解

YTM32的LIN通信协议引擎LinFlexD外设模块详解 文章目录 YTM32的LIN通信协议引擎LinFlexD外设模块详解LINFlexD外设简介LINFlexD工作机制初始化主机模式从机模式错误状态标志位超时错误&#xff08;Timeout Error&#xff09;ID过滤机制接收器检测帧间隔段和帧间隔段分隔符产生波…

[游戏开发][Shader]GLSLSandBox转Unity-CG语言

官网 GLSL Sandbox Galleryhttps://glslsandbox.com/ 屏幕坐标计算 fragCoord与_ScreenParams mat2矩阵转换 vec2向量 在GLSL里mat2(a, b, c, d)函数返回vec2但是在CG语言里 没有mat2函数&#xff0c;用下面的值替换mat2方法vec2(a * 1. c * 1., b * 1. d * 1.);举例&…