Matlab通过条件语句进行绘图

时间:2019-01-07 00:53:34

标签: matlab

我试图基于传递给函数u的x数组在matlab中绘制单个时间步t的波动方程。

我对matlab不太熟悉,也不确定这是否是遍历所有x值并绘制它们的正确方法。这个过程似乎并不完全类似于python和matplotlib之类的东西。

编辑:此代码似乎无法正确执行,然后如何遍历数组并绘图?例如:对于x中的元素:执行功能

谢谢

% defining the bounds of my x values

x=-10:.02:10;

% defining my time step, t  
t = 1;


x1=[0 0];

y1=[-0.01 0.01];

x2=[-10 10];

y2=[0 0];


% defining some constants to make below equation simpler
xpt2= x + t;

xmt2= x - t;


% plotting based on the values of x - should iterate through the array?
if abs(x) > 1

  u = 0.5 .* ((-(xpt2) .* exp(-abs(xpt2))./abs(xpt2)) + ((xmt2).*exp(-abs(xmt2))./abs(xmt2)));

  plot(x,u,x1,y1,x2,y2);

  xlabel('t=1');ylabel('u');

else    
  u = 0.5 .* abs(xpt2) + 0.5 .* abs(xmt2) + 0.5 .* (-(xpt2) .* exp(-abs(xpt2)./abs(xpt2)) + ((xmt2).*exp(-abs(xmt2))./abs(xmt2)));

  plot(x,u,x1,y1,x2,y2);

  xlabel('t=1');ylabel('u'); 

end

2 个答案:

答案 0 :(得分:1)

您的代码有很多问题。

1)您的条件在向量上,那么如何检查向量中每个点的条件?好吧,你不能这样。

2)您正在使用向量的abs(),但是您似乎想考虑负部分? abs([-1 0 1])将返回输出[1 0 1],这会使您的整个矢量为正,并去除负部分。

现在,我明白了为什么您要使用for-loop来检查向量中每个x变量的条件。您可以执行以下操作:

for ii=1:numel(x) % This iterates through the vector
    x(ii) % this accesses the current index of ii
end

但是您仍然不需要for循环。而是使用条件向量来跟踪x中的负数和pos点,例如:

idx_neg = x < 0; % boolean of all negative points in x

然后在要应用方程式的向量上使用idx_neg。以及IDx的正值反转,例如:

u = zeros(1, numel(x)); % initialize empty vector for storage

% for positive x values, use ~idx_neg to find the pos points
u(~idx_neg) = 0.5 .* ((-(xpt2(~idx_neg)) .* exp(-abs(xpt2(~idx_neg)))./abs(xpt2(~idx_neg))) + ((xmt2(~idx_neg)).*exp(-abs(xmt2(~idx_neg)))./abs(xmt2(~idx_neg))));

% now apply to neg points in x:
u(idx_neg) = 0.5 .* abs(xpt2(idx_neg(idx_neg))) + 0.5 .* abs(xmt2(idx_neg)) + 0.5 .* (-(xpt2(idx_neg)) .* exp(-abs(xpt2(idx_neg))./abs(xpt2(idx_neg))) + ((xmt2(idx_neg)).*exp(-abs(xmt2(idx_neg)))./abs(xmt2(idx_neg))));

我没有检查语法错误,但这基本上就是您想要的。

答案 1 :(得分:1)

此代码可能无法解决您的问题,但可以帮助您发现错误。我希望在else部分出现错误。

我使用for循环来使if子句起作用,而@slayer方法更专业地进行无循环工作。

% defining the bounds of my x values
close all
clear 
x=-10:.02:10;
% defining my time step, t  
t = 1;
x1=[0 0];
y1=[-0.01 0.01];
x2=[-10 10];
y2=[0 0];
% defining some constants to make below equation simpler
xpt2= x + t;
xmt2= x - t;
% plotting based on the values of x - should iterate through the array?
for i=1:length(x)
    if abs(x(i)) > 1
        u(i) = 0.5 .* ((-(xpt2(i)) .* exp(-abs(xpt2(i)))./abs(xpt2(i))) + ((xmt2(i)).*exp(-abs(xmt2(i)))./abs(xmt2(i))));        
    else
        u(i) = 0.5 .* abs(xpt2(i)) + 0.5 .* abs(xmt2(i)) + 0.5 .* (-(xpt2(i)) .* exp(-abs(xpt2(i))./abs(xpt2(i))) + ((xmt2(i)).*exp(-abs(xmt2(i)))./abs(xmt2(i))));
    end
    %display step by step
    plot(x(1:i),u)
    hold on
    plot(x1,y1)
    plot(x2,y2);
    xlabel('t=1');ylabel('u');
    pause(1/1000)
end
plot(x,u)
hold on
plot(x1,y1)
plot(x2,y2);
xlabel('t=1');ylabel('u');