我试图基于传递给函数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
答案 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');