我正在尝试绘制函数
f(x, y) = (x – 3).^2 – (y – 2).^2.
x 是从 2 到 4 的向量,y 是从 1 到 3 的向量,两者的增量都是 0.2。但是,我收到错误:
“下标索引必须是真正的正整数或逻辑”。
我该怎么做才能修复此错误?
我(想)我看到了你想要达到的目标。您正在像数学函数定义一样编写语法。Matlab 将其解释f
为二维数据类型,并尝试将表达式的值分配给索引为 的数据x,y
。x
和的值y
不是整数,所以 Matlab 抱怨。
如果您想将函数的输出(我们称之为z
)绘制为 and 的函数x
,y
您需要以完全不同的方式定义函数。. .
f = @(x,y)(x-3).^2 - (y-2).^2;
x=2:.2:4;
y=1:.2:3;
z = f( repmat(x(:)',numel(y),1) , repmat(y(:),1,numel(x) ) );
surf(x,y,z);
xlabel('X'); ylabel('Y'); zlabel('Z');
这会给你这样的输出。. .
第一行的f = @(x,y)
部分说明您要定义一个名为f
获取变量x
和的函数y
。该行的其余部分是该函数的定义。
如果您想绘制z
两者的函数x
和y
,那么您需要提供范围内所有可能的组合。这就是包含repmat
命令的行的用途。
编辑
正如@bas 所建议的那样,有一个简洁的 Matlab 函数meshgrid
可以替换脚本的 repmat 版本(欢迎 bas,请滚动到 bas 的答案并 +1!)...
f = @(x,y)(x-3).^2 - (y-2).^2;
x=2:.2:4;
y=1:.2:3;
[X,Y] = meshgrid(x,y);
surf(x,y,f(X,Y));
xlabel('x'); ylabel('y'); zlabel('z');
我通常使用MESHGRID函数。像这样:
x = 2:0.2:4;
y = 1:0.2:3;
[X,Y] = meshgrid(x,y);
F = (X-3).^2-(Y-2).^2;
surf(x,y,F);
xlabel('x');ylabel('y');zlabel('f')
这与@learnvst 的答案相同。它只是为你做repmat-ing。
您的问题是您正在使用的函数使用整数,并且您试图为其分配一个双精度值。整数不能有小数位。要解决此问题,您可以使其以 1 而不是 0.2 为增量增加