最初のステップ
モデル化しようとしている関数の Matlab での表現を取得することから始めるべきだと思います。式を直訳すると、次のようになります。
function y = targetfunction(A,V,P,bc,b)
y = (A/2) * (1 - V * sin((b-bc) / P));
end
データの把握
私の次のステップは、操作するデータを生成することです (当然、独自のデータを使用します)。そこで、ノイズの多いデータを生成する関数を次に示します。パラメータにいくつかの値を指定したことに注意してください。
function [y b] = generateData(npoints,noise)
A = 2;
V = 1;
P = 0.7;
bc = 0;
b = 2 * pi * rand(npoints,1);
y = targetfunction(A,V,P,bc,b) + noise * randn(npoints,1);
end
この関数rand
は、間隔でランダムな点を生成します。間隔でランダムに点を取得するために、[0,1]
それらを乗算しました。次に、それらのポイントにターゲット関数を適用し、少しノイズを追加しました (関数は正規分布の確率変数を生成します)。2*pi
[0, 2*pi]
randn
フィッティング パラメータ
最も複雑な関数は、モデルをデータに適合させる関数です。このために、fminunc
制約のない最小化を行う関数 を使用します。ルーチンは次のようになります。
function [A V P bc] = bestfit(y,b)
x0(1) = 1; %# A
x0(2) = 1; %# V
x0(3) = 0.5; %# P
x0(4) = 0; %# bc
f = @(x) norm(y - targetfunction(x(1),x(2),x(3),x(4),b));
x = fminunc(f,x0);
A = x(1);
V = x(2);
P = x(3);
bc = x(4);
end
行ごとに見ていきましょう。f
まず、最小化したい関数を定義します。これはあまり難しくありません。Matlab で関数を最小化するには、単一のベクトルをパラメーターとして取る必要があります。したがって、最初の 4 行で 4 つのパラメーターをベクトルにパックする必要があります。データの生成に使用した値と近い値を使用しましたが、同じではありません。
次に、最小化したい関数を定義します。データセット内のポイントとともに、それをx
アンパックして にフィードします。願わくば、これらが に近いことを願っています。関数から減算して適用することで、それらがどれだけ離れているかを測定します。この関数は、すべてのコンポーネントを二乗し、それらを合計して平方根を取ります (つまり、二乗平均平方根誤差を計算します)。targetfunction
b
y
y
y
norm
次にfminunc
、関数を最小化するように呼び出し、パラメーターの初期推定を行います。これは、内部ルーチンを使用して各パラメーターの最も近い一致を見つけ、それらを vector で返しますx
。
最後に、 vector からパラメーターをアンパックしますx
。
すべてを一緒に入れて
これで必要なコンポーネントがすべて揃ったので、それらを結び付ける最後の関数が 1 つだけ必要です。ここにあります:
function master
%# Generate some data (you should read in your own data here)
[f b] = generateData(1000,1);
%# Find the best fitting parameters
[A V P bc] = bestfit(f,b);
%# Print them to the screen
fprintf('A = %f\n',A)
fprintf('V = %f\n',V)
fprintf('P = %f\n',P)
fprintf('bc = %f\n',bc)
%# Make plots of the data and the function we have fitted
plot(b,f,'.');
hold on
plot(sort(b),targetfunction(A,V,P,bc,sort(b)),'r','LineWidth',2)
end
この関数を実行すると、次のように画面に表示されます。
>> master
Local minimum found.
Optimization completed because the size of the gradient is less than
the default value of the function tolerance.
A = 1.991727
V = 0.979819
P = 0.695265
bc = 0.067431
そして、次のプロットが表示されます。
そのフィット感は私には十分に見えます。私がここで行ったことについて何か質問があれば教えてください。