離散点の流線の表示

조회 수: 9 (최근 30일)
Ryota Kobayashi
Ryota Kobayashi 2020년 4월 30일
답변: Ryota Kobayashi 2020년 5월 6일
初学者です.
以下のような離散点のベクトル分布の表示は出来るのですが,これらを流線でつなぐことに苦労しております.
アドバイスをお願い致します.
〇データのサンプル
位置座標(x,y)
ベクトル成分(u,v)
x y u v
-5.962731664E-20, 1.222600000E-01, 1.015245670E-01, 2.703176021E-01
-2.730629758E-04, 1.223873224E-01, 1.767483465E-01, 2.366670314E-01
-5.473406056E-04, 1.225152111E-01, 1.951194702E-01, 2.120557251E-01
-8.231614298E-04, 1.226438194E-01, 1.981463266E-01, 2.020150697E-01
-1.098073810E-03, 1.227720041E-01, 2.019696265E-01, 1.947334165E-01
-1.373855385E-03, 1.229005941E-01, 2.133377823E-01, 2.118655201E-01
-1.648460662E-03, 1.230286356E-01, 2.150505966E-01, 2.054816282E-01
-1.924210978E-03, 1.231572111E-01, 1.999315308E-01, 1.708878617E-01
-2.199271944E-03, 1.232854650E-01 2.010232258E-01, 1.849475885E-01
-2.474703466E-03, 1.234138918E-01, 1.875819806E-01, 2.136792789E-01
  댓글 수: 4
Akira Agata
Akira Agata 2020년 5월 5일
添付頂いたデータを確認してみましたが、同じ (x,y) 座標に対して異なる (u,v) の値が格納されているデータが、いくつかあるようです。下記はその一例です。とりあえず (x,y) が重複しているデータは、重複のどちらか一方を除いて流線でつなぐ、という方針で良いでしょうか?(もし可能であれば、重複を除去済みのデータを提供頂けると助かります)
x y u v
_____ _______ _______ ________
0.122 -0.0972 0.0222 -0.0207
0.122 -0.0972 -0.0602 -0.00339
Ryota Kobayashi
Ryota Kobayashi 2020년 5월 5일
何度も申し訳ございません.
改めてデータを添付しております.
ご指摘のような重複点は除いたつもりです.
よろしくお願い申し上げます.

댓글을 달려면 로그인하십시오.

채택된 답변

Akira Agata
Akira Agata 2020년 5월 6일
さっそく対象データを提供頂き、ありがとうございます。
MATLABには流線をプロットするための関数として、streamline が用意されています。ただ、この関数は入力データがメッシュグリッドになっている必要があります。
頂いたデータを見ますと (x,y) 座標は必ずしもメッシュ上に位置していないようでした。そこで、まず meshgrid 関数でメッシュグリッド形式の (x,y) 座標点を作成したうえで、 griddata 関数で各グリッド点上での (u,v) 値を内挿で計算し、最後に streamline 関数で流線を表示する、という方法を取りました。
作成した図は、元データから作成したquiver プロット(データ点が多いため矢印が見えなくなっていますが・・・)と任意に設定した流線のスタート位置(赤い丸印)、およびそこからの流線(青線)を示しています。ご参考になれば幸いです。
% Read the data file
T = readtable('Results.csv');
T.Properties.VariableNames = {'x','y','u','v'};
% Create meshgrid
[xGrid,yGrid] = meshgrid(...
linspace(min(T.x),max(T.x)),...
linspace(min(T.y),max(T.y)));
% Apply interpolation to estimate (u,v) for each grid point
uGrid = griddata(T.x,T.y,T.u,xGrid,yGrid);
vGrid = griddata(T.x,T.y,T.v,xGrid,yGrid);
% Starting points of streamlines
startY = linspace(min(T.y),max(T.y),20);
startX = (max(T.x)/2)*ones(size(startY));
% Show the result
figure
quiver(T.x,T.y,T.u,T.v)
hold on
streamline(xGrid,yGrid,uGrid,vGrid,startX,startY)
scatter(startX,startY,'ro')
grid on
box on
xlabel('X','FontSize',14)
ylabel('Y','FontSize',14)

추가 답변 (1개)

Ryota Kobayashi
Ryota Kobayashi 2020년 5월 6일
上手く作動しました.
また,スタート位置等も明記頂いた為,非常に助かりました.
誠にありがとうございました.

카테고리

Help CenterFile Exchange에서 ベクトル場에 대해 자세히 알아보기

태그

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!