如何将数据打印到“;最佳匹配”;cos和xB2;Matlab中的图形?
我目前是一名物理系学生,数周来一直在收集与“量子纠缠”相关的数据。现在,我必须将我的数据(应该类似于cos²图——确实如此)绘制成某种“最佳拟合”的cos²图。实验室脚本说明如下: 使用函数从最佳拟合到测量数据,更精确地确定可见性V(这基本上是数据的“清洁”程度): f(b)=A/2[1-Vsin(b-b(中心)/p)] 当然,这可能并不意味着太离题,但本质上A是振幅,b是角度,p是周期性。因此,这也是一个“波”,就像我发现的实验数据一样 从这一点我了解到,正如前面提到的,我正在制作一条“最佳拟合”曲线。然而,有人告诉我,这在Excel中是不可能的,最好的方法是Matlab 我知道中级JavaScript,但不知道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是周期性。因此,这也是一个“波”,就像我发现的实验数据一样 从这一点我了解到,正如前面提到的,我正在制作一条“最佳拟
非常感谢 当你提到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中的函数,需要将单个向量作为参数。因此,我们必须将四个参数打包成一个向量,这是我在前四行中做的。我使用的值是