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
通过使用Matlab进行全局拟合,找出基础数据集的相对贡献?_Matlab_Global Variables_Data Fitting - Fatal编程技术网

通过使用Matlab进行全局拟合,找出基础数据集的相对贡献?

通过使用Matlab进行全局拟合,找出基础数据集的相对贡献?,matlab,global-variables,data-fitting,Matlab,Global Variables,Data Fitting,我从实验中得到了两条数据曲线(y1和y2)。两条曲线具有相同的x 对于每条曲线,它们应该由各自的基础数据集描述 y1 = a* bd1_y1 + b* bd1_y2 + (1-a-b)* bd1_y3 y2 = a* bd2_y1 + b* bd2_y2 + (1-a-b)* bd2_y3 ,在哪里 bd1_y1、bd1_y2和bd1_y3是y1 bd2_y1、bd2_y2和bd2_y3是y2 a和b是相对贡献(0 但是经过几天的工作,我仍然不知道如何将基集合并到函数(f0)中,因此提

我从实验中得到了两条数据曲线(y1和y2)。两条曲线具有相同的x
对于每条曲线,它们应该由各自的基础数据集描述

 y1 = a* bd1_y1 + b* bd1_y2 + (1-a-b)* bd1_y3 
 y2 = a* bd2_y1 + b* bd2_y2 + (1-a-b)* bd2_y3 
,在哪里

bd1_y1
bd1_y2
bd1_y3
y1
bd2_y1
bd2_y2
bd2_y3
y2
a
b
是相对贡献(
0
但是经过几天的工作,我仍然不知道如何将基集合并到函数(f0)中,因此提取a和b时没有运气。
如何对
y1
y2
进行拟合以获得a、b及其置信区间?非常感谢您的帮助

Data:
x = [1     2     3     4     5     6     7     8     9  ]; 
y1 = [0.4304    0.2249    0.1283    0.0794    0.0484    0.0326    0.0203    0.0125    0.0072]; 
y2 = [0.2179    0.1699    0.1410    0.1101    0.0871    0.0679    0.0515    0.0385    0.0296]; 
bd1_y1 = [0.5587    0.2244    0.1023    0.0520    0.0276    0.0155    0.0089    0.0053    0.0033]; 
bd1_y2 = [0.4580    0.2788    0.1198    0.0642    0.0342    0.0197    0.0115    0.0069    0.0043]; 
bd1_y3 = [0.3584    0.3102    0.1540    0.0755    0.0440    0.0248    0.0148    0.0091    0.0056]; 
bd2_y1 = [0.3266    0.1778    0.1255    0.0975    0.0777    0.0612    0.0478    0.0367    0.0281]; 
bd2_y2 = [0.2985    0.2086    0.1268    0.0939    0.0722    0.0580    0.0470    0.0383    0.0313]; 
bd2_y3 = [0.2451    0.2221    0.1434    0.0999    0.0775    0.0609    0.0494    0.0406    0.0335]; 
因此,您需要解决(请注意,我已更改了变量的名称):

这相当于

b = x(1)*(v1-v3) + x(2)*(v2-v3) + x(3)*v3         %(2)
我们有一个标准的线性代数问题
a*x=b
,但约束条件
x(1),x(2)∈ [0,1]
x(3)=1

在这种情况下,可以使用最小二乘线性解算器:

% We take your first example
b  = [0.4304    0.2249    0.1283    0.0794    0.0484    0.0326    0.0203    0.0125    0.0072].'; 

% Our 3 variables (v1 = bd1_y1, v2 = bd1_y2...)
v1 = [0.5587    0.2244    0.1023    0.0520    0.0276    0.0155    0.0089    0.0053    0.0033].'; 
v2 = [0.4580    0.2788    0.1198    0.0642    0.0342    0.0197    0.0115    0.0069    0.0043].'; 
v3 = [0.3584    0.3102    0.1540    0.0755    0.0440    0.0248    0.0148    0.0091    0.0056].'; 

% According to (2) we can write our system of equation:
A = [v1-v3,v2-v3,v3];

% Now we fixe the lower bound and the upper bound for each parameters x: x(1), x(2), x(3):
%                x(1) x(2) x(3)
lb = [0 0 1].';%   0   0   1
%                  to  to  to
lu = [1 1 1].';%   1   1   0

% And finally we solve the system of equation:
x = lsqlin(A,b.',[],[],[],[],lb,lu)
% And we found a minimum for:
% x(1) = 0.44 = a
% x(2) = 0    = b
% x(3) = 1    
如果我们绘制结果,我们将得到:

plot(1:9,b,1:9,A*x)
legend('Experimental','Estimation')

通常,我尽量避免约束。因此,第一步应该是:检查真正的解决方案是否在约束范围内。我将用Python进行编程,但它非常通用,因此应该很容易将其转换为Matlab

将numpy导入为np
xl=np.arange(9)+1
y1=np.1数组([
0.4304, 0.2249, 0.1283, 0.0794, 0.0484, 0.0326, 0.0203, 0.0125, 0.0072
]) 
y2=np.array([
0.2179, 0.1699, 0.1410, 0.1101, 0.0871, 0.0679, 0.0515, 0.0385, 0.0296
])
bd1_y1=np.array([
0.5587, 0.2244, 0.1023, 0.0520, 0.0276, 0.0155, 0.0089, 0.0053, 0.0033
])
bd1_y2=np.array([
0.4580, 0.2788, 0.1198, 0.0642, 0.0342, 0.0197, 0.0115, 0.0069, 0.0043
])
bd1_y3=np.array([
0.3584, 0.3102, 0.1540, 0.0755, 0.0440, 0.0248, 0.0148, 0.0091, 0.0056
])
bd2_y1=np.array([
0.3266, 0.1778, 0.1255, 0.0975, 0.0777, 0.0612, 0.0478, 0.0367, 0.0281
])
bd2_y2=np.array([
0.2985, 0.2086, 0.1268, 0.0939, 0.0722, 0.0580, 0.0470, 0.0383, 0.0313
])
bd2_y3=np.array([
0.2451, 0.2221, 0.1434, 0.0999, 0.0775, 0.0609, 0.0494, 0.0406, 0.0335
])
"""
如果y=a x1+b x2+(1-a-b)x3,则
y-x3=a(x1-x3)+b(x2-x3)
i、 e.获得齐次线性系统的简单变换
"""
y1k=y1-bd1_y3
y11k=bd1_y1-bd1_y3
y12k=bd1_y2-bd1_y3
y2k=y2-bd2_y3
y21k=bd2_y1-bd2_y3
y22k=bd2_y2-bd2_y3
"""
所以我们只想解一个简单的线性系统
y=a x1+b x2
y=(y1,…,yn)和x1=(x11,x12,…,x1n)等
使用共享参数处理这两个测量值只需
将相应的向量相加,使yp和yq进入
y_tot=(yp1,…,ypn,yq1,…,yqn)和x相同
矩阵A的x,我们可以把它写成y=A。(A,b)
这是标准的线性优化!
简而言之,这是在以下步骤中完成的(首先加入数据集)
"""
y=np.追加(y1k,y2k)
z1=np.追加(y11k,y21k)
z2=np.append(y12k,y22k)
AT=np.数组([z1,z2])
A=np.转置(AT)
U=np.点(AT,A)
UI=np.linalg.inv(U)
K=np.dot(UI,AT)
v=np.点(K,y)
a=v[0]
b=v[1]
印刷品(a、b)
"""
具体而言,应更加小心,以避免奇异矩阵等,
e、 g.通过单值分解等
在下一步中,通常假设所有测量值共享相同的值
与我们计算的基本误差s相同
"""
差异=y-a*z1-b*z2
s2=np.和(差**2)/(长(差)-1)
"""
现在通过误差传播计算协方差矩阵,
也就是像s_a=s*sqrt(sum_i(da/dyi)^2),它给出了经典的
s^2*K KT
"""
cov=s2*np.dot(K,np.transpose(K))
打印(cov)
"""
a的误差为(并相应地为)
"""
sa=np.sqrt(cov[0,0])
sb=np.sqrt(cov[1,1])
印刷品(sa、sb)
这段代码已经连接了两个数据集,可以很容易地扩展到n个数据集。最终的解决方案如下所示:

上图:原始数据。目标为蓝色,三个底色 数据集分别为黄色、绿色和红色。下方的图形为蓝色目标和黄色无约束最佳拟合

解决方案

>1.9712440231598143-3.163257723318949
所以这不在边界之内。实际上,
a>1
b<0
。所以我们知道解位于边界上。在
(a,b)
-空间中,无论是在右边还是在底部。真正线性问题中的最小二乘最小化给出了真正的抛物线形状,所以只有一个解,没有局部极小值

现在,我们可以在边界上强制求解,而不是试图求解约束问题

“”“
我们只是将参数设置为相应的边界值
像以前一样求解,这里矩阵形式是一个小的
过分了,但为了保持一致性,这是一种很好的写作方式。
"""
"""
案例1:b=0
"""
AT=np.array([b1all])
A=np.转置(AT)
U=np.点(AT,A)
UI=np.linalg.inv(U)
K=np.dot(UI,AT)
v=np.点(K,雅尔)
aopt1=v[0]
diff=yall-aopt1*b1all-0*b2all
s2=np.和(差**2)/(长(差)-1)
cov=s2*np.dot(K,np.transpose(K))
打印(aopt1)
打印(cov,np.sqrt(cov[0,0]))
"""
案例2:a=1
"""
ymod=yall-b1all
AT=np.array([b2all])
A=np.转置(AT)
U=np.点(AT,A)
UI=np.linalg.inv(U)
K=np.dot(UI,AT)
v=np.点(K,ymod)
bopt1=v[0]
差异=ymod-bopt1*b2all
s2=np.和(差**2)/(长(差)-1)
cov=s2*np.dot(K,np.transpose(K))
打印(bopt1)
打印(cov,np.sqrt(cov[0,0]))
这为
a

>0.3815249997379142
>> [[0.00807797]] 0.08987750010601071
对于
b

>-1.2997646861507886
>> [[0.01736744]] 0.13178558294218914
plot(1:9,b,1:9,A*x)
legend('Experimental','Estimation')