带有 if 的 Scilab 绘图函数
Scilab plotting functions with if
我在 scilab 中遇到问题
如何绘制包含 if 和 < like
的函数
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
抱歉德国混音。谢谢。
如果您检查 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));
如果您觉得回答有用,请不要忘记采纳,这样其他人就会看到您的问题已经解决了。
您可以避免显式循环并使用以下代码提高效率
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
在您回答之前(谢谢),我的解决方法是结合由 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
看到绝大多数 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 循环的代码,您可能不应该使用它。
考虑到原始需求中的函数 alpha
是分段仿射的,所有建议的答案都过于复杂。在 Scilab 中可以这样编码:
x = linspace(0,400,1000);
plot(x,linear_interpn(x,[227.8 300],[0.75 0.1]))
即您只需要知道节点坐标(此处为横坐标)和节点处函数的值。函数 linear_interpn
也做 multi 线性插值,值得大家了解一下...
我在 scilab 中遇到问题 如何绘制包含 if 和 < like
的函数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
抱歉德国混音。谢谢。
如果您检查 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));
如果您觉得回答有用,请不要忘记采纳,这样其他人就会看到您的问题已经解决了。
您可以避免显式循环并使用以下代码提高效率
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
在您回答之前(谢谢),我的解决方法是结合由 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
看到绝大多数 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 循环的代码,您可能不应该使用它。
考虑到原始需求中的函数 alpha
是分段仿射的,所有建议的答案都过于复杂。在 Scilab 中可以这样编码:
x = linspace(0,400,1000);
plot(x,linear_interpn(x,[227.8 300],[0.75 0.1]))
即您只需要知道节点坐标(此处为横坐标)和节点处函数的值。函数 linear_interpn
也做 multi 线性插值,值得大家了解一下...