我想在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
?
答案 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]);
另一个选择是使用subs
和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
来剪切无关紧要的虚部。
答案 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)
结果: