MATLAB に基づく 3 次元データ補間フィッティングおよび 3 次スプライン フィッティング アルゴリズム (完全なコード付き)

目次

1. 3次元補間

例1

2. 高次元補間フィッティング

フォーマット 1

フォーマット 2

フォーマット 3

フォーマット 4

フォーマット 5

例 2

3. 単変量三次スプライン補間

例 3

例 4

4. 多変量三次スプライン補間

例6


1. 3次元補間

まず、 meshgrid()関数を使用して 3D グリッドが生成されます。MATLAB での呼び出し形式は次​​のとおりです。

[x,y,z]=meshgrid(x1,y1,z1)
% x1,y1,z1为这三维数据所需要的分割形式,均以向量形式给出
%返回的x,y,z为网格的数据生成,也是三维数组

3 次元補間演算では、主に次のように Griddata() 関数と interp() 関数を使用します。

griddata3()  %三维非网格形式的插值拟合
griddatan()  %n维非网格形式的插值拟合
interpn()    %N维网格数据的插值拟合

実際、 interp3() および interpn() の呼び出し形式は interp2() 関数と一致しています。

Griddata3() および Griddatan() の呼び出し形式は、griddata() 関数と一致しています。

interp2() および Griddata() 関数に関する以前のブログを参照できます。

MATLAB に基づく 2 次元および 3 次元の内挿およびフィッティング操作 (完全なコード付き) ブログ-CSDN ブログ

MATLAB に基づくデータ内挿演算: ラグランジュおよびエルミート アルゴリズム (完全なコード付き) ブログ-CSDN ブログ

例1

関数 V(x,y,z) を使用していくつかのグリッド タイプのサンプル ポイントを生成し、サンプル ポイントに従ってそれらをフィッティングして、フィッティング誤差を求めます。

V(x,y,z)=e^{x^2z+y^2x+z^2y}cos(x^2yz+z^2yx)

ほどく:

MATLAB コードは次のとおりです。

clc;clear;

[x,y,z]=meshgrid(-1:0.2:1);
[x0,y0,z0]=meshgrid(-1:0.05:1);
V=exp(x.^2.*z+y.^2.*x+z.^2.*y).*cos(x.^2.*y.*z+z.^2.*y.*x);
V0=exp(x0.^2.*z0+y0.^2.*x0+z0.^2.*y0).*cos(x0.^2.*y0.*z0+z0.^2.*y0.*x0);

V1=interp3(x,y,z,V,x0,y0,z0,'spline');
err=V1-V0;
max(err(:))

操作結果:

ans =0.041862381154469

2. 高次元補間フィッティング

interpn()関数は、1次元、2次元、3次元、N次元のグリッドデータの補間を実現できます。よく使用される形式は次の 5 つです。

フォーマット 1

Vq=interpn(X1,X2,...,Xn,V,Xq1,Xq2,...,Xqn)

フォーマット 2

Vq=interpn(V,Xq1,Xq2,...,Xqn)

フォーマット 3

Vq=interpn(V)

サンプル値の間隔を1回に分割

フォーマット 4

Vq=interpn(V,k)

各次元のサンプル値間の間隔を k 回繰り返し分割して最適化されたグリッドを形成し、これらのグリッド上で補間された値を返します。これにより、サンプル値の間に2^k-1挿入ポイントが生成されます。

フォーマット 5

Vq=interpn(_,メソッド,extrapval)

「linear」、「nearest」、「pchip」、「cubic」、「makima」、「spline」などの代替補間方法を指定できます。デフォルトの方法は「線形」です。

例 2

自分でデータを選択し、interpn()関数を使用して1次元補間、2次元補間、3次元差分を行います。

ほどく:

(1) 1次元補間

MATLAB コードは次のとおりです。

clc;clear;
x=[1 2 3 4 5];
v=[12 16 31 10 6];
xq=(1:0.1:5);
vq=interpn(x,v,xq,'cubic');
plot(x,v,'o',xq,vq,'-');
legend('Samples','Cubic Interpolation');

操作結果:

(2) 2次元補間

MATLAB コードは次のとおりです。

clc;clear;
[X1,X2]=ndgrid(-5:1:5);
R=sqrt(X1.^2+X2.^2)+eps;
V=sin(R)./(R);
Vq=interpn(V,'cubic');
mesh(Vq);
size(V);
size(Vq);

 操作結果:

(3) 3次元補間

この例では次の関数を与えますz=f(x,y)=(x^2-2x)e^{-x^2-y^2-xy}

MATLAB コードは次のとおりです。

clc;clear;
[x,y]=ndgrid(-3:.6:3,-2:.4:2);
z=(x.^2-2*x).*exp(-x.^2-y.^2-x.*y);
[x1,y1]=ndgrid(-3:.2:3,-2:.2:2);
z1=interpn(x,y,z,x1,y1);
surf(x1,y1,z1),axis([-3,3,-2,2,-0.7,1.5])

 操作結果:

3. 単変量三次スプライン補間

サンプル点が与えられると、平面上の n 点は となり(x_i,y_i)(i=1,2,\cdots,n)、 が満たされますx_1<x_2<\cdots<x_n

S(x) は 3次スプライン関数であり、次の 3 つの条件を満たす必要があります。

  1. S(x_i)=y_i(i=1,2,\cdots,n)、つまり、関数はサンプル点を通過します。
  2. S(x) は、各部分区間の 3 次多項式です[x_i,x_{i+1}]S(x)=c_{i1}(x-x_i)^3+c_{i2}(x-x_i)^2+c_{i3}(x-x_i)+c_{i4}
  3. S(x) には区間全体[x_1,x_n]にわたって連続的な 1 次導関数と 2 次導関数があります。

