matlab surf作图

我想画一个空间曲面
x=-2000:2000;
y=-2000:2000;
[x,y]=meshgrid(x,y);
z=f(x,y);
surf(x,y,z)
这种方法画, 但在x,y趋于0时 z是没有意义的
有什么方法 让z在 -50<x<50,-50<y<50时 直接取0
就是说 if -50<x<50,-50<y<50
z=0
else
z=f(x,y)
end
最后 用surf(x,y,z)作图

第1个回答  2014-06-07
那就用mesh画追问

能 具体点么 从 x=-2000:2000;
y=-2000:2000;


到 mesh(x,y,z)

第2个回答  2014-06-07
xind = (abs(x)<50);
yind = (abs(y)<50);
xyind = xind&yind;
z(xyind) = 0;追问

看不大懂诶
能具体点 从头写完么

追答

x=-2000:2000;
y=-2000:2000;
[x,y]=meshgrid(x,y);
z=f(x,y); % 这是你自己给的
xind = (abs(x)<50); % 返回逻辑值矩阵。对应x中的元素,x各元素符合条件(-50<x<50)的为1,不符合的为0.
yind = (abs(y)<50);
xyind = xind&yind; % 逻辑与运算。就是同时满足-50<x<50,-50<y<50的逻辑值矩阵
z(xyind) = 0; % 用x,y逻辑值来索引z中的元素,反正位置是一一对应的。满足条件的z元素赋为0
surf(x,y,z)

追问

谢谢 这个应该可以
但是 之前 z=f(x,y) 时 由于此时是对所有的x,y运算 就已经出现错误了

追答

出现什么错误?是z=f(x,y)吗?你是怎么写的?

追问

我的函数比较复杂 就比如说1/x+1/y 吧
正是因为会出现问题 我才考虑直接用0代替函数值 我希望得到一个分段函数 而 不是先算出f(x,y) 再用0来代替一些 因为无法先算出f(x,y)

追答

if (abs(x1)<50)&(abs(y1)<50)

z=0
else
z=f(x,y)
end
但是这不是矩阵操作,要加循环。效率会比较低

如果是我的话,会先构造一个x1,y1。
x=-2000:2000;
y=-2000:2000;
[x,y]=meshgrid(x,y);
xind = (abs(x)<50);
yind = (abs(y)<50);
xyind = xind&yind;
x1 = x;
y1 = y;
x1(xyind) = 2000; % 先把奇异点的坐标都赋为2000,最后重新覆盖
y1(xyind) = 2000;
z=f(x1,y1); % 这样奇异点的z其实是(2000,2000)的z,下面再重新赋值
z(xyind) = 0;
surf(x,y,z)
这样虽然绕来绕去的,但是避免了循环,和找元素在矩阵中的位置,其实执行效率要高得多

追问

同学 你对这种替换的方法 情有独钟呢 略懂了 万分感谢
在你的帮助下 我基本完成了 thanks 我也学会了这种替代方法
不过 这题里面的奇异点不是abs(x<50)&abs(y<50) 而是x<50|y<50
你看看吧 1/60+1/0是没有意义的 是我一开始误导了你 呵呵 望一笑了之

本回答被提问者采纳
相似回答