我正在尝试绘制函数
f(x, y) = (x – 3).^2 – (y – 2).^2.
x是2到4的向量,y是1到3的向量,两者的增量都是0.2。但是,我收到了错误:
“下标索引必须是实数正整数或逻辑”。
如何解决此错误?
答案 0 :(得分:4)
我(想)我看到你想要实现的目标。您正在编写类似数学函数定义的语法。 Matlab将f
解释为二维数据类型,并尝试将表达式的值分配给在x,y
索引的数据。 x
和y
的值不是整数,因此Matlab抱怨。
如果要将函数的输出(我们将其称为z
)绘制为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
命令的行所用的内容。
修改强>
有一个简洁的Matlab函数meshgrid
可以替换@bas建议的脚本的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');
答案 1 :(得分:2)
我通常使用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的答案相同。它只是为你做的重组。
答案 2 :(得分:1)
您的问题是您正在使用的函数使用整数,并且您正在尝试为其分配双精度。整数不能有小数位。要解决此问题,您可以将其增加到以1为增量而不是0.2
的增量