MATLAB Answers

離散点の流線の表示

8 views (last 30 days)
初学者です.
以下のような離散点のベクトル分布の表示は出来るのですが,これらを流線でつなぐことに苦労しております.
アドバイスをお願い致します.
〇データのサンプル
位置座標(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 Comments

Show 1 older comment
Ryota Kobayashi
Ryota Kobayashi on 3 May 2020
ご返答ありがとうございます.
おっしゃる通り,出来ないですね.データの切り抜き方が不適切でした.
実際には添付のようなデータを基に出力を目指しております.
Akira Agata
Akira Agata on 5 May 2020
添付頂いたデータを確認してみましたが、同じ (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 on 5 May 2020
何度も申し訳ございません.
改めてデータを添付しております.
ご指摘のような重複点は除いたつもりです.
よろしくお願い申し上げます.

Sign in to comment.

Accepted Answer

Akira Agata
Akira Agata on 6 May 2020
さっそく対象データを提供頂き、ありがとうございます。
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)

  0 Comments

Sign in to comment.

More Answers (1)

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

  0 Comments

Sign in to comment.

Tags