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 ...
随机推荐
- learning rate warmup实现
def noam_scheme(global_step, num_warmup_steps, num_train_steps, init_lr, warmup=True): ""& ...
- 【UOJ#386】【UNR#3】鸽子固定器(贪心)
[UOJ#386][UNR#3]鸽子固定器(贪心) 题面 UOJ 题解 一个不难想到的暴力做法是把东西按照\(s\)排序,这样子我们枚举极大值和极小值,那么我们选择的一定是这一段之间\(v\)最大的那 ...
- 如何通过 Freemark 优雅地生成那些花里胡哨的复杂样式 Excel 文件?
欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 高级架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...
- Python中的常见特殊方法或属性—— dir方法和dict属性
一.__dir__方法 对象的__dir__()方法的作用是列出对象内部所有的属性名和方法名,该方法将会返回包含所有属性或方法名的序列. 如果程序对某个对象执行dir(obj)函数,实际上就是将该对象 ...
- Python【day 12】生成器和推导式
一.生成器和生成器函数1.生成器和生成器函数的概念 1.生成器的本质是迭代器 2.函数中包含yield,就是生成器函数 2.生成器函数的写法 def func(): a =10 yield 20 ge ...
- easyui datagird 解决行高不一致问题!
<style>.datagrid-btable .datagrid-cell {padding: 6px 4px;overflow: hidden;text-overflow: ellip ...
- ios--NavigationViewController跳转、返回传值
使用NavigationViewController进行页面跳转时,应该使用pushViewController方法来跳转至下一页面,这样的话,下一页面同样在NavigationViewContr ...
- day 36
目录 pymysql操作mysql 安装 连接 增 删 改 查 索引 为什么使用索引以及索引的作用 类比 索引的本质 索引的底层原理 索引的种类(重点) 主键索引 唯一索引 普通索引 索引的创建 主键 ...
- Grafana数据迁移
各系统和docker安装官方文档 https://grafana.com/grafana/download?platform=linux ubuntu安装相应版本的Grafana wget https ...
- vue-router有哪几种导航钩子 keep-alive的详细用法 解决跨域
1===>vue-router有哪几种导航钩子? 第一种:是全局导航钩子:router.beforeEach(to,from,next) 第二 ...