Matlab:Toeplitz矩阵-向量乘法的快速傅里叶(FFT)算法
一、$\tt Toeplitz$矩阵与循环($\tt Circulant$)矩阵
定义
为$n\times n$阶循环矩阵。
定义 $T_n(i,j)=t_{j-i} $ 为$n\times n$ 阶$\tt Toeplitz$矩阵
通过令矩阵$B_n=$
从而构造出$2n\times 2n$阶循环矩阵
假设有一$n\times 1$阶列向量$\bf u$
其中,$C_{2n}$可以由快速傅里叶对角化
其中$\bf c$表示$C_{2n}$矩阵的第一列元素,$\bf F$ 表示快速傅里叶($\tt fft$)变换,$\bf F^{-1}$ 表示快速傅里叶($\tt ifft$)逆变换。进一步可写成
因此,计算$\bf T_n u$等价于计算
查阅文献我们知道,直接计算$\bf T_n u$的存储量和计算量分别为$O(n^2)$和$O(n^3)$,但是利用快速傅里叶计算可以将存储量和计算量分别降为$O(n)$和$O(n \log_2 n)$.
从以下数据可以更直观的看出FFT显著的优点
二、数值应用
- 考虑一维椭圆方程
$$-\Delta u=f(x),\qquad a<x<b,\tag{1}$$
满足齐次$Dirichlet$边界条件。
对$x\in [a,b]$一致网格剖分:$a=x_0<x_1,\cdots,x_M=b$,$h=\frac{b-a}{M}$。$U,u$分别表示数值解和真解。应用二阶中心差分逼近二阶导数
$$\Delta u(x_i)= \frac{u(x_{i-1})-2u(x_i)+u(x_{i+1}) }{h^2}+O(h^2).\tag{2}$$
由(2)式可得求解方程(1)的数值格式的矩阵形式
$$A{\bf U}=\widehat{f}.\tag{3}$$
其中
$$A=\tt -\frac{1}{h^2}toeplitz([-2,1,zeros(1,M-3)]),$$
$$\widehat{f}=( f(x_1),f(x_2),\cdots,f(x_{M-1}) )^T.$$
$${\bf U}=(u_1,u_2,\cdots,u_{M-1})^T.$$
- 考虑二维椭圆方程
$$-\Delta u=f({\bf x,y}),\qquad {(\bf x,y)}\in (a,b)\times (c,d),\tag{4}$$
对$x\in [a,b]$一致网格剖分:$a=x_0<x_1,\cdots,<x_{M_1}=b$,$h_1=\frac{b-a}{M_1}$,$c=y_0<y_1,\cdots,<y_{M_2}=d$,$h_2=\frac{d-c}{M_2}$。$U,u$分别表示数值解和真解。应用二阶中心差分逼近二阶导数
$$\Delta u(x_i,y_j)= \frac{u(x_{i-1},y_j)-2u(x_i,y_j)+u(x_{i+1},y_j) }{h_1^2}+ \frac{u(x_i,y_{j-1})-2u(x_i,y_j)+u(x_i,y_{j+1}) }{h_2^2}+O(h_1^2+h_2^2).\tag{5}$$
由(5)式可得求解方程(4)的数值格式的矩阵形式
$$A{\bf U}=\widehat{f}.\tag{6}$$
其中
$$A_1=\tt toeplitz([-2,1,zeros(1,M_1-3)]),$$
$$A_2=\tt toeplitz([-2,1,zeros(1,M_2-3)]),$$
$$ A_x = -\tt \frac{1}{h_1^2} I_{M_2-1} \bigotimes A_1 ,\mbox{(非toeplitz矩阵)}$$
注意到:
$$ I_{M_2-1} \bigotimes A_1U = reshape\Big( A_1 reshape( U,M_1-1,M_2-1 ),( M_1-1 )(M_2-1),1 \Big). $$
$$ A_y = -\tt \frac{1}{h_2^2} A_2 \bigotimes I_{M_1-1} ,$$
$$A = A_x+A_y,$$
$$\widehat{f}=( f(x_1,y_1),f(x_2,y_1),\cdots,f(x_{M_1-1},y_1) , f(x_1,y_2),f(x_2,y_2),\cdots,f(x_{M_1-1},y_2), \cdots\cdots, f(x_1,y_{M_2-1}),f(x_2,,y_{M_2-1}),\cdots,f(x_{M_1-1},,y_{M_2-1}) )^T.$$
$${\bf U}=(u_{1,1},u_{2,1},\cdots,u_{M_1-1,1},u_{1,2},u_{2,2},\cdots,u_{M_1-1,2},\cdots\cdots,u_{1,M_2-1},u_{2,M_2-1},\cdots,u_{M_1-1,M_2-1})^T.$$
由数值格式(3),(6)显然可知,当空间网格剖分很大时,矩阵乘法的计算量将会十分昂贵,因此利用FFT算法是很有必要的。接下来介绍一种有效的线性迭代法-共轭梯度法(CGS)
三、数值例子
- case $I$(1D) : 真解:
$$ u = \sin(x),\qquad x\in( 0,\pi ), $$
分别应用直接法和FFT方法的实验结果见下图
- case $II$(2D) : 真解:
$$ u = \sin(x)\sin(y),\qquad (x,y)\in( 0,\pi )^2, $$
分别应用直接法和FFT方法的实验结果见下图
从数值实验结果可以直观的看出,FFT的计算效率是惊人的!
Matlab:Toeplitz矩阵-向量乘法的快速傅里叶(FFT)算法的更多相关文章
- FFT算法
FFT算法的完整DSP实现 傅里叶变换或者FFT的理论参考: [1] http://www.dspguide.com/ch12/2.htm The Scientist and Engineer's G ...
- 2维FFT算法实现——基于GPU的基2快速二维傅里叶变换
上篇讲述了一维FFT的GPU实现(FFT算法实现——基于GPU的基2快速傅里叶变换),后来我又由于需要做了一下二维FFT,大概思路如下. 首先看的肯定是公式: 如上面公式所描述的,2维FFT只需要拆分 ...
- FFT算法的完整DSP实现
傅里叶变换或者FFT的理论参考: [1] http://www.dspguide.com/ch12/2.htm The Scientist and Engineer's Guide to Digita ...
- matlab中矩阵的表示与简单操作
原文地址为:matlab矩阵的表示和简单操作 一.矩阵的表示在MATLAB中创建矩阵有以下规则: a.矩阵元素必须在”[ ]”内: b.矩阵的同行元素之间用空格(或”,”)隔开: c.矩阵的行与行之间 ...
- Matlab中矩阵的平方和矩阵中每个元素的平方介绍
该文章讲述了Matlab中矩阵的平方和矩阵中每个元素的平方介绍. 设t = [2 4 2 4] 则>> t.^2 ans = 4 164 16 而>> t^2 ans = ...
- FFT算法的完整DSP实现(转)
源:FFT算法的完整DSP实现 傅里叶变换或者FFT的理论参考: [1] http://www.dspguide.com/ch12/2.htm The Scientist and Engineer's ...
- matlab将矩阵数据归一化到[0,255]
matlab将矩阵数据归一化到[0,255] function OutImg = Normalize(InImg) ymax=255;ymin=0; xmax = max(max(InImg) ...
- 快速傅立叶变换(FFT)算法
已知多项式f(x)=a0+a1x+a2x2+...+am-1xm-1, g(x)=b0+b1x+b2x2+...+bn-1xn-1.利用卷积的蛮力算法,得到h(x)=f(x)g(x),这一过程的时间复 ...
- msp430学习笔记-实现开方log等计算及FFT算法(待续)
MSP430 FFT算法实现 http://bbs.21ic.com/icview-391532-1-1.html http://blog.sina.com.cn/s/blog_6cd2030b010 ...
随机推荐
- 一位IT民工的十年风雨历程
距离2020年只有30天了,转眼毕业快10年. 回首自己,已三十有三,中年危机. 古人云三十而立,我却还在测试途中摸爬滚打. 创业,自由职业永远是一个梦,白日梦. 焦虑.迷茫.看不到希望. 这两天一场 ...
- Easyui datagrid扩展子网格detailview增删改查详解
话不多gang,先上代码,将以下三个属性插入主网格的初始化参数中: view : detailview, //1 detailFormatter : function(index, row) { // ...
- raspberry pi 4b 常见的一些配置信息
实验记录地址 https://gitee.com/dhclly/icepi.raspberry-pi 针脚图 面包板 gnd & vcc VCC:电路的供电电压: GND:指板子里面总的地线. ...
- Prometheus K8S中部署Alertmanager
Prometheus K8S中部署Alertmanager 设置告警和通知的主要步骤如下:一.部署Alertmanager二.配置Prometheus与Alertmanager通信三.配置告警 1. ...
- 用guava快速打造两级缓存能力
首先,咱们都有一共识,即可以使用缓存来提升系统的访问速度! 现如今,分布式缓存这么强大,所以,大部分时候,我们可能都不会去关注本地缓存了! 而在一起高并发的场景,如果我们一味使用nosql式的缓存,如 ...
- 用ASP.NET创建数据库
小白的第一次使用: 程序员写程序,就好比一个物品的慢慢诞生,我们今天的这个例子就可以想象成一个物品慢慢的在编译的过程中,让我们所看到 一.创建我们所测试的项目 1.创建一个简单的带有模型层(Model ...
- Java生鲜电商平台-商品的spu和sku数据结构设计与架构
Java生鲜电商平台-商品的spu和sku数据结构设计与架构 1. 先说明几个概念. 电商网站采用在商品模块,常采用spu+sku的数据结构算法,这种算法可以将商品的属性和商品的基本信息分离,分开维护 ...
- ICSharpCode.SharpZipLib 中文乱码问题
今天在调用ICSharpCode.SharpZipLib解压zip文件时出现了中文文件乱码的问题. 解决过程如下: 1.判断是否压缩包本身问题.经查zip文件夹在本地直接解压打开时正确的中文名称,所以 ...
- js javascript 如何获取某个值在数组中的下标
js 某个值在数组中的下标javascript中知道一个数组中的一个元素的值,如何获取数组下标JS 获取数组某个元素下标 函数方法 采用prototype原型实现方式,查找元素在数组中的索引值js查找 ...
- secruity
security3.x <?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns=& ...