使用if的Scilab绘图函数

时间:2017-07-08 13:57:52

标签: function plot interpolation scilab piecewise

我有一个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

对不起德语混音。谢谢。

5 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

这是非常痛心地看到绝大部分的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));

结果:

  

enter image description here

经验法则,如果您使用for循环,则需要修改您的代码;如果有人为您提供了不需要循环的代码,则您不应该使用它。

答案 2 :(得分:0)

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

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

即您只需要知道节点的坐标(这里是横坐标)和节点上函数的值即可。函数linear_interpn还能进行多次线性插值,值得一游。

答案 3 :(得分:-1)

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

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));

如果您觉得答案有用,请不要忘记接受,以便其他人看到您的问题得到解决。

答案 4 :(得分:-1)

在你回答之前(谢谢),我的解决方法是由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