【问题标题】:Matlab piecewise two variables functionMatlab分段二变量函数
【发布时间】:2016-11-15 03:32:37
【问题描述】:

我正在尝试绘制两个变量的分段函数,但我编写的代码不起作用。

这是我的代码

c=-0.5;
b=0.5;
L=0:1:100;
K=0:1:100;
[L,K]= meshgrid(L,K);

for i=1:length(L)
    for q=1:length(K)
            if 
            {
            L(i)/K(q)>=-c
            Z=(K(q).^b).*(L(i)+(b.*c).*K(q)).^(1-b);
            else
            Z=((-1/c)^b) .*(1-b).*(1-b);
            }
            end
    end
end
surf(Z)

有人可以帮我吗?

【问题讨论】:

    标签: matlab


    【解决方案1】:

    您的代码的第一个问题是使用大括号{ ... }。与许多其他编程语言(例如 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。

    如上一个(现已删除)答案中所建议的那样,您无需显式编写 .* 而不是 *,因为您处理的是标量而不是向量或矩阵。如果你想计算两个相同大小的向量/矩阵之间的逐点乘法,你只需要.*。使用标量,两者都起作用并导致相同的结果,但根本不需要。

    那么,不要使用lengthlength 只返回 最大 数组维度的长度。如果您将K 从 0 更改为 1000,或者将步长设置为 0.1,这将失败。相反,使用size 来获取指定维度的长度。对i 使用第一个维度,对q 使用第二个维度。

    还有一个提示:don't use i or j as variables in MATLAB,因为它们用于表示虚数单位。只需使用iik 或您喜欢的任何其他名称。在我看来,在 for 循环中使用 ij 是一个坏习惯 - 而是使用一些有意义的名称,例如 rowNumberimageNumber,或者任何适用于你的情况 - 所以阅读代码的人知道什么这真的是。

    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)
    

    这样,您的代码可以顺利运行,并按预期创建曲面图。

    【讨论】:

      【解决方案2】:

      这是向量化(多合一操作)matlab 编码可以在效率方面带来巨大好处的一个典型例子:

      c=-0.5;
      b=0.5;
      L=0:1:100;
      K=0:1:100;
      
      % slow loop-based method - shouldn't use meshgridded L and K here
      Z = zeros(length(L), length(K));
      for i=1:length(L)
          for q=1:length(K)
              if L(i)/K(q)>=-c
                  Z(i,q) = (K(q)^b)*(L(i)+(b*c)*K(q))^(1-b);
              else
                  Z(i,q) =((-1/c)^b)*(1-b)*(1-b);
              end
          end
      end
      figure(1)
      surf(L,K,Z)
      
      
      
      % much faster vectorized approach
      ZZ = zeros(length(L), length(K));
      [KK,LL]= meshgrid(K, L);  % corrected order of meshgrid inputs and outputs
                                % ---alternatively you could use [LL,KK]=ndgrid(L,K);
      case1 = LL ./ KK >= -c;
      case2 = ~case1;
      ZZ(case1) = KK(case1).^b .* ( LL(case1) + (b*c) .* KK(case1) ) .^ (1 - b);
      ZZ(case2) = ((-1/c)^b)*(1-b)*(1-b);
      
      figure(2)
      surf(L,K,ZZ)    
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-05
        • 1970-01-01
        • 1970-01-01
        • 2011-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-10
        相关资源
        最近更新 更多