matlab应用——求极限,求导,求积分,解方程,概率统计,函数绘图,三维图像,拟合函数,动态图,傅里叶变换....更多内容尽在个人专栏:matlab学习
上一节我们已经做好了关于傅里叶变换的一些准备工作,这一节我们正式开始利用matlab认识傅里叶变换
傅里叶变换是基于这样一个原理:
任何周期函数都可以用正弦函数和余弦函数构成的无穷级数来表示(关于这点我们下面会用matlab直观的表现一下)
选择正弦函数与余弦函数作为基函数是因为它们是正交的
公式(我觉得这个公式更方便初学者理解):
1、给定周期函数
则周期
即
2、如果区间并不对称,比如
则现将函数向左平移
此时
3、傅里叶级数
注意这里i不是虚数单位,别看混了(笑哭)
其中系数:
推导过程大家可以看看这位大佬的:
ElPsyCongree:傅里叶系列(一)傅里叶级数的推导zhuanlan.zhihu.com这里我们自己写一下matlab实现傅里叶变换的代码:
这里为了让代码不至于太过冗长,我们可以使用一下自定义函数,基本操作可以看一下本专栏的这篇文章:
浅吻板牙:从零开始的matlab学习笔记——(9)自定义函数zhuanlan.zhihu.com代码如下
function F= fuliye(f,x,n,a,b) %表达式f,自变量x,n阶展开,区间(a,b)
L=(b-a)/2
if abs(a+b)>0
f=subs(f,x,x+L+a) %向左平移
end
a0=int(f,x,-L,L),F=a0/2
for i=1:n %累加和我们用for循环实现
ai=int( f*cos(i*pi*x/L),x,-L,L )/L
bi=int( f*sin(i*pi*x/L),x,-L,L )/L
F=F+ai*cos(i*pi*x/L)+bi*sin(i*pi*x/L)
end
if abs(a+b)>0
F=subs(F,x,x-L-a) %再平移回来
end
end
这里我们使用for循环来进行傅里叶变换的累加和,for循环:
浅吻板牙:从零开始的matlab学习笔记——(5)循环zhuanlan.zhihu.com此外,int函数代表求积分:
浅吻板牙:从零开始的matlab学习笔记——(8)积分zhuanlan.zhihu.comsubs函数用来进行替换表达式中的变量,以达成平移效果,这个上一节我们刚刚铺垫过:
浅吻板牙:从零开始的matlab学习笔记——(30)傅里叶逼近前传——一些常用函数与基本GUIzhuanlan.zhihu.com这样写好自定义函数之后,保存,我们再本机上就可以自由的调用:
比如近似逼近
syms x f
f=x*(x-pi)*(x-2*pi)
F=fuliye(f,x,6,0,2*pi)
结果输出:
之前我们动态演示过泰勒公式,这里我们再来做一个傅里叶变换的动态图
因为傅里叶变换的计算比较复杂,计算机运行时间比较长,所以我们只是大致的感受一下
这里用分段函数
完整代码:
syms x
y=abs(x)/x
xx=-pi:pi/100:pi
xx=xx(xx~=0) %抠点,分母不能有0
yy=subs(y,x,xx) %替换。这里不大好懂,为了使用plot函数,我们要用密集的点坐标而不是符号量x来绘图
L=pi
a0=int(y,x,-L,L),f=a0/2
F=subs(f,x,xx) %同上替换
plot(xx,yy,xx,F)
axis([-pi,pi,-1.5,1.5])
pause(0.1) %间隔0.1秒
hold off
for i=1:18
ai=int( y*cos(i*pi*x/L),x,-L,L )/L
bi=int( y*sin(i*pi*x/L),x,-L,L )/L
f=f+ai*cos(i*pi*x/L)+bi*sin(i*pi*x/L) %累加,这里没有使用自定义函数,是为了提高计算效率,原理有点类似算法竞赛中的递推,省去了一些没有必要的重复计算
F=subs(f,x,xx)
plot(xx,yy,xx,F)
axis([-pi,pi,-1.5,1.5])
pause(0.01) %因为运算本身需要耗时间,所以停顿时间就设置的极短。但是为了展示动态效果,不得不加上pause函数
hold off
end
一个动画带你直观了解傅里叶变换(滑稽脸)
https://www.zhihu.com/video/1209846220468064256呼,这可能是本专栏目前为止写的最费劲的一节,看到这的朋友如果觉得可以就请双击点个赞吧,能够加个关注就更好了(握手),希望能帮到大家。