2次元座標でスプライ​ン補間した結果を3次​元座標で表現すること​は可能でしょうか?

24 ビュー (過去 30 日間)
克仁
克仁 2022 年 10 月 7 日
コメント済み: Hernia Baby 2022 年 11 月 8 日
二次元(xy座標)の離散データをsplineで補間した際
その結果を”Z=0の補完したデータ”として扱い、他のデータをZ=1の場合…、また他のデータをZ=2の場合…、といった風に複数の補間した曲線を三次元(xyz座標)で表現することは可能でしょうか?また、x軸方向からも行い(y軸を縦方向と考えた場合)、メッシュ状に表現することは可能でしょうか?
x = [-2 -1.5 -1 -0.5 0 0.5 1 1.5 2];
y = [1.83 10.5 36.7 77.8 100 77.8 36.7 10.5 1.83];
cs = spline(x,[0 y 0]);
xx = linspace(-2,2,101);
plot(x,y,'o',xx,ppval(cs,xx),'-');
これだと二次元で表示されるので、それをZ=0などの数値を与えて三次元的に表現できないでしょうか
教えていただけると幸いです。
  2 件のコメント
Hernia Baby
Hernia Baby 2022 年 10 月 11 日
> ”Z=0の補完したデータ”として扱い、他のデータをZ=1の場合…、また他のデータをZ=2の場合…、
ここの詳細教えてください。
x(:,ii) = [-2 -1.5 -1 -0.5 0 0.5 1 1.5 2]';
y(:,ii) = [1.83 10.5 36.7 77.8 100 77.8 36.7 10.5 1.83]';
cs = spline(x,[0 y 0]);
xx = linspace(-2,2,101);
z(:,ii) = ppval(cs,xx);
上記のながれで ii が @克仁さんのいう Z に対応してますか?
そうすると x と y は行列になりますが、これらはベクトルでしょうか?
克仁
克仁 2022 年 10 月 17 日
編集済み: 克仁 2022 年 10 月 18 日
表現が拙く申し訳ございません。
私がやりたいことといたしまして、平面から離散的にデータが取れる状態にあり(点データの位置、つまりxy座標とその場所のスカラー量、こいつをz成分としたい)、それらのデータをスプライン補間して3次元的に表現したいと考えています。例えば、y=0上にあるxとzのデータをスプライン補間、y=1、y=2…という風に行い、また今度はx方向を固定し同じことを行い、結果的にgriddataに出て来る例のように表示したいと考えています。
MATLABの例で上がっているものでgriddataが一番やりたい形なのですが、補間方法にスプライン補間がなく、また例として挙がっているものは点データがランダムであることからあまり参考にできずにいます。
plot3を使うのか、など考えましたが詰まっています。
MATLAB自体最近使い始めたので、行列とベクトルの違いに確信は持てませんが、たぶんベクトルだと思います。最初に書いたコードはsplineの例で出てきたコードのx、yの中をいじっただけです。xyの中身はそれぞれの値に対する座標として認識していました。
これで私のやりたいことが伝わっていると幸いです。返信遅れて申し訳ございません。

サインインしてコメントする。

採用された回答

克仁
克仁 2022 年 11 月 8 日
編集済み: 克仁 2022 年 11 月 8 日
最低限やりたいことはできたのでコードの共有をします。スプライン補間を三次元的に表現したものとなります。
%z=-2でのデータ
x = [-2 -1 0 1 2];
y = [0.03 0.67 1.83 0.67 0.03];
xx = -2:.25:2;
yy = spline(x,y,xx);
x9= xx;
y9= -2*ones(1,17);
z9= yy;
plot3(x9,y9,z9,'-','Color','b','MarkerSize',10,...
'MarkerFaceColor','#D9FFFF')
hold on
%z=-1でのデータ
x = [-2 -1 0 1 2];
y = [0.67 13.53 36.78 13.53 0.67];
xx = -2:.25:2;
yy = spline(x,y,xx);
x8= xx;
y8= -1*ones(1,17);
z8= yy;
plot3(x8,y8,z8,'-','Color','b','MarkerSize',10,...
'MarkerFaceColor','#D9FFFF')
hold on
%z=0でのデー
x = [-2 -1 0 1 2];
y = [1.83 36.78 100 36.78 1.83];
xx = -2:.25:2;
yy = spline(x,y,xx);
x0=xx;
y0=zeros(1,size(xx,2));
z0=yy;
plot3(x0,y0,z0,'-','Color','b','MarkerSize',10,...
'MarkerFaceColor','#D9FFFF')
hold on
%z=1でのデータ
x = [-2 -1 0 1 2];
y = [0.67 13.53 36.78 13.53 0.67];
xx = -2:.25:2;
yy = spline(x,y,xx);
x1=xx;
y1=ones(1,17);
z1=yy;
plot3(x1,y1,z1,'-','Color','b','MarkerSize',10,...
'MarkerFaceColor','#D9FFFF')
hold on
%z=2でのデータ
x = [-2 -1 0 1 2];
y = [0.03 0.67 1.83 0.67 0.03];
xx = -2:.25:2;
yy = spline(x,y,xx);
x2=xx;
y2=2*ones(1,17);
z2=yy;
plot3(x2,y2,z2,'-','Color','b','MarkerSize',10,...
'MarkerFaceColor','#D9FFFF')
  2 件のコメント
Hernia Baby
Hernia Baby 2022 年 11 月 8 日
すみません、回答できてませんでしたね…
cell型を利用すればコンパクトに行えます
データを作成します
x = [-2 -1 0 1 2];
xx = -2:.25:2;
y{1} = [0.03 0.67 1.83 0.67 0.03];
y{2} = [0.67 13.53 36.78 13.53 0.67];
y{3} = [1.83 36.78 100 36.78 1.83];
y{4} = [0.67 13.53 36.78 13.53 0.67];
y{5} = [0.03 0.67 1.83 0.67 0.03];
yを補間します
yy = cellfun(@(Y) spline(x,Y,xx),y,'UniformOutput',false);
データをまとめます
x1 = xx;
y1 = num2cell((-2:2)'.*ones(1,17), 2);
z1 = yy';
図示します。
figure
hold on
cellfun(@(Y,Z) plot3(x1,Y,Z,'-',...
'Color','b','MarkerSize',10,...
'MarkerFaceColor','#D9FFFF'),y1,z1,'UniformOutput',false);
hold off
view(3)
Hernia Baby
Hernia Baby 2022 年 11 月 8 日
もしくは interp2 を使ってもいいかもしれませんね
[X,Y] = meshgrid(-2:2);
Z = [0.03 0.67 1.83 0.67 0.03
0.67 13.53 36.78 13.53 0.67
1.83 36.78 100 36.78 1.83
0.67 13.53 36.78 13.53 0.67
0.03 0.67 1.83 0.67 0.03];
xだけ細かくします
[X1,Y1] = meshgrid(-2:.25:2,-2:2);
補間します
Z1 = interp2(X,Y,Z,X1,Y1,'spline');
図示します
figure
hold on
for ii = 1:height(X1)
plot3(X1(ii,:),Y1(ii,:),Z1(ii,:) ...
,'-','Color','b','MarkerSize',10 ...
,'MarkerFaceColor','#D9FFFF')
end
hold off
view(3)

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File Exchange内挿 についてさらに検索

製品


リリース

R2022b

Community Treasure Hunt

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

Start Hunting!