我正在尝试根据传递给函数 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))));
我没有检查语法错误,但这基本上是您要找的。