MATLAB では、次のように 3 次スプライン関数クラスを定義します。

S=csapi(x,y)

 上式はx=[x_1,x_2,\cdots,x_n],y=[y_1,y_2,\cdots,y_n]サンプル点です。S は、部分区間点、各区間点の 3 次多項式係数などを含むスプライン関数オブジェクトの内挿結果を返します。

fnplt()を使用して補間結果を描画できます。呼び出し形式は次​​のとおりです。

fnplt(S)

指定されたベクトル xp に対して、fnval()関数を計算に使用できます。呼び出し形式は次​​のとおりです。

yp=fnval(S,xp)

この式から得られる yp は、xp 上の各点の補間結果になります。

例 3

3 次スプライン補間を実行する例として、sin(x) によって生成されたデータ ポイントを取り上げます。

ほどく:

MATLAB コードは次のとおりです。

clc;clear;
x0=[0,0.4,1,2,pi];
y0=sin(x0);
sp=csapi(x0,y0),fnplt(sp,':');
hold on,ezplot('sin(t)',[0,pi]);
plot(x0,y0,'o')
sp.coefs

操作結果:

sp = 

  次のフィールドを含む構造体:

      形式: 'pp'
    ブレーク数: [0 0.400000000000000 1 2 3.141592653589793]
     coefs: [4×4 double]
    個数: 4
     order: 4
       dim: 1


答え =

  -0.162650313526554   0.007585653997624   0.996535644336825                   0
  -0.162650313526551  -0.187594722234240   0.924532017042179   0.389418342308651
   0.024435716847400  -0.480365286582031   0.523756011752416   0.841470984807897
   0.024435716847400  -0.407058136039832  -0.363667410869446   0.909297426825682

演算の結果、区間 (0.4000,1) では、補間多項式は次のように表すことができます。

S_2(x)=-0.1627(x-0.4)^3-0.1876(x-0.4)^2+0.9245(x-0.4)+0.3894

例 4

関数 f(x) のいくつかのデータ点を自分で選択し、3 次スプライン補間法を使用してこれらのデータを近似します。

f(x)=(x^2-3x+5)e^{-5x}sinx

ほどく:

MATLAB コードは次のとおりです。

clc;clear;
x=0:.12:1;
y=(x.^2-3*x+5).*exp(-5*x).*sin(x);
sp=csapi(x,y);
fnplt(sp)
c=[sp.breaks(1:4)' sp.breaks(2:5)' sp.coefs(1:4,:),sp.breaks(5:8)'...
    sp.breaks(6:9)' sp.coefs(5:8,:)]

 操作結果:


c =

  列 1 ~ 7

                   0   0.120000000000000  24.739556929256214 -19.358812904771273   4.515070686988533                   0   0.480000000000000
   0.120000000000000   0.240000000000000  24.739556929256135 -10.452572410239041   0.937704449187296   0.305791530983672   0.600000000000000
   0.240000000000000   0.360000000000000   4.507107987633279  -1.546331915706831  -0.502164069926209   0.310548976552460   0.720000000000000
   0.360000000000000   0.480000000000000   1.913943736028591   0.076226959841147  -0.678576664630090   0.235810391177767   0.840000000000000

  8列目から12列目

   0.600000000000000  -0.240386219157313   0.765246704811441  -0.577599824871780   0.158786154419726
   0.720000000000000  -0.477388221775507   0.678707665914812  -0.404325300384630   0.100078340597694
   0.840000000000000  -0.455907214289051   0.506847906075627  -0.262058631745777   0.060507768093483
   0.960000000000000  -0.455907214289066   0.342721308931568  -0.160110325944914   0.035571534465187

 

4. 多変量三次スプライン補間

複数の独立変数を持つグリッド データの 3 次スプライン補間の形式は次のとおりです。

S=csapi({x1,x2,...,xn},z)
%xi为自变量的网格标志
%z是网格数据的样本点
%得到的S是三次样条函数对象

例5

3次スプライン補間法を使用して、Z関数グリッドデータのスプライン補間フィッティングを取得し、表面を描画します

z=f(x,y)=(x^2-2x)e^{-x^2-y^2-xy}

ほどく:

MATLAB コードは次のとおりです。

clc;clear;

x0=-3:.6:3;
y0=-2:.4:2;
[x,y]=ndgrid(x0,y0);
%注意此处只能使用ndgrid,否则生成的z矩阵的顺序有问题

z=(x.^2-2*x).*exp(-x.^2-y.^2-x.*y);
sp=csapi({x0,y0},z);
fnplt(sp);

操作結果:

MATLAB では、関数 spline は 3 次スプライン データ内挿も実行できます。形式は次のとおりです。

yy=spline(x,y,xx)

例6

y 関数曲線上に離散的に分布するデータ点に対してスプライン補間計算を実行します。

y=e^xsinx

ほどく:

MATLAB コードは次のとおりです。

clc;clear;

x=[0 2 4 5 8 12 12.8 17.2 19.9 20];
y=exp(x).*sin(x);
xx=0:.25:20;
yy=spline(x,y,xx);
plot(x,y,'o',xx,yy)

 操作結果:

 

おすすめ

転載: blog.csdn.net/forest_LL/article/details/124403236