输入参数的数目不足。 出错 @(t,y,beta,gamma)[-beta*y(1)*y(2);beta*y(1)*y(2)-gamma*y(2);gamma*y(2)] 出错 lsqcurvefit (line 222) initVals.F = feval(funfcn_x_xdata{3},xCurrent,XDATA,varargin{:}); 原因: Failure in initial objective function evaluation. LSQCURVEFIT cannot continue.
时间: 2024-02-28 11:56:05 浏览: 50
根据错误信息,估计是在调用 `lsqcurvefit` 函数时出现了错误。可能的原因是传递给 `sir` 函数的参数数目不足。
您需要在 `sir` 函数定义中将参数 `beta` 和 `gamma` 包含进去,如下所示:
```
sir = @(t,y,beta,gamma) [-beta*y(1)*y(2); beta*y(1)*y(2)-gamma*y(2); gamma*y(2)];
```
然后在调用 `lsqcurvefit` 函数时,将 `beta` 和 `gamma` 参数传递给 `sir` 函数,如下所示:
```
params = lsqcurvefit(@(params, t) sir(t, y0, params(1), params(2)), params0, data.t, [data.s; data.i; data.r]);
```
这样应该可以解决问题。
相关问题
错误使用 @(t,y)[-beta*y(1)*y(2)/N+gamma*y(2);beta*y(1)*y(2)/N-gamma*y(2)] 输入参数太多。 出错 @(t,y)f(t,y,beta_func(t),gamma_func(t)) 出错 odearguments (第 92 行) f0 = ode(t0,y0,args{:}); % ODE15I sets args{1} to yp0. 出错 ode45 (第 107 行) odearguments(odeIsFuncHandle,odeTreatAsMFile, solver_name, ode, tspan, y0, options, varargin);
非常抱歉,看来我的代码有些错误。根据报错信息,似乎是因为在ode45函数调用时,传递给f函数的参数过多导致的。这里我修改一下代码,应该可以解决这个问题:
```matlab
% SIS模型的matlab代码
% 初始化参数
N = 1000; % 总人数
I0 = 10; % 初始感染人数
S0 = N - I0; % 初始易感人数
beta = 0.3; % 初始传染率
gamma = 0.1; % 初始治愈率
tspan = [0 100]; % 时间范围
% 定义ODE函数
f = @(t, y, beta, gamma) [-beta*y(1)*y(2)/N + gamma*y(2); beta*y(1)*y(2)/N - gamma*y(2)];
% 定义随时间变化的beta和gamma函数
beta_func = @(t) 0.3 + 0.2*sin(2*pi*t/50); % beta随时间变化
gamma_func = @(t) 0.1 + 0.05*cos(2*pi*t/50); % gamma随时间变化
% 数值求解ODE
[t, y] = ode45(@(t, y) f(t, y, beta_func(t), gamma_func(t)), tspan, [S0; I0]);
% 绘图
plot(t, y(:,1), 'b', t, y(:,2), 'r');
legend('易感人数', '感染人数');
xlabel('时间');
ylabel('人数');
```
在这个代码里,我修改了ODE函数f的定义,在第三个参数位置加入了beta和gamma,这样在ode45函数调用时就可以正确传递参数了。
希望这个修改后的代码能够运行成功!
[num]=xlsread("shiyan7shuju.xlsx"); data.i=num(2:1000,6); data.r=num(2:1000,4); data.s=21893000-data.i-data.r; data.t = 1:length(data.s); % 定义SIR模型微分方程 sir = @(t,y,beta,gamma) [-beta*y(1)*y(2); beta*y(1)*y(2)-gamma*y(2); gamma*y(2)]; % 初始化参数估计 beta0 = 0.5; gamma0 = 0.1; params0 = [beta0,gamma0]; y0 = [data.s(1), data.i(1), data.r(1)]; % 使用最小二乘法来拟合SIR模型 params= [beta,gamma]; params = lsqcurvefit(@(params, t) sir(t, y0, params(1), params(2)), params0, data.t', [data.s ,data.i ,data.r]); beta = params(1); gamma = params(2); disp(['beta = ', num2str(beta)]); disp(['gamma = ', num2str(gamma)]);出现错误,错误原因:输入参数的数目不足。 出错 beta (line 19) y = exp(betaln(z,w));请修改代码
修改后的代码如下:
[num]=xlsread("shiyan7shuju.xlsx");
data.i=num(2:1000,6);
data.r=num(2:1000,4);
data.s=21893000-data.i-data.r;
data.t = 1:length(data.s);
% 定义SIR模型微分方程
sir = @(t,y,beta,gamma) [-beta*y(1)*y(2); beta*y(1)*y(2)-gamma*y(2); gamma*y(2)];
% 初始化参数估计
beta0 = 0.5;
gamma0 = 0.1;
params0 = [beta0,gamma0];
y0 = [data.s(1), data.i(1), data.r(1)];
% 使用最小二乘法来拟合SIR模型
params = lsqcurvefit(@(params, t) sir(t, y0, params(1), params(2)), params0, data.t', [data.s ,data.i ,data.r]);
beta = params(1);
gamma = params(2);
disp(['beta = ', num2str(beta)]);
disp(['gamma = ', num2str(gamma)]);
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)