MATLAB: Подгонка экспериментальных данных к модели ODE и выполнение оптимизации (моделирование Kineti c) - PullRequest
0 голосов
/ 03 марта 2020

У меня есть экспериментальные данные (концентрация в зависимости от времени), и у меня есть набор ODE в качестве модели, чтобы подогнать их под неизвестные параметры (k).

Однако у меня есть это сообщение об ошибке: «Невозможно выполнить назначение, потому что размер левой стороны 1 на 1, а размер правой стороны 1 на 9». Я проверил, и он принадлежал функции opt.

Также , У меня нет решения для моих ODE?!

С уважением,

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...