MATLAB 中的双傅里叶级数
Double fourier series in MATLAB
我想在 MATLAB 中为下面的 f
和 g
函数绘制网格:
我已经为 f
和 g
试过了:
%% plot f
[x,y] = meshgrid(linspace(-pi,pi,50));
f = x.*y ;
subplot(1,2,1)
mesh(f)
title('f')
%% plot g
syms m n
A = 4*(-1)^(m+n)*(sin(m*x)*sin(n*y))/(m*n);
g = symsum(symsum(A,n,1,inf),m,1,inf);
subplot(1,2,2)
mesh(g)
title('g')
mesh
的结果是:
绘制f
的部分是运行没有任何错误。绘制 g
的另一部分在图中未显示任何内容。如何绘制 g
?
如果您想使用 for
循环的显式方法,这里是:
XY = 2*linspace(-pi,pi,50);
N = 100;
M = 100;
G = zeros(numel(XY));
tmp = zeros(M*N,1);
cx = 1;
for x = XY
cy = 1;
for y = XY
c = 1;
for m = 1:M
for n = 1:N
tmp(c) = 4*(-1)^(m+n)*(sin(m*x)*sin(n*y))/(m*n);
c = c+1;
end
end
G(cx,cy) = sum(tmp);
cy = cy+1;
end
cx = cx+1;
end
mesh(G)
title('g')
这是一种更紧凑的方式,应该更快:
XY = 2*linspace(-pi,pi,50);
N = 100;
M = 100;
G = zeros(numel(XY));
cx = 1;
for x = XY
cy = 1;
for y = XY
gfun = @(m,n) 4.*(-1).^(m+n).*(sin(m.*x).*sin(n.*y))./(m.*n);
tmp = bsxfun(gfun,(1:M).',1:N);
G(cx,cy) = sum(tmp(:));
cy = cy+1;
end
cx = cx+1;
end
mesh(G)
结果:
如果您打算使用符号数学,最好熟悉 assumptions, especially when dealing with periodic functions and functions with discontinuities. You may also want to use fmesh
(或旧版本中的 ezmesh
)来绘制符号表达式的网格:
syms m n x y
assume(in(m,'integer') & m>=1);
assume(in(n,'integer') & n>=1);
assume(x>-pi & x<pi);
assume(y>-pi & y<pi);
A = 4*(-1)^(m+n)*(sin(m*x)*sin(n*y))/(m*n);
g = symsum(symsum(A,n,1,Inf),m,1,Inf);
fmesh(g,5*[-pi pi -pi pi],'MeshDensity',1e2); % or ezmesh(g,5*[-pi pi -pi pi]);
这将创建如下图:
另一种选择是使用 subs
and double
对 g
进行数值计算,然后使用 mesh
绘制:
[X,Y] = meshgrid(linspace(-5*pi,5*pi,100));
g2 = real(double(subs(g,{x,y},{X,Y})));
mesh(g2);
或使用matlabFunction
创建数值函数:
g2 = matlabFunction(g);
[X,Y] = meshgrid(linspace(-5*pi,5*pi,100));
mesh(real(g2(X,Y)));
在后两种情况下,由于数值不精确,必须使用 real
来裁剪无关紧要的虚部。
我想在 MATLAB 中为下面的 f
和 g
函数绘制网格:
我已经为 f
和 g
试过了:
%% plot f
[x,y] = meshgrid(linspace(-pi,pi,50));
f = x.*y ;
subplot(1,2,1)
mesh(f)
title('f')
%% plot g
syms m n
A = 4*(-1)^(m+n)*(sin(m*x)*sin(n*y))/(m*n);
g = symsum(symsum(A,n,1,inf),m,1,inf);
subplot(1,2,2)
mesh(g)
title('g')
mesh
的结果是:
绘制f
的部分是运行没有任何错误。绘制 g
的另一部分在图中未显示任何内容。如何绘制 g
?
如果您想使用 for
循环的显式方法,这里是:
XY = 2*linspace(-pi,pi,50);
N = 100;
M = 100;
G = zeros(numel(XY));
tmp = zeros(M*N,1);
cx = 1;
for x = XY
cy = 1;
for y = XY
c = 1;
for m = 1:M
for n = 1:N
tmp(c) = 4*(-1)^(m+n)*(sin(m*x)*sin(n*y))/(m*n);
c = c+1;
end
end
G(cx,cy) = sum(tmp);
cy = cy+1;
end
cx = cx+1;
end
mesh(G)
title('g')
这是一种更紧凑的方式,应该更快:
XY = 2*linspace(-pi,pi,50);
N = 100;
M = 100;
G = zeros(numel(XY));
cx = 1;
for x = XY
cy = 1;
for y = XY
gfun = @(m,n) 4.*(-1).^(m+n).*(sin(m.*x).*sin(n.*y))./(m.*n);
tmp = bsxfun(gfun,(1:M).',1:N);
G(cx,cy) = sum(tmp(:));
cy = cy+1;
end
cx = cx+1;
end
mesh(G)
结果:
如果您打算使用符号数学,最好熟悉 assumptions, especially when dealing with periodic functions and functions with discontinuities. You may also want to use fmesh
(或旧版本中的 ezmesh
)来绘制符号表达式的网格:
syms m n x y
assume(in(m,'integer') & m>=1);
assume(in(n,'integer') & n>=1);
assume(x>-pi & x<pi);
assume(y>-pi & y<pi);
A = 4*(-1)^(m+n)*(sin(m*x)*sin(n*y))/(m*n);
g = symsum(symsum(A,n,1,Inf),m,1,Inf);
fmesh(g,5*[-pi pi -pi pi],'MeshDensity',1e2); % or ezmesh(g,5*[-pi pi -pi pi]);
这将创建如下图:
另一种选择是使用 subs
and double
对 g
进行数值计算,然后使用 mesh
绘制:
[X,Y] = meshgrid(linspace(-5*pi,5*pi,100));
g2 = real(double(subs(g,{x,y},{X,Y})));
mesh(g2);
或使用matlabFunction
创建数值函数:
g2 = matlabFunction(g);
[X,Y] = meshgrid(linspace(-5*pi,5*pi,100));
mesh(real(g2(X,Y)));
在后两种情况下,由于数值不精确,必须使用 real
来裁剪无关紧要的虚部。