要做一个新冠累计确诊人数的拟合,从WHO上下了数据,然后基于2020年1月3日起至2020年6月3日的数据做预测,共154行4列的,4列依次是新增确诊、累计确诊、新增死亡、累计死亡
function y = quanguo(b, t)
global y0 %b(1):固有增长率;b(2):最大值;b(3):初始值
y = b(2) ./ (1 + b(2) / b(3) - 1) .* exp(-b(1) .* t);
end
以上为函数
以下为命令
a = xlsread("quanguo");
plot(a, "*-");
y = a(:, 2);
t = 1:154;
b = nlinfit(t, y, @quanguo, [0.3, 100000, 1]);
错误使用 nlinfit (line 219)
MODELFUN 必须为函数,它返回大小与 Y (154-by-1)相同的拟合值向量。您提供的模型函数返回结果 1-by-154。
大小不匹配的常见原因之一是在函数中使用矩阵运算符(*、/、^),而不是对应的元素运算符(.*、./、.^)。
可我提供的xls是个154行4列的矩阵啊,a读出来也是正确的
不是很懂错在哪了,求指点一下
参考GPT和自己的思路:
根据错误信息,可以看出问题在于函数定义的最后一行中的乘号使用了斜线(/)代替了乘号(*),需要将其改正,即:
y = b(2) ./ (1 + b(2) / b(3) - 1) * exp(-b(1) * t);
此外,在使用 nlinfit 进行非线性拟合时,命令的最后一行缺少右括号,需要在最后添加一个右括号,即:
b = nlinfit(t, y, 'quanguo', [0.3, 100000, 1]);
以上修改后,代码如下:
a = xlsread("quanguo")
plot(a, "\*-")
y = a(:,2);
t = 1:154;
b = nlinfit(t, y, 'quanguo', [0.3, 100000, 1]);
function y = quanguo(b, t)
global y0 %b(1):固有增长率;b(2):最大值;b(3):初始值
y = b(2) ./ (1 + b(2) / b(3) - 1) * exp(-b(1) * t);
end
希望能够帮到你!
参考GPT和自己的思路:
根据您提供的信息,错误提示显示问题出现在函数 quanguo
的第三行,第 37 列,即 y=b(2)./(1+b(2)/b(3)-1)\*exp(-b(1)\*t)
这行代码中。这个错误是因为这一行表达式中,使用了反斜杠作为除法符号,但这种写法在 Matlab 中并不被支持。因此,您需要将这一行代码修改为:
y = b(2) ./ (1 + b(2) / b(3) - 1) .* exp(-b(1) .* t);
另外,您在命令行中调用 nlinfit
函数时,传入的 quanguo
函数名缺少了最后一个右括号,导致出现语法错误。因此,正确的命令应该是:
b = nlinfit(t, y, @quanguo, [0.3, 100000, 1]);
注意到这里需要使用 @
符号来引用函数句柄。修改后的完整代码如下:
a = xlsread("quanguo");
plot(a, "\*-");
y = a(:, 2);
t = 1:154;
b = nlinfit(t, y, @quanguo, [0.3, 100000, 1]);
function y = quanguo(b, t)
global y0 %b(1):固有增长率;b(2):最大值;b(3):初始值
y = b(2) ./ (1 + b(2) / b(3) - 1) .* exp(-b(1) .* t);
end
注意,在函数 quanguo
中未使用到全局变量 y0
,您可能需要进一步检查文件中的代码。
参考:https://blog.csdn.net/weixin_42943114/article/details/116803379