0

私は現在物理学の学生で、数週間「量子エンタングルメント」に関連するデータを編集しています。ここで、データ (cos² グラフに似ている必要があります) を一種の「最適な」cos² グラフにプロットする必要があります。ラボ スクリプトには次のように記述されています。

ビジビリティ V のより正確な決定 (これは、基本的にデータが「クリーン」である方法です) は、関数を使用して測定データに最適に適合することに従います。

f(b) = A/2[1-Vsin(bb(センター)/P)]

確かに、これは文脈から外れた意味ではないかもしれませんが、本質的に A は振幅、b は角度、P は周期性です。したがって、これも私が見つけた実験データのような「波」です。

このことから、前述のように、「最適な」曲線を作成していることがわかります。ただし、これは Excel では不可能であり、最適なアプローチは Matlab であると言われています。

私は中間の JavaScript を知っていますが、Matlab を知らず、何らかの方向性を望んでいました。

これについて読むことができるチュートリアルはありますか? 誰かが私と一緒にそれを経験することは可能ですか? 私はそれが何を伴うのか本当にわからないので、どんなフィードバックでも大歓迎です.

どうもありがとう!

4

2 に答える 2

4

最初のステップ

モデル化しようとしている関数の 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アンパックして にフィードします。願わくば、これらが に近いことを願っています。関数から減算して適用することで、それらがどれだけ離れているかを測定します。この関数は、すべてのコンポーネントを二乗し、それらを合計して平方根を取ります (つまり、二乗平均平方根誤差を計算します)。targetfunctionbyyynorm

次に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

そして、次のプロットが表示されます。

ここに画像の説明を入力

そのフィット感は私には十分に見えます。私がここで行ったことについて何か質問があれば教えてください。

于 2012-11-02T21:02:37.250 に答える
0

f(a)について言及し、関数にaが含まれていないので少し驚いていますが、一般に、f(x)= cos(x)^2をプロットするとします。

まず、たとえば、プロットを作成するxの値を決定します。

xmin = 0;
stepsize = 1/100;
xmax = 6.5;
x = xmin:stepsize:xmax;
y = cos(x).^2;
plot(x,y)

ただし、このアプローチはExcelでも同様に機能することに注意してください。適切なセルでx値と機能を取得するには、いくつかの作業を行う必要があります。

于 2012-11-02T16:41:13.767 に答える