MATLAB:将实验数据拟合到ODE模型,并执行优化(动力学建模)

MATLAB:将实验数据拟合到ODE模型,并执行优化(动力学建模),matlab,optimization,model,Matlab,Optimization,Model,我有实验数据(浓度与时间),我有一组ODE作为模型来拟合它们,给出未知参数(k) 但是,我有一条错误消息:“无法执行赋值,因为左侧的大小是1乘1,右侧的大小是1乘9。”,我检查了它,它属于opt函数 还有,我的颂歌没有解决方案 致以最良好的祝愿 global td cd ci ki T = readtable('experimental_data.xlsx','Sheet',2); T1= T.Variables; td= T1(:,1); %experimet time cd= [T1(:,4

我有实验数据(浓度与时间),我有一组ODE作为模型来拟合它们,给出未知参数(k)

但是,我有一条错误消息:“无法执行赋值,因为左侧的大小是1乘1,右侧的大小是1乘9。”,我检查了它,它属于opt函数

还有,我的颂歌没有解决方案

致以最良好的祝愿

global td cd ci ki
T = readtable('experimental_data.xlsx','Sheet',2);
T1= T.Variables;
td= T1(:,1); %experimet time
cd= [T1(:,4), T1(:,3),zeros(9,1),T1(:,2),T1(:,5),zeros(9,1),T1(:,6),T1(:,7),T1(:,8)]; %species concentration
ci= [0.136 0.193 0 0.271 0 0 0 0 0]';   %initial concentration
ki= [1 1 1 1 1 1 1 1 1 1]';             %initial k guess
opt = fminsearch(@(k) optim(td,cd,k,ci), ki);   %optimization function (ERROR)
function dc = diff(k,t,C)
r1= (-k(1)* C(1))/(1+ k(10) * C(5));   
r2= (k(1) * C(1) - k(2) * C(2))/(1+ k(10) * C(5));
r3= (k(2) * C(2) - k(3) * C(3))/(1+ k(10) * C(5));
r4= (k(3) * C(3) - k(3) * C(3))/(1+ k(10) * C(5));
r5= (k(4) * C(4) - k(5) * C(5) -k(6)*C(5))/(1+ k(10) * C(5));
r6= (k(6) * C(5) - k(7) * C(6) -k(8)*C(6))/(1+ k(10) * C(5));
r7= (k(8) * C(6) - k(9) * C(7))/(1+ k(10) * C(5));
r8= (k(5) * C(5) + k(7) * C(6))/(1+ k(10) * C(5));
r9= (k(9) * C(7))/(1+ k(10) * C(5));
dc = [r1;r2;r3;r4;r5;r6;r7;r8;r9];
end
function SSE = optim(td,cd,k,ci)
     global td cd ci
         f = @(t,C) diff(k,t,C);
         [tm, cm] = ode45(f, td, ci);  %cm is the concentration predicted by the model
         err = cd - cm;
         SSE = sum(err.^2);   %sum squared-error.
end

这应该是一个简单的调试错误。在发生错误的那一行,您正试图将1x9数组赋给一个大小为1x1的变量。因此,您在等号左侧或右侧的索引不正确,因为对象的大小不同。@David谢谢您的评论,这是我的第一个优化问题,请详细说明您的解决方案好吗?还有,我没有一个解决我的ODE的方案?你需要调试你的代码来理解错误。查看导致错误的线路上左右两侧的实际值,应该可以清楚地看出它不起作用的原因。