Обычно streamtube
и streamline
работает с векторными полями, в частности в MATLAB, они работают только для структурированных сеток (то есть сгенерированных meshgrid
).
То, что у вас есть, представляет собой неструктурированное векторное поле, но поскольку у вас есть набор траекторий, на самом деле вы уже рассчитали линии тока, на самом деле траектория - это линии тока (вы определили векторное поле как производную от траектории).
Итак, вы можете построить линии тока, используя `plot3 '.
Если я понял вашу проблему должным образом, то решение заключается в следующем:
clear all
close all
x = [];
y = [];
z = [];
Px = [];
Py = [];
Pz = [];
figure(1)
for i=1:10
a= rand;
b= rand;
zz{i} = 0:pi/50:10*pi;
yy{i} = a*zz{i}.*sin(zz{i});
xx{i} = b*zz{i}.*cos(zz{i});
px{i}=[0,diff(xx{i})];
py{i}=[0,diff(yy{i})];
pz{i}=[0,diff(zz{i})];
plot3(xx{i},yy{i},zz{i});
hold all;
XYZ{i} = [xx{i}',yy{i}',zz{i}'];
x = [x, xx{i}];
y = [y, yy{i}];
z = [z, zz{i}];
Px = [Px, px{i}];
Py = [Py, py{i}];
Pz = [Pz, pz{i}];
end
figure(2)
streamtube(XYZ)
[X,Y,Z] = meshgrid(linspace(min(x),max(x),10),linspace(min(y),max(y),10),linspace(min(z),max(z),10));
PX = griddata(x,y,z,Px,X,Y,Z);
PX(isnan(PX)) = 0;
PY = griddata(x,y,z,Py,X,Y,Z);
PY(isnan(PY)) = 0;
PZ = griddata(x,y,z,Pz,X,Y,Z);
PZ(isnan(PZ)) = 0;
figure(3)
streamtube(X,Y,Z,PX,PY,PZ,zeros(1,10),zeros(1,10),linspace(min(z),max(z),10))
это скрипты формирует набор из десяти траекторий, а затем построить линии тока с plot3
, но и с streamtube
. Однако streamtube
выполняет точно такую же работу, заменяя линию трубой. Если вы хотите, вы также можете установить ширину каждой трубки.
Существует также возможность перевести ваше неструктурированное векторное поле в структурированное, используя функцию griddata
, однако результат в этом случае будет зависеть от того, как и на сколько траекторий. Я бы предпочел бы два предыдущих метода, третий можно было бы использовать, если у вас есть огромное количество траекторий, и вы хотите окутать их все в одну пробирку.
Пожалуйста, дайте мне знать, если это ответит на ваш вопрос.
Алессандро
Проверьте, если у вас есть 'streamtube' функции (может зависеть от Версия MATLAB) – nkjt
У меня это есть, но проблема в том, что функция streamtube (или streamline) принимает в качестве входного сигнала только полное трехмерное векторное поле (то есть то, которое вы может получить из meshgrid). –