matlab lsqcurvefit拟合出现Function value and YDATA sizes are not equal.报错

matlab最小二乘法拟合非线性函数出现报错:
错误使用 lsqcurvefit (line 251)
Function value and YDATA sizes are not equal.

出错 model160 (line 128)
x = lsqcurvefit(fun,x0,t,y)

img


不知道具体是哪里错了,请懂得小伙伴指教。如下:

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的计算看起来没有问题,但请注意,如果数据集的大小很小,这些指标的值可能会失真。

还想问下拟合出来的曲线为什么和取得点差距那么大?只能通过初值的选取调节吗?

问题分析:
根据报错信息“Function value and YDATA sizes are not equal.”,可以看出是函数值和实际数据的大小不一致导致的。具体来说,函数值的大小与实际数据y的大小不一致。
在代码中,函数fun的定义中包含了一个gamma函数,而gamma函数的输入参数是一个数组,而不是一个数值。因此,当t取多个值时,gamma函数的输出也是一个数组,而不是一个数值。这就导致了fun函数的输出值是一个数组,而不是一个数值,与实际数据y的大小不一致。
解决方法:
可以将gamma函数的输入参数改为一个数值,而不是一个数组。可以使用循环来计算每个t对应的gamma函数的值,然后将这些值存储在一个数组中,作为gamma函数的输入参数。修改后的代码如下:
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));
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你看下这篇博客吧, 应该有用👉 :matlab-lsqcurvefit函数
  • 除此之外, 这篇博客: MATLAB进行非线性拟合中的 1.lsqcurvefit 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    格式:[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];


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^