数理モデリングの原理と応用を学ぶ【補間・フィッティングの基本原理とプログラミング実装】

メインコンテンツ

補間とフィッティングは、数学的モデリングにおける基本的なデータ解析手法であり、モデリングで一般的に使用されるアルゴリズムの 1 つとして認識されています。補間問題、
補間の原理、高次補間のルンゲ現象、1 次元および 2 次元について学びます。 Matlab の内挿コマンド
、フィッティング問題、フィッティング原理と手順、そして Matlab のフィッティング計算を紹介します。

補間

ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
上記の問題を要約すると、「ある区間(領域)内のいくつかの点における関数の値は既知であり、その区間(領域)内の他の点における関数の値は内挿法で解くのに適している」と言えます。
1 次元補間問題は次のように説明できます。Xo、x1、...、xn における関数の値 Yo、Y1、...、Yn を知り、単純な関数 p(x) を求め、p を作成します。 (xi) = yi 通常、p(x) を多項式とすると、
ヴァンデルモンドの行列式とクレムの規則を使用して、
x0、x1、xn における値 y0、y1、·yn を持つ多項式が存在し、一意であることを証明できます。つまり、補間問題の解は独自に存在します。
一般的に使用される補間法は、ラグランジュ補間法とニュートン補間法です。

ラグランジュ補間

ラグランジュ補間式(外来名ラグランジュ補間式)とは、ノードにノード基底関数が与えられ、基底関数の線形結合が行われ、その結合係数がノードの値となる補間多項式を指します。関数。
ここに画像の説明を挿入

高次補間のルンジ現象(ルンジ現象)

補間多項式の次数が高いほど補間精度が高くなります。この結論は、補間多項式の次数が 7 を超えない場合にのみ当てはまります。補間多項式の次数が 7 を超えると、補間多項式は、ルンゲ現象と呼ばれる激しい振動に見舞われます。
ここに画像の説明を挿入
実際には、7 つを超える補間は使用しないでください。
ルンゲ現象を回避する一般的な方法は、補間区間をいくつかの小さな区間に分割し、その小さな区間内で低次(二次、三次)補間、つまりスプライン関数補間などの区分的低次補間を使用することです。
ここに画像の説明を挿入

MATLAB 補間

1. 1次元補間

1 次元補間コマンドは interp1 で、その基本形式は yi= interp1(x,y,xi, 'method') です。x、
y は既知の点、xi、yi は補間点と補間結果、x、y です。 xi 、 yi は通常ベクトルです。method
' は補間方法を表します。nearest
' - 最近傍補間、
'linear' - 線形補間
spline' - 3 次スプライン補間、
'cubic' - 3 次補間、
デフォルトは線形補間です。

3次スプライン補間プログラミングアプリケーション

x=0:2:24;
y=[12 9 9 10 18 24 28 27 25 20 18 15 13];
x1=13;%插值点在13处
yl=interp1(x,y,x1,'spline')%求出在该点的值
xi=0:1/3600:24;
yi=interp1(x,y,xi, 'spline');
plot(x,y,'*',xi,yi)

x=13の値
ここに画像の説明を挿入
に対して描かれたグラフ
ここに画像の説明を挿入

3つの補間方法の比較

まず、ラグランジュ補間関数を作成し、lagrange.m ファイルという名前を付けます。
関数コードは次のとおりです。

function y=lagrange(x0,y0,x)
n=length(x0);
m=length(x);
for i=1:m
    z=x(i);
    s=0.0;
    for k=1:n
        p=1.0;
        for j=1:n
            if j~=k
                p=p*(z-x0(j))/(x0(k)-x0(j));
            end
         end
s=p*y0(k)+s;
    end
     y(i)=s;
en

作成プログラム% ラグランジュ補間、線形補間、3次スプライン補間の比較

x0=[0 3 5 7 9 11 12 13 14 15 ];
y0=[0 1.2 1.7 2.0 2.1 2.0 1.8 1.2 1.0 1.6];
x=0:0.1:15;
y1=lagrange(x0,y0,x);%使用拉格朗日插值法
y2=interp1(x0,y0,x);%使用一维插值命令的线性插值法
y3=interp1(x0,y0,x,'spline');%使用一维插值命令的三次样条插值法
subplot(3,1,1);
plot(x0,y0,'k+',x,y1,'r');
grid;%生成网格点
title('lagrange');
subplot(3,1,2);
plot(x0,y0,'k+',x,y2,'r');
grid;
title('piecewise linear');
subplot(3,1,3);
plot(x0,y0,'k+',x,y3,'r');
grid;
title('spline');

実行結果:
ここに画像の説明を挿入
結果は、ここでは 3 次スプライン補間の方が優れていることを示しています。

  • プログラムでは、ラグランジュ法、区分線形補間法、三次スプライン法の 3 つの補間法を連続して使用して計算を実行しましたが、ラグランジュ高次補間ではルンゲ現象が明らかに現れました。
  • Matlab にはラグランジュ高次補間関数が存在しないため、プログラム内で高次補間関数 lagrange を別途記述して呼び出します。

2. 2次元補間

2 次元補間コマンドは interp2 で、基本形式は zi=interp2(x,y,z,xi,yi,'method') です。2 次元補間コマンドの使用法はさらに複雑です。x, y, z は既知の補間点であり、z は
(x, y) における補間関数の値として理解できます。xi と yi は補間点であり、zi は出力補間結果であり、値として理解できます。 (xi, yi) における内挿関数の; x と y はベクトル、xi、yi はベクトルまたは行列、z と zi は行列です。
「method」は補間方法を表します。
「nearest」 - 最近傍補間、
「linear」 - 双一次補間、
「spline」 - 双三次スプライン補間、
「三次」双三次補間、
デフォルトは双一次補間です。
手続きの練習

x=1:5;
y=1:3;%表示三行五列的数据,x在此表示列数,y在次表示行数
temps=[82 81 80 82 84;79 63 61 65 81;84 84 82 85 86];
figure(1);
mesh(x,y,temps);
xi=1:0.2:5;
yi=1:0.2:3;
zi=interp2(x,y,temps,xi,yi','cubic');
figure(2);
mesh(xi,yi,zi);
figure(3);
contour(xi,yi,zi,20,'r');%画出20条等高线
[i,j]=find(zi==min(min(zi)));
%==表示判断或者寻找位置,
% min(zi)寻找每一列最小值,min(min(zi))在得到的最小值中继续寻找最小值
x=xi(j),y=yi(i),zmin=zi(i,j)
[i,j]=find(zi==max(max(zi)));
x=xi(j),y=yi(i),zmax=zi(i,j)

演算結果
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
(1) interp2 の xi は行ベクトル、yi は列ベクトルですが、実際には xi と yi の行と列が異なっていれば十分です。
(2)plot3(空間曲線)、
mesh(空間曲面)、
surf(空間曲面)、
contour(等高線)は3次元描画でよく使われるコマンドです。
メッシュとサーフの違いは、メッシュは単にグリッドで接続されたサーフェス グリッド ダイアグラムを描画することです。Surf は曲面マップを描画します。
contour(x,y,z,n) の機能は、点 (x,y,z) から補間された表面の n 個の等高線を作成することです。
サーフェスの下に等高線を描くにはmescとsurfcを使います.
垂直カーテン図を描くにはmeshzとsurfzを使います
. 図形が削除されると最後の画像のみが描画されます, これはhold on
ここに画像の説明を挿入
ここに画像の説明を挿入
プログラムと似ています.

x=0:400:5600;
y=0:400:4800;
z=[370 470 550 600 670 690 670 620 580 450 400 300 100 150 250;...
    510 620 730 800 850 870 850 780 720 650 500 200 300 350 320;...
    650 760 880 970 1020 1050 1020 830 900 700 300 500 550 480 350;...
    740 880 1080 1130 1250 1280 1230 1040 900 500 700 780 750 650 550;...
    830 980 1180 1320 1450 1420 1400 1300 700 900 850 840 380 780 750;...
    880 1060 1230 1390 1500 1500 1400 900 1100 1060 950 870 900 930 950;...
    910 1090 1270 1500 1200 1100 1350 1450 1200 1150 1010 880 1000 1050 1100;...
    950 1190 1370 1500 1200 1100 1550 1600 1550 1380 1070 900 1050 1150 1200;...
    1430 1430 1460 1500 1550 1600 1550 1600 1600 1600 1550 1500 1500 1550 1550;...
    1420 1430 1450 1480 1500 1550 1510 1430 1300 1200 980 850 750 550 500;...
    1380 1410 1430 1450 1470 1320 1280 1200 1080 940 780 620 460 370 350;...
    1370 1390 1410 1430 1440 1140 1110 1050 950 820 690 540 380 300 210;...
    1350 1370 1390 1400 1410 960 940 880 800 690 570 430 290 210 1501];
figure(1);
meshz(x,y,z);%带帷幕的网格曲面图
xlabel('X'),ylabel('Y'),zlabel('Z');
[xi,yi]=meshgrid(0:50:5600,0:50:4800);%基于向量 x 和 y 中包含的坐标返回二维网格坐标
figure(2);
z1i=interp2(x,y,z,xi,yi,'nearest');%最邻近插值法
surfc(xi,yi,z1i);%画垂帘图
xlabel('X'),ylabel('Y'),zlabel('Z');
figure(3);
z2i=interp2(x,y,z,xi,yi);%默认双线性插值法
surfc(xi,yi,z2i);
xlabel('X'),ylabel('Y'),zlabel('Z');
figure(4);
z3i=interp2(x,y,z,xi,yi,'cubic');%双立方插值法
surfc(xi,yi,z3i);
xlabel('X'),ylabel('Y'),zlabel('Z');
figure(5);
subplot(1,3,1),contour(xi,yi,z1i,10,'r');
subplot(1,3,2),contour(xi,yi,z2i,10,'r');
subplot(1,3,3),contour(xi,yi,z3i,10,'r');%画出三个图的等高线

プログラムは、「[xi,yi]=meshgrid(0:50:5600,0:50:4800);」を使用してグリッド点 (xi,yi) を生成します。これは、「xi=0:50:5600;yi」と同等です。 =0 :50:4800;"しかし、meshgrid(x,y) によって生成された xi と yi は同じ次元の行列です。xi の行はすべて x で、yi の列はすべて y です。
実行結果
ここに画像の説明を挿入
最近傍補間 バイリニア
ここに画像の説明を挿入
補間
ここに画像の説明を挿入
バイキュービック補間
ここに画像の説明を挿入
ここに画像の説明を挿入

散乱点補間

前に説明した補間問題の補間点 (x, y) はすべて格子点です。(x,y) が散乱点の場合、griddata(x,y,z,xi,yi,'method') コマンドを使用して 2 次元補間を実行できます。

ここに画像の説明を挿入
ここに画像の説明を挿入
プログラム

x=[129 140 103.5 88 185.5 195 105 157.5 107.5 77 81 162 162 117.5];
y=[7.5 141.5 23 147 22.5 137.5 85.5 -6.5 -81 3 56.5 -66.5 84 -33.5];
z=[-4 -8 -6 -8 -6 -8 -8 -9 -9 -8 -8 -9 -4 -9];
[xi,yi]=meshgrid(75:0.5:200,-70:0.5:150);%基于向量 x 和 y 中包含的坐标返回二维网格坐标
zi=griddata(x,y,z,xi,yi,'cubic');%对二维或三维散点数据插值,双立方插值法
figure(1);
meshz(xi,yi,zi);%带帷幕的网格曲面图
xlabel('X'),ylabel('Y'),zlabel('Z');
figure(2);
contour(xi,yi,zi,[-5 -5], 'b');%画出高度-5的等高线
grid;%显示或隐藏坐标区网格线
hold on;
plot(x,y,'+');
xlabel('X'),ylabel('Y');

演算結果
ここに画像の説明を挿入
ここに画像の説明を挿入

フィッティングの問題

ここに画像の説明を挿入
ここに画像の説明を挿入
例 1 の最初の問題は典型的な内挿問題ですが、2 番目の問題は 13.5 が指定されたデータ範囲を超えているため、内挿方法の使用には適していません。内挿関数を使用して内挿範囲外のデータを外挿すると、大きな誤差が発生します。 . Matlab を使用して高さを計算します
. 部分補間、スプライン補間、および外挿の結果

ルンジ現象は高次補間で発生し、t>12 の場合には外挿データに大きな誤差が発生します。
スプライン補間の最初のグラフは、スプライン補間が最初の問題をうまく解決できることを示していますが、2 番目のグラフは、t>12 の場合にスプライン補間を使用してデータを外挿すると大きな誤差が生じることを示しています。
要約すると、補間方法は 2 番目の質問には適していません。
2 番目の質問を解決する一般的な方法は、1 ~ 12 点の温度データに基づいて温度と時間の近似関数関係 f(t) を求め、f(t) から t =13.5 での温度を推測することです。データ間の近似的な関数関係を見つける問題は、カーブ フィッティング問題と呼ばれます。
フィッティング問題と補間問題の違いは次のとおりです: (1) 補間関数は既知の点
を通過しますが、フィッティング関数は既知の点を通過しません。必然的に既知の点を通過する; (2) 内挿 主に関数値を見つけるために使用され、フィッティングの主な目的は、予測などのさらなる分析のための関数関係を見つけることです。もちろん、一部の特定の問題では内挿とフィッティングの両方を使用できます。例 2 もフィッティング問題です


2. フィッティングの計算

(1) 線種の選択:
(2) 線種のパラメータの計算。線種の選択はフィッティング計算の重要なポイントであり、難しい点ですが、通常、線種は主に専門知識と散布図に基づいて決定されます。最小二乗法は線形フィッティングのパラメータの計算に使用できますが、ガウス-ニュートン反復法は非線形フィッティングのパラメータの計算に使用する必要があります。

3.MATLABフィッティング

Matlab 多項式フィッティング コマンドの形式は次のとおりです:
[a,S]=polyfit(x,y,n) ここで、x と y はフィッティングされるデータの独立変数と従属変数、n はフィッティング多項式の次数、a はフィッティング 多項式係数で構成されるベクトル; S はフィッティング効果を分析するために必要な指標 (省略可能)
コードはデータ セットのフィッティングを表示します。

%拟合
x=1:12;
y=[5, 8, 9, 15,25, 29, 31, 30, 22, 25, 27, 24];
a=polyfit(x,y,9);%进行9次多项式拟合
xp=1:0.1:12;
yp=polyval(a,xp);%计算多项式 a 在 xp 的每个点处的值。
% 参数 a 是长度为 n+1 的向量,其元素是 n 次多项式的系数(降幂排序)
plot(x,y,'.k',xp,yp,'r');

結果は次のとおりです。
ここに画像の説明を挿入
(2) 非線形フィッティング
Matlab の非線形フィッティング コマンドの形式は次のとおりです: [b,r]=polyfit(x,y,fun,b0,option)
ここで、x と y はフィッティングされるデータの独立変数の合計です。従属変数; fun はフィッティング関数; b0 はフィッティング パラメーターの初期反復値; option はフィッティング オプション; b はフィッティング パラメーター; r はフィッティング残差です。
例 2 を MATLAB の練習に使用する

x=1:16;
y=[4.00 6.40 8.00 8.80 9.22 9.50 9.70 9.86 10.00 10.20 10.32 10.42 10.50 10.55 10.58 10.60];
y1=@(b,t)b(1)*exp(-t/b(2))+b(3)*exp(-t/b(4))+b(5);%此关系式可以写的更简单一些,作用只是确定拟合函数的类型
b0=[-1 1 -1 1 1];%初值
a=nlinfit(x,y,y1,b0);%nlinfit非线性回归拟合,此处等效polyfit。
xp=1:0.1:16;
yp=y1(a,xp);%带插点的坐标
plot(x,y,'.k',xp,yp,'r');

MIatlab プログラミングを使用したフィッティングには多くの不都合があります
(1) プログラミングが必要です。たとえば、例 2 のプログラムでは無名関数が使用されていますが、初心者にとっては簡単ではありません。
(2) フィッティング結果が不完全である。Matlab フィッティング コマンドは通常、フィッティング係数などの基本的な結果のみを提供します。場合によっては、適合度を表す統計を取得するために追加の計算が必要になります。
(3) 非線形フィッティングの反復収束は保証できません。非線形フィッティングの初期反復パラメーターは手動で決定する必要があるため、反復が収束するという保証はありません。
したがって、MATLAB ツールボックス cftool (曲線フィッター) を使用できます。

cftool (カーブフィッター)

ここに画像の説明を挿入
ここに画像の説明を挿入
cftool ツールボックスを使用して例 2 のデータを近似します。7
ここに画像の説明を挿入
ここに画像の説明を挿入
次多項式近似で出力
ここに画像の説明を挿入
します。近似が完了した後、近似結果が評価されます。SSE-
二乗平均平方根誤差/残差二乗和誤差
R-二乗相関係数
RMSE - 残留標準偏差は
通常、SSE と RMSE に依存し、0.1 を超えてはなりません。
右上隅の「エクスポート」を選択してコードをエクスポートします。
このツールボックスは非常にうまく機能します。

おすすめ

転載: blog.csdn.net/Luohuasheng_/article/details/128589612