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

24 views (last 30 days)
克仁
克仁 on 7 Oct 2022
Commented: Hernia Baby on 8 Nov 2022
二次元(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 Comments
Hernia Baby
Hernia Baby on 11 Oct 2022
> ”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 は行列になりますが、これらはベクトルでしょうか?
克仁
克仁 on 17 Oct 2022
Edited: 克仁 on 18 Oct 2022
表現が拙く申し訳ございません。
私がやりたいことといたしまして、平面から離散的にデータが取れる状態にあり(点データの位置、つまりxy座標とその場所のスカラー量、こいつをz成分としたい)、それらのデータをスプライン補間して3次元的に表現したいと考えています。例えば、y=0上にあるxとzのデータをスプライン補間、y=1、y=2…という風に行い、また今度はx方向を固定し同じことを行い、結果的にgriddataに出て来る例のように表示したいと考えています。
MATLABの例で上がっているものでgriddataが一番やりたい形なのですが、補間方法にスプライン補間がなく、また例として挙がっているものは点データがランダムであることからあまり参考にできずにいます。
plot3を使うのか、など考えましたが詰まっています。
MATLAB自体最近使い始めたので、行列とベクトルの違いに確信は持てませんが、たぶんベクトルだと思います。最初に書いたコードはsplineの例で出てきたコードのx、yの中をいじっただけです。xyの中身はそれぞれの値に対する座標として認識していました。
これで私のやりたいことが伝わっていると幸いです。返信遅れて申し訳ございません。

Sign in to comment.

Accepted Answer

克仁
克仁 on 8 Nov 2022
Edited: 克仁 on 8 Nov 2022
最低限やりたいことはできたのでコードの共有をします。スプライン補間を三次元的に表現したものとなります。
%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 Comments
Hernia Baby
Hernia Baby on 8 Nov 2022
すみません、回答できてませんでしたね…
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 on 8 Nov 2022
もしくは 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)

Sign in to comment.

More Answers (0)

Categories

Find more on 内挿 in Help Center and File Exchange

Products


Release

R2022b

Community Treasure Hunt

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

Start Hunting!