您的代码的第一个问题是使用大括号{ ... }。与许多其他编程语言(例如 C 或 Java)不同,您不需要任何花括号来将多个命令组合在一起(例如在 if 或 for 子句中)。相反,MATLAB 使用end 语句,如下所示。
其次,在每次迭代中编写Z = ...,Z 在每次迭代中都会被覆盖。这样,您将在代码末尾获得一个数字 Z。相反,您应该使用matrix indexing 将计算结果写入Z 中的(i,q)-th 位置。这就像写Z(i,q) = ...; 一样简单。虽然这已经可行,但您应该 preallocate 您的 Z 矩阵,这意味着您在 for 循环之前创建一个零矩阵。然后 MATLAB 不必在每次迭代中增加矩阵的大小。这是使用zeros 函数完成的。
第三,您必须调用 surf(L,K,Z) 而不是 surf(Z) 才能获得正确的轴:使用 surf(Z),它们将从 1 到 101,而它们应该从 0 到 100。
如上一个(现已删除)答案中所建议的那样,您无需显式编写 .* 而不是 *,因为您处理的是标量而不是向量或矩阵。如果你想计算两个相同大小的向量/矩阵之间的逐点乘法,你只需要.*。使用标量,两者都起作用并导致相同的结果,但根本不需要。
那么,不要使用length。 length 只返回 最大 数组维度的长度。如果您将K 从 0 更改为 1000,或者将步长设置为 0.1,这将失败。相反,使用size 来获取指定维度的长度。对i 使用第一个维度,对q 使用第二个维度。
还有一个提示:don't use i or j as variables in MATLAB,因为它们用于表示虚数单位。只需使用ii 或k 或您喜欢的任何其他名称。在我看来,在 for 循环中使用 i 和 j 是一个坏习惯 - 而是使用一些有意义的名称,例如 rowNumber 或 imageNumber,或者任何适用于你的情况 - 所以阅读代码的人知道什么这真的是。
c=-0.5;
b=0.5;
L=0:1:100;
K=0:1:100;
[L,K]= meshgrid(L,K);
% Preallocate Z
Z = zeros(size(L,1), size(K,2));
for ii=1:size(L,1)
for q=1:size(K,2)
if L(ii)/K(q)>=-c
Z(ii,q) = (K(q)^b)*(L(ii)+(b*c)*K(q))^(1-b);
else
Z(ii,q) =((-1/c)^b)*(1-b)*(1-b);
end
end
end
surf(L,K,Z)
这样,您的代码可以顺利运行,并按预期创建曲面图。