首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MATLAB中的双傅里叶级数

MATLAB中的双傅里叶级数
EN

Stack Overflow用户
提问于 2016-11-10 19:15:55
回答 2查看 1.1K关注 0票数 3

我想在下面的MATLAB中为fg函数绘制一个网格:

我为fg试过这个

代码语言:javascript
复制
%% 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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-10 20:26:36

如果您要使用符号数学,那么使用假设是个好主意,特别是在处理周期函数和不连续函数时。您还可能希望使用fmesh (或旧版本的ezmesh )来绘制符号表达式的网格:

代码语言:javascript
复制
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]);

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

另一种选择是使用subsdoublesubs进行数值计算,然后使用mesh绘制图:

代码语言:javascript
复制
[X,Y] = meshgrid(linspace(-5*pi,5*pi,100));
g2 = real(double(subs(g,{x,y},{X,Y})));
mesh(g2);

或者使用matlabFunction创建一个数字函数:

代码语言:javascript
复制
g2 = matlabFunction(g);
[X,Y] = meshgrid(linspace(-5*pi,5*pi,100));
mesh(real(g2(X,Y)));

在后两种情况下,由于数值不精确,必须使用real来裁剪不重要的虚部。

票数 3
EN

Stack Overflow用户

发布于 2016-11-10 20:23:18

如果您希望以显式的方式使用for循环来完成这一任务,那么如下所示:

代码语言:javascript
复制
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')

这是一种更紧凑的方式,应该更快:

代码语言:javascript
复制
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)

其结果是:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40535336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档