本人小白,想请教如何在限定参数范围的情况下进行线性拟合。
在MATLAB中,通常解一个多元超定方程组,如
A=[1,2,3;
2,3,4;
3,4,5;
4,5,6;
5,6,7];
b=[40,50,60,70,80]';
若要求Z=[z1;z2;z3];
只需Z=A\b就可以了。
但如果额外需满足约束条件,比如0.54
为了实现上述目的,本人编了一个小程序,但计算速度太慢,以至于上述测试文件(共五行四列)需要2个半小时才能计算完成,能否优化呢?
程序如下:
function yy=mindz(dz)
z1=[0.54;1.09];
z2=[0;0.90];
z3=[0.54;1.09];
num_z3=fix((z3(2,1)-z3(1,1))/dz+1);
num_z2=fix((z2(2,1)-z2(1,1))/dz+1);
num_z1=fix((z1(2,1)-z1(1,1))/dz+1);
mm_total=num_z2*(num_z1*2+1-num_z3)*num_z3/2;
hwait=waitbar(0,'请等待>>>>>>>>');
yy=zeros(1,4);
load data.txt -ASCII %%该文件即为五行四列文件,包含了A项和b项
mm=1;
idata=1:size(data,1);
yy(1)=sum((data(idata,4)-data(idata,1).*z3(1,1)-data(idata,2).*z2(1,1)+data(idata,3).*z3(1,1)).^2);
%%原方程形如b=z1*a1+z2*a2+z3*a3,其中z1 z2 z3为要拟合的有限定范围的量。这里是在进行最小二乘计算。
yy(2)=z3(1,1);
yy(3)=z2(1,1);
yy(4)=z3(1,1);
for zz3=z3(1,1):dz:z3(2,1)
for zz1=zz3:dz:z1(2,1)
for zz2=z2(1,1):dz:z2(2,1)
yyi=sum((data(idata,4)-data(idata,1).*zz1-data(idata,2).*zz2+data(idata,3).*zz3).^2);
if yyi < yy(1)
yy(1)=yyi;
yy(2)=zz1; %%用于后期调用最小值的相应zz1
yy(3)=zz2;
yy(4)=zz3;
end
perstr=fix(mm/mm_total*100);
str=['正在运行中',num2str(perstr),'%'];
waitbar(mm/mm_total,hwait,str);
pause(0.05);
mm=mm+1;
end
end
end
close(hwait);
请大神赐教!不甚感激!