1

我正在尝试绘制函数

f(x, y) = (x – 3).^2 – (y – 2).^2.

x 是从 2 到 4 的向量,y 是从 1 到 3 的向量,两者的增量都是 0.2。但是,我收到错误:

“下标索引必须是真正的正整数或逻辑”。

我该怎么做才能修复此错误?

4

3 回答 3

4

我(想)我看到了你想要达到的目标。您正在像数学函数定义一样编写语法。Matlab 将其解释f为二维数据类型,并尝试将表达式的值分配给索引为 的数据x,yx和的值y不是整数,所以 Matlab 抱怨。

如果您想将函数的输出(我们称之为z)绘制为 and 的函数xy您需要以完全不同的方式定义函数。. .

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两者的函数xy,那么您需要提供范围内所有可能的组合。这就是包含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');
于 2012-10-19T15:49:21.690 回答
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 的答案相同。它只是为你做repmat-ing。

于 2012-10-20T00:39:46.677 回答
1

您的问题是您正在使用的函数使用整数,并且您试图为其分配一个双精度值。整数不能有小数位。要解决此问题,您可以使其以 1 而不是 0.2 为增量增加

于 2012-10-19T15:48:29.953 回答