如何在Matlab中将数据绘制成“最适合”的cos²图形?

时间:2012-11-02 16:15:22

标签: matlab curve-fitting

我目前是一名物理系学生,几周来一直在编写与“量子纠缠”相关的数据。我现在已经到了一个点,我必须绘制我的数据(它应该类似于cos²图 - 并且确实如此)到一种“最适合”的cos²图形。实验室脚本说明如下:

  

更精确地确定能见度V(这基本上是数据的“干净”)遵循使用该函数最佳拟合测量数据:

     

f(b)= A / 2 [1-Vsin(b-b(中)/ P)]

当然,这可能并不意味着脱离背景,但基本上A是幅度,b是角度,P是周期性。因此,这也是我发现的实验数据之类的“波动”。

据我所知,正如前面提到的,我正在制作一个“最合适”的曲线。但是,有人告诉我,Excel无法做到这一点,最好的方法是Matlab。

我知道中级JavaScript,但不了解Matlab,并希望有一些方向。

我可以阅读这个教程吗?有人可以和我一起经历吗?我真的不知道它需要什么,所以任何反馈都会非常感激。

非常感谢!

2 个答案:

答案 0 :(得分: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中的函数,需要将单个向量作为参数。因此,我们必须将四个参数打包到一个向量中,我在前四行中进行了这一操作。我使用了与我用来生成数据的值接近但不相同的值。

然后我定义了我想要最小化的函数。它需要一个参数x,它将解包并提供给targetfunction,以及数据集中的点b。希望这些接近y。我们通过从y中减去y并应用函数norm来衡量它们的距离,这些函数将每个组件平方,将它们相加并取平方根(即它计算根均值)方误差)。

然后我调用fminunc,使我们的函数最小化,并初步猜测参数。这使用内部例程为每个参数找到最接近的匹配,并在向量x中返回它们。

最后,我从矢量x中解压缩参数。

全部放在一起

我们现在拥有了我们需要的所有组件,因此我们只需要一个最终功能将它们连接在一起。这是:

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

出现以下情节:

enter image description here

这个合身对我来说足够好看。如果您对我在这里所做的任何事情有任何疑问,请与我们联系。

答案 1 :(得分: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值并在正确的单元格中运行。