MATLAB中的双傅里叶级数

时间:2016-11-10 19:15:56

标签: matlab matlab-figure symbolic-math

我想在MATLAB中为下面的fg函数绘制一个网格: f and it's double Fourier series g

我为fg尝试了此操作:

%% 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的结果是:

the result of mesh

绘制f的部分正在运行,没有任何错误。绘制g的另一部分在图中没有显示任何内容。如何绘制g

2 个答案:

答案 0 :(得分:3)

如果你正在使用符号数学,那么对assumptions感到满意是一个好主意,特别是在处理具有不连续性的周期函数和函数时。您可能还想使用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]);

这会创建一个这样的情节: fmesh plot

另一个选择是使用subsdouble以数字方式评估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来剪切无关紧要的虚部。

答案 1 :(得分:0)

如果您希望使用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)

结果:

fourier