【问题标题】:Scilab plotting functions with if带有 if 的 Scilab 绘图函数
【发布时间】:2017-07-08 13:57:52
【问题描述】:

我在 scilab 有问题 如何绘制包含 if 和 的函数

function y = alpha(t)
   if (t < 227.8) then 
       y = 0.75;
   elseif (t < 300) then
       y = 2.8 - 0.009 .* t;
   else
       y = 0.1;
   end   
endfunction

function [r]=minus_alpha(t)
    r = 1 - alpha(t)
endfunction

当我使用时

x = linspace(0,300)
plot(x, alpha(x))

我收到了错误消息

WARNING: Transposing row vector X to get compatible dimensions
plot2d: falsche Größe für Eingangsargument: inkompatible Größen.
Error 999 : in plot2d called by plot

抱歉,德国混音。谢谢。

【问题讨论】:

    标签: function plot interpolation scilab piecewise


    【解决方案1】:

    您可以使用以下代码避免显式循环并提高效率

    function y = alpha(t)
       y=0.1*ones(t);
       y(t<227.8)=0.75;
       i=t>=227.8&t<300;
       y(i)=2.8 - 0.009 .* t(i);   
    endfunction
    

    【讨论】:

      【解决方案2】:

      看到绝大多数 Scilab 社区都没有意识到矢量化操作,这真是令人难过。您可以将功能更改为:

      function y = alpha(t)
         y = 0.1;
         if t < 227.8 then 
             y = 0.75;
         elseif t < 300 then
             y = 2.8 - 0.009 * t;
         end
         y = 1 - y; 
      endfunction
      

      然后使用feval在序列上广播函数:

      x = linspace(0, 300);
      plot2d(x, feval(x, alpha));
      

      结果:

      经验法则:如果您使用 for 循环,您需要修改您的代码,并且如果有人向您提供了一个不需要 for 循环的代码,您可能不应该使用它。

      【讨论】:

      • 使用feval不是真正的矢量化,因为它在这里重复调用alpha,尽管函数本身可以通过使用点运算符进行矢量化。
      • @StéphaneMottelet 好吧,我已经详细解释了here 我所说的向量化一词的含义。这是我从 Python 术语中借来的东西,用来指代列表理解和类似的操作,以消除对过多 for 循环的需要。不是并行,只是让代码更简洁的一种方式。
      【解决方案3】:

      考虑到原始需求中的函数alpha 是分段仿射的,所有建议的答案都过于复杂。在 Scilab 中可以这样编码:

      x = linspace(0,400,1000);
      plot(x,linear_interpn(x,[227.8 300],[0.75 0.1])) 
      

      即您只需要知道节点坐标(此处为横坐标)和节点处函数的值。函数linear_interpn 也有multi线性插值,值得大家了解...

      【讨论】:

        【解决方案4】:

        如果您检查alpha(x) 的输出,您会发现它只是一个标量(不是向量)。我猜你想要这样的东西,所以有必要遍历t 以根据t 的值计算y 的每个值:

        clc;
        clear;
        function y = alpha(t)
            for i=1:size(t,"*") 
                if t(i) < 227.8 then 
                    y(i) = 0.75;
                elseif t(i) < 300 then
                    y(i) = 2.8 - 0.009 * t(i);
                else
                    y(i) = 0.1;
                end  
            end 
        endfunction
        
        x = linspace(0,300);
        plot2d(x,alpha(x));
        

        如果您觉得答案有用,请不要忘记接受它,这样其他人就会看到您的问题已解决。

        【讨论】:

          【解决方案5】:

          在您回答之前(谢谢),我的解决方法是结合由 floor 和 exp(-t^2) 组成的指标函数:

          function y = alpha(t)  
              y = floor(exp(-(t .* (t-T1)) / (T1*T1))) * 0.75 
                  +  floor(exp(-((t-T2) .* (t- T1) / (2000)))) .* (2.8-0.009 .* t) 
                  + floor(exp(-((t-T2) .* (t-1000) / (200000))))*0.1
          endfunction
          

          【讨论】:

            猜你喜欢
            • 2012-09-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-03-31
            • 2020-01-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多