Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将数据打印到“;最佳匹配”;cos和xB2;Matlab中的图形?_Matlab_Curve Fitting - Fatal编程技术网

如何将数据打印到“;最佳匹配”;cos和xB2;Matlab中的图形?

如何将数据打印到“;最佳匹配”;cos和xB2;Matlab中的图形?,matlab,curve-fitting,Matlab,Curve Fitting,我目前是一名物理系学生,数周来一直在收集与“量子纠缠”相关的数据。现在,我必须将我的数据(应该类似于cos²图——确实如此)绘制成某种“最佳拟合”的cos²图。实验室脚本说明如下: 使用函数从最佳拟合到测量数据,更精确地确定可见性V(这基本上是数据的“清洁”程度): f(b)=A/2[1-Vsin(b-b(中心)/p)] 当然,这可能并不意味着太离题,但本质上A是振幅,b是角度,p是周期性。因此,这也是一个“波”,就像我发现的实验数据一样 从这一点我了解到,正如前面提到的,我正在制作一条“最佳拟

我目前是一名物理系学生,数周来一直在收集与“量子纠缠”相关的数据。现在,我必须将我的数据(应该类似于cos²图——确实如此)绘制成某种“最佳拟合”的cos²图。实验室脚本说明如下:

使用函数从最佳拟合到测量数据,更精确地确定可见性V(这基本上是数据的“清洁”程度):

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

当然,这可能并不意味着太离题,但本质上A是振幅,b是角度,p是周期性。因此,这也是一个“波”,就像我发现的实验数据一样

从这一点我了解到,正如前面提到的,我正在制作一条“最佳拟合”曲线。然而,有人告诉我,这在Excel中是不可能的,最好的方法是Matlab

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

有没有我可以阅读的教程?有人能和我一起经历吗?我真的不知道这意味着什么,所以任何反馈都将不胜感激


非常感谢

当你提到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值和函数。

当您提到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值和函数。

初始步骤 我想我们应该首先在Matlab中得到你试图建模的函数的表示。公式的直接翻译如下所示:

function y = targetfunction(A,V,P,bc,b)
    y = (A/2) * (1 - V * sin((b-bc) / P));
end
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
获取数据 我的下一步是生成一些要处理的数据(当然,您将使用自己的数据)。这里有一个函数,它会生成一些有噪声的数据。请注意,我为参数提供了一些值

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 y = targetfunction(A,V,P,bc,b)
    y = (A/2) * (1 - V * sin((b-bc) / P));
end
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
中减去并应用函数
norm
来测量它们与
y
之间的距离,该函数将每个分量平方,相加并取平方根(即计算均方根误差)

然后我调用
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
此时将显示以下曲线图:

我觉得那件合适。如果您对我在这里所做的任何事情有任何疑问,请告诉我。

初始步骤 我想我们应该首先在Matlab中得到你试图建模的函数的表示。公式的直接翻译如下所示:

function y = targetfunction(A,V,P,bc,b)
    y = (A/2) * (1 - V * sin((b-bc) / P));
end
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
获取数据 我的下一步是生成一些要处理的数据(当然,您将使用自己的数据)。这里有一个函数,它会生成一些有噪声的数据。请注意,我为参数提供了一些值

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 y = targetfunction(A,V,P,bc,b)
    y = (A/2) * (1 - V * sin((b-bc) / P));
end
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中的函数,需要将单个向量作为参数。因此,我们必须将四个参数打包成一个向量,这是我在前四行中做的。我使用的值是