離散点の流線の表示
9 views (last 30 days)
Show older comments
Ryota Kobayashi
on 30 Apr 2020
Answered: Ryota Kobayashi
on 6 May 2020
初学者です.
以下のような離散点のベクトル分布の表示は出来るのですが,これらを流線でつなぐことに苦労しております.
アドバイスをお願い致します.
〇データのサンプル
位置座標(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
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
Accepted Answer
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
More Answers (1)
See Also
Categories
Find more on ベクトル場 in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!