polyfitで特定の点を通るようにする方法を勉強

本件、公式に記事がありまして、さらに勉強用で本記事書かせていただきました。

公式

まずは公式の文書はこちら。

特定の点を通るような制約を与えつつ、フィッティングを行う方法はありますか?
MATLAB の POLYFIT 関数、または Curve Fitting Toolbox で用意されている関数を使って、特定の点を必ず通るような制約をつけてフィッティングをしたいのですが、どのように定義すれば良いか教えて下さい。

plot出力は下記になります。

書き換え

公式は、わかりやすくするために寄り道が多いですが、、シンプルに書き換えると下記のようになります。(値は一部変えています。)

c = [-0.01 -0.01 2 1];   
x = linspace(-2,4);   
y = c(1)*x.^3+c(2)*x.^2+c(3)*x+c(4) + 0.5*randn(1,100); 
plot(x,y,'.b-')
hold on 

c = polyfit(x,y,3);   

yhat = c(1)*x.^3+c(2)*x.^2+c(3)*x+c(4); 
plot(x,yhat,'r','linewidth',2)

% 下記の座標を通るようにする(今回は原点)
x0 = 0;
y0 = 0;

x = x(:); %列ベクトルとする
y = y(:);

n = 3; % 多項式の次数
V(:,n+1) = ones(length(x),1,class(x));
for j = n:-1:1
    V(:,j) = x.*V(:,j+1);
end

% 曲線が特定の点にヒットすることを強いるために、線形制約を使う
p = lsqlin( V, y, [], [], x0.^(n:-1:0), y0 );
% フィッティング結果の曲線の評価のため、 POLYVAL 関数を使う
yhat = polyval( p, x );
% オリジナルデータの表示 :
plot(x,y,'.b-') 
hold on

% 特定の点の表示 :
plot(x0,y0,'gx','linewidth',4) 
% フィッテイングの結果の表示 :
plot(x,yhat,'r','linewidth',2,'color',"cyan") 
hold off

plotは下記。原点を通るような近似式が実現可能です。

注意点

しかし注意点があります。それは「Optimization Toolbox」が必要なことです。これの意味するところは、分析の際に別でお金が発生するということ。そこまでしてやりたいか、別の近似式ではだめなのか、など考慮する必要があると思います。

コメント

タイトルとURLをコピーしました