通过条件语句绘制 Matlab



我正在尝试根据传递给函数 u 的 x 数组在 matlab 中绘制单个时间步长 t 的波动方程。

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

编辑:这段代码似乎没有正确执行,那么我该如何遍历数组和绘图呢? 例如:对于 x 中的元素:do 函数

谢谢

% 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

此代码可能无法解决您的问题,但它可以帮助您找到错误。我希望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'); 

您的代码存在许多问题。

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

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

最新更新