在拟合过程中,Matlab报错“function value and YDATA sizes are not equal”,报错图如下
望能人解答,谢谢
代码附上
#main
clear all;clc;
%读取数据
data=xlsread('工作簿2.xls');
x0=data(:,1);
y0=data(:,2);
%拟合
beta0=[0.005,50,2];
% lb=[0,0,0];
% ub=[0.2,1000,5];
[p]=lsqcurvefit(@func,beta0,x0,y0);
%结果展示
xx=[1:10:360];
yy=func(p,xx);
figure;
plot(x0,y0,'ko');
hold on;
plot(xx,yy);
grid on;
#func
function yhat = func( beta0,X )
p00=beta0(1)
p10=beta0(2)
p20=beta0(3)
f=0.4-p00X/(1+X/p10);
yhat=p20sqrt((52079166+10835766ff-62914932*f)1000000/(10417-3817f)/2020);
end
(1)原函数代码存在的问题
function yhat = original_func( beta0,X )
p00=beta0(1) //应该打分号减少不必要的屏幕输出
p10=beta0(2)
p20=beta0(3)
f=0.4-p00*X/(1+X/p10); //这里X是向量不是标量,因此"X/(1+X/p10)"应该修改为"X./(1+X/p10)"
// (f是向量不是标量,"10835766/f"应修改为"10835766./f","1000000/(10417-3817*f)"应修改为"1000000./(10417-3817*f)")
yhat=p20*sqrt((52079166+10835766/f-62914932*f)*1000000/(10417-3817*f)/2020);
end
(2)修改后的函数代码
function yhat = func( beta0,X )
p00=beta0(1);
p10=beta0(2);
p20=beta0(3);
f=0.4-p00*X./(1+X/p10);
yhat=p20*sqrt((52079166+10835766./f-62914932*f)*1000000./(10417-3817*f)/2020);
end
(3)代码验证
由于没有“工作簿2.xls”,修改主程序,通过模型数据加随机数得到待拟合数据,修改后的主程序如下:
clear all;clc;
%读取数据
%data=xlsread('工作簿2.xls');
% x0=data(:,1);
% y0=data(:,2);
x0=[1:10:360];
y0=func([0.005,50,2],x0)+100*rand(size(x0));
%拟合
beta0=[0.005,50,2];
% lb=[0,0,0];
% ub=[0.2,1000,5];
[p]=lsqcurvefit(@func,beta0,x0,y0);
%结果展示
xx=[1:10:360];
yy=func(p,xx);
figure;
plot(x0,y0,'ko');
hold on;
plot(xx,yy);
grid on;
axis tight;
程序运行结果如下:
函数这样写,记得在不是用矩阵乘除的时候多加个点. 确保是对列表中的每个数进行标量的乘除
function yhat = func( beta0,X )
p00=beta0(1);
p10=beta0(2);
p20=beta0(3);
f=0.4-p00.*X./(1+X./p10);
yhat=p20*sqrt((52079166+10835766./f-62914932.*f)*1000000./(10417-3817.*f)./2020);
end
你这个报错的原因就是y0和func函数的返回值也就是yhat的维数不匹配,计算时候没加点,默认是矩阵乘除,列数被自动扩张了
[p]=lsqcurvefit(@func,beta0,x0,y0);你这里的@func有问题,这个地方的函数应该不是后面你建立的那个函数,这个地方应该是一个指数衰减模型
赋值给变量的数据大小不对,不符合变量定义的大小