我想在下面的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
发布于 2016-11-10 20:26:36
如果您要使用符号数学,那么使用假设是个好主意,特别是在处理周期函数和不连续函数时。您还可能希望使用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和double对subs进行数值计算,然后使用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来裁剪不重要的虚部。
发布于 2016-11-10 20:23:18
如果您希望以显式的方式使用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)其结果是:

https://stackoverflow.com/questions/40535336
复制相似问题