如何在MATLAB R2014b中使用ezsurf绘制带约束条件的函数曲面
MATLAB带约束曲面绘制问题解决
代码错误点
- 计算函数值
f时,两个多项式乘积使用了矩阵乘法*,未使用逐元素乘法.*,无法得到每个网格点对应的正确函数值,这是无图形显示的核心原因。 - 逐个对X1、X2赋值NaN的写法效率偏低,且容易引入额外的运算错误。
- 约束判断使用
<=和题目要求的<存在微小偏差,虽然影响不大但不符合题面要求。
修正后的完整代码
% 生成网格点,可适当调小步长获得更光滑的曲面 x = 0:0.05:2; y = 0:0.05:2; [X1,X2] = meshgrid(x,y); % 定义所有约束,满足条件为逻辑值1,不满足为0 constraint1 = -X1 < 0; constraint2 = -X2 < 0; constraint3 = 3*X1 - X1.*X2 + 4*X2 -7 < 0; constraint4 = 2*X1 + X2 -3 < 0; constraint5 = 3*X1 - 4*X2.^2 -4*X2 <0; % 合并约束,所有约束同时满足的点才是有效点 valid = constraint1 & constraint2 & constraint3 & constraint4 & constraint5; % 计算函数值,所有逐元素运算的乘方、乘法都需要加.前缀 f = ((X1+1.5).^2 + 5*(X2-1.7).^2) .* ((X1-1.4).^2 + 0.6*(X2-0.5).^2); % 不满足约束的点函数值设为NaN,绘制时会自动忽略 f(~valid) = NaN; % 绘制曲面 surf(X1,X2,f); shading interp; % 可选配置,让曲面颜色过渡更光滑 xlabel('x1'); ylabel('x2'); zlabel('f');
补充说明
如果运行后还是无图形显示,可以适当放大x、y的取值范围,确认可行域是否在你设置的网格范围内;也可以先用mesh(X1,X2,f)绘制网格,验证可行域是否正常生成。
内容的提问来源于stack exchange,提问作者Ongky Denny Wijaya
相关产品推荐
相关产品推荐

