Fourier 级数展开(案例:级数展开 AND 求和)
前言
理论依据如上图所示。
首先我们需要定义了一个名为fseries
的函数,用于计算函数的傅里叶级数展开。
函数功能
计算函数f(x)
在区间[a,b]
上的傅里叶级数展开式,返回前n
项的系数和展开后的表达式。
参数说明
- 输入:
f
:需要展开的函数表达式x
:自变量n
:展开的项数a,b
:展开区间(默认[-pi, pi]
)
- 输出:
A
:傅里叶级数的余弦项系数(包括常数项)B
:傅里叶级数的正弦项系数F
:展开后的傅里叶级数表达式
代码逐行解释
函数定义
代码:
function [A,B,F]=fseries(f,x,n,a,b)
解释:定义函数fseries
,指定输入输出参数
参数处理
代码:
if nargin==3,a=-pi;b=pi;end
解释:若只输入 3 个参数,默认展开区间为[-pi, pi]
计算区间长度
代码:
L=(b-a)/2;
解释:计算区间半长度,用于傅里叶级数的周期转换
变量替换(区间映射)
代码:
if a+b,f=subs(f,x+L+a);end
解释:
将任意区间[a,b]
映射到标准区间[-L,L]
,便于统一计算
- 映射公式:
x' = x + L + a
初始化系数和展开式
代码:
A=int(f,x,-L,L)/L;B=[];F=A/2;
解释:
- 计算常数项系数
A0
(傅里叶级数中的a0/2
项) - 初始化正弦系数数组
B
- 初始化展开式
F
,从常数项A/2
开始
计算各阶傅里叶系数并构建展开式
代码:
for i=1:nan=int(f*cos(i*pi*x/L),x,-L,L)/L; % 计算余弦项系数anbn=int(f*sin(i*pi*x/L),x,-L,L)/L; % 计算正弦项系数bnA=[A,an]; % 将an添加到系数数组AF=F+an*cos(i*pi*x/L)+bn*sin(i*pi*x/L); % 累加傅里叶项
end;
解释:
- 循环计算前
n
项的余弦系数an
和正弦系数bn
- 系数计算公式符合傅里叶级数的定义:
an = (1/L)∫f(x)cos(iπx/L)dx
(积分区间[-L,L]
)bn = (1/L)∫f(x)sin(iπx/L)dx
(积分区间[-L,L]
)
- 逐步构建傅里叶级数展开式
F
还原变量(逆映射)
代码:
if a+bF=subs(F,x,x-L-a);
end
解释:将变量从标准区间[-L,L]
映射回原区间[a,b]
,得到最终的展开式
具体实现步骤
- 处理输入参数,设置默认区间
- 将任意区间映射到标准区间简化计算
- 按照傅里叶级数定义计算各阶系数
- 构建级数展开式并映射回原区间
使用时,需要传入符号函数f
、自变量x
和展开项数n
,可指定展开区间[a,b]
,函数会返回系数数组和展开后的表达式。
完整代码
注意:这是两个文件,不是一个!!!
&& test.m
clc,clear;
syms x;
f=x*(x+pi)*(x+2*pi);
[A,B,F]=fseries(f,x,12,0,2*pi);
F
%% fseries.m
function [A,B,F]=fseries(f,x,n,a,b)
if nargin==3,a=-pi;b=pi;end
L=(b-a)/2;
if a+b,f=subs(f,x+L+a);end
A=int(f,x,-L,L)/L;B=[];F=A/2;
for i=1:nan=int(f*cos(i*pi*x/L),x,-L,L)/L;bn=int(f*sin(i*pi*x/L),x,-L,L)/L;A=[A,an];F=F+an*cos(i*pi*x/L)+bn*sin(i*pi*x/L);
end;
if a+bF=subs(F,x,x-L-a);
end