matlab最小二乘法拟合非线性函数出现报错:
错误使用 lsqcurvefit (line 251)
Function value and YDATA sizes are not equal.
出错 model160 (line 128)
x = lsqcurvefit(fun,x0,t,y)
clc;
clear all;
close all;
t =1:1:120;
y = [1.5209E-05
2.73925E-05
3.64347E-05
4.51801E-05
5.36917E-05
6.03408E-05
6.95839E-05
7.45523E-05
8.15452E-05
8.76574E-05
9.25562E-05
9.92101E-05
0.000103591
0.000109378
0.000114834
0.000119125
0.000124516
0.000128957
0.000134247
0.000139571
0.000142767
0.000148786
0.000152469
0.000156941
0.00016204
0.000165391
0.00017141
0.00017426
0.000178289
0.000183396
0.000186163
0.000191818
0.000194611
0.000199332
0.000203071
0.000206965
0.000211602
0.000214311
0.000219018
0.000222397
0.000225307
0.000230937
0.000233137
0.00023843
0.00024143
0.000245348
0.000250016
0.000253136
0.000257096
0.000261387
0.000264397
0.00026828
0.000271454
0.000275756
0.000279777
0.000282872
0.000288457
0.000290436
0.000295746
0.000298417
0.00030172
0.000306522
0.000308895
0.000313854
0.00031624
0.000321006
0.000324864
0.000328049
0.000332961
0.000335469
0.000340339
0.000344124
0.000348256
0.000352025
0.0003554
0.00036012
0.000362843
0.000367776
0.000371939
0.000374454
0.000379865
0.000382898
0.000387542
0.000392048
0.000394471
0.000400136
0.000403197
0.00040757
0.000412319
0.000415696
0.000421168
0.00042421
0.000428371
0.000433276
0.000437273
0.000441722
0.000445754
0.000450634
0.000453627
0.000458699
0.000462663
0.000466301
0.000472464
0.000475643
0.000479811
0.00048516
0.000489106
0.00049434
0.000498791
0.000503249
0.000508155
0.000513013
0.000518485
0.000522081
0.000528433
0.000533215
0.000537586
0.000543645
0.000547585
0.000553172];
k=0.4;
fun=@(x,t)(k*x (3).*(x(4).^(x (1) .*t+x (2)))) .*t.^(-x (1) .*t-x (2))./(gamma (1-x (1) .*t-x(2))) ;
x0 = [1,1,1,1];
x = lsqcurvefit(fun,x0,t,y)
times = linspace(t(1),t(end));
plot(t,y,'ko',times,fun(x,times),'b-')
legend('Data','Fitted exponential')
xlabel('x')
ylabel('y')
title('Data and Fitted Curve')
R2=1 - (sum((fun(x,t)- y).^2)/ sum((y - mean(y)).^2))
RMSE = sqrt(mean((fun(x,t)-y).^2))
参考GPT:该错误是由于函数值和YDATA的尺寸不同引起的。 通常,这种错误发生在模型函数(fun)的输出大小与YDATA的大小不同的情况下。
在您的代码中,模型函数的输出大小与YDATA的大小不同。 模型函数的输出应该与YDATA的大小相同。
您需要检查模型函数fun并确保它具有正确的输出大小。 可以尝试对fun函数进行调试,并确保它正确地计算并返回要拟合的数据的大小。
您还可以检查一下是否存在任何错误输入。 在这种情况下,请检查t和y的大小是否相同。
根据报错信息 "Function value and YDATA sizes are not equal.",你的函数输出值的尺寸和实际数据 y 的尺寸不匹配。这通常是因为你的函数的输入参数不正确或者你的函数没有正确计算输出值。
在你的代码中,你的函数 fun 定义是不完整的。具体来说,你需要在 x(3) 和 x(4) 之间加上一个乘号 *,这样才能正确计算输出值。此外,你的函数可能还需要进一步检查是否有其他语法错误。
在调试后,如果仍然存在问题,可以尝试使用其他拟合方法或库进行非线性拟合,例如nlinfit。
空格修改如下:
fun=@(x,t)(k*x(3).*(x(4).^(x(1).*t+x(2)))).*t.^(-x(1).*t-x(2))./(gamma(1-x(1).*t-x(2))) ;
然后,在代码的最后两行,你试图使用变量 x 来计算 R2 和 RMSE,但是该变量并没有被定义。这是因为 lsqcurvefit 函数的输出是存储在 x 中的,但是在函数外部 x 并没有被定义。为了解决这个问题,你需要将 lsqcurvefit 的输出赋给另一个变量,比如 x_fit,然后在计算 R2 和 RMSE 时使用 x_fit 变量。
拟合函数的行列向量是不是搞反了,xy调换下看看
该回答引用GPTᴼᴾᴱᴺᴬᴵ,具体如下:
根据报错信息 "Function value and YDATA sizes are not equal.",可以判断问题出现在函数 fun 的输出值和目标数据 y 的维度不一致。检查一下 fun 函数的输出值的维度是否正确,应该是一个与 y 维度相同的列向量。
经过仔细观察 fun 函数,发现其中有一个括号的位置写错了,应该改为:
fun=@(x,t)(k*x(3).*(x(4).^(x(1).*t+x(2)))).*t.^(-x(1).*t-x(2))./(gamma(1-x(1).*t-x(2))) ;
即将 (k*x (3)) 改为 (k*x(3)),将 x(4).^(x (1) .*t+x (2)) 改为 x(4).^(x(1).*t+x(2))。修改后的 fun 函数应该可以正确计算输出值和目标数据的维度匹配。
重新运行代码,应该就能得到正确的拟合结果了。
如果以上回答对您有所帮助,望采纳~谢谢
https://zhidao.baidu.com/question/1580649377615738500.html
参考GPT:
根据错误提示 "Function value and YDATA sizes are not equal.", 可以猜测问题可能出现在函数值和YDATA大小不等,即你提供的数据y和你定义的函数fun的计算结果的长度不一致。通过查看代码,可以发现fun函数中的x (3) 和 x (4) 缺少运算符。因此在fun函数中将第四行改为:
matlab
Copy code
fun=@(x,t)(kx(3).(x(4).^(x(1).*t+x(2)))) .*t.^(-x(1).*t-x(2))./(gamma(1-x(1).*t-x(2))) ;
另外,为了避免lsqcurvefit函数陷入局部最优解,通常需要将x0初始化为一些合适的值,以便算法能够更快地收敛到正确的解。对于这个问题,可以考虑根据数据的性质来初始化x0。因为数据看起来类似于指数函数,可以使用指数函数的初始猜测。对于这个问题,可以将x0设置为:
matlab
Copy code
x0 = [0.1,0.1,1,1];
最后,R2和RMSE的计算看起来没有问题,但请注意,如果数据集的大小很小,这些指标的值可能会失真。
还想问下拟合出来的曲线为什么和取得点差距那么大?只能通过初值的选取调节吗?
问题分析:matlab
clc;
clear all;
close all;
t = 1:1:120;
y = [1.5209E-05
2.73925E-05
3.64347E-05
4.51801E-05
5.36917E-05
6.03408E-05
6.95839E-05
7.45523E-05
8.15452E-05
8.76574E-05
9.25562E-05
9.92101E-05
0.000103591
0.000109378
0.000114834
0.000119125
0.000124516
0.000128957
0.000134247
0.000139571
0.000142767
0.000148786
0.000152469
0.000156941
0.00016204
0.000165391
0.00017141
0.00017426
0.000178289
0.000183396
0.000186163
0.000191818
0.000194611
0.000199332
0.000203071
0.000206965
0.000211602
0.000214311
0.000219018
0.000222397
0.000225307
0.000230937
0.000233137
0.00023843
0.00024143
0.000245348
0.000250016
0.000253136
0.000257096
0.000261387
0.000264397
0.00026828
0.000271454
0.000275756
0.000279777
0.000282872
0.000288457
0.000290436
0.000295746
0.000298417
0.00030172
0.000306522
0.000308895
0.000313854
0.00031624
0.000321006
0.000324864
0.000328049
0.000332961
0.000335469
0.000340339
0.000344124
0.000348256
0.000352025
0.0003554
0.00036012
0.000362843
0.000367776
0.000371939
0.000374454
0.000379865
0.000382898
0.000387542
0.000392048
0.000394471
0.000400136
0.000403197
0.00040757
0.000412319
0.000415696
0.000421168
0.00042421
0.000428371
0.000433276
0.000437273
0.000441722
0.000445754
0.000450634
0.000453627
0.000458699
0.000462663
0.000466301
0.000472464
0.000475643
0.000479811
0.00048516
0.000489106
0.00049434
0.000498791
0.000503249
0.000508155
0.000513013
0.000518485
0.000522081
0.000528433
0.000533215
0.000537586
0.000543645
0.000547585
0.000553172];
k=0.4;
fun=@(x,t)(k*x(3).*(x(4).^(x(1).*t+x(2)))).*t.^(-x(1).*t-x(2))./(gamma(1-x(1).*t-x(2)));
x0 = [1,1,1,1];
x = lsqcurvefit(fun,x0,t,y);
gamma_values = zeros(size(t));
for i = 1:length(t)
gamma_values(i) = gamma(1-x(1)*t(i)-x(2));
end
fun_values = (k*x(3).*(x(4).^(x(1).*t+x(2)))).*t.^(-x(1).*t-x(2))./gamma_values;
times = linspace(t(1),t(end));
plot(t,y,'ko',times,fun(x,times),'b-')
legend('Data','Fitted exponential')
xlabel('x')
ylabel('y')
title('Data and Fitted Curve')
R2 = 1 - (sum((fun(x,t)- y).^2)/ sum((y - mean(y)).^2));
RMSE = sqrt(mean((fun(x,t)-y).^2));
不知道你这个问题是否已经解决, 如果还没有解决的话:格式:[x, resnorm,r,flag]=lsqcurvefit(fun, c0,xdata,ydata)
c0为初始解向量;xdata,ydata为数据;
fun为待拟合函数(句柄函数),resnorm=sum ((fun(c,xdata)-ydata).^2),即在xdata处残差的平方和;flag为终止迭代的条件。
例:确定模型中的参数,已知数据点:
xdata = [3.6,7.7,9.3,4.1,8.6,2.8,1.3,7.9,10.0,5.4];
ydata = [16,150.5,260.1,22.5,206.5,9.9,2.7,165.5,325.0,54.5];