我有一组耦合的非线性ODE,我需要解决这些ODE,然后使用遗传算法或任何函数估计和优化参数,以便最小化实验数据和模拟数据之间的差异。
我有所有状态变量的所有初始值和要估计的参数的范围(1-10)。我是MATLAB的新手请原谅我是否有任何语法错误。 以下是代码:
function dx = reaction( t,x,k )
dx = zeros(6,1);
dx(1)=0;
dx(2)= k(1)*x(1) - k(2)*x(2) - k(3)*x(5) + k(4)*x(6);
dx(3)=0;
dx(4) = -k(2)*x(3)*x(4) + k(3)*x(5);
dx(5) = k(8)*x(3)*x(4) - k(7)*x(5) - k(3)*x(2)*x(5) + k(5)*x(6);
dx(6) = k(6)*x(2)*x(5) - k(3)*x(6) - k(4)*x(2)*x(6);
end
function objective
k01=1:10;
k02=1:10;
k03=1:10;
k04=1:10;
k05=1:10;
k06=1:10;
k07=1:10;
k08=1:10; %//range of parameters to lie in
exp=[8;0;0.8;12;0;0]; %//experimental data
time=[0;5;10;15;20;25]; %//time span
x01=8;
x02=0;
x03=0.8;
x04=12;
x05=0;
x06=0; %// initial values of state variables
tspan = [min(time),max(time)];
k_opt = fminsearch(@minimize, [k1,k2,k3,k4,k5,k6,k7,k8])
function e = minimize(k1,k2,k3,k4,k5,k6,k7,k8)
sol = ode45(@reaction, tspan, [x01,x02,x03,x04,x05,x06],[], [k1,k2,k3,k4,k5,k6,k7,k8]);
y_hat = deval(sol, time); % // evaluate solution at given times
e = sum((y_hat' - exp).^2); % // compute squarederror
end
% // plot with optimal parameter
[T,X] = ode45(@reaction, tspan, [x01,x02,x03,x04,x05,x06], [], k_opt);
figure
plot(time, exp,'ko', 'markersize',10,'markerfacecolor','black')
hold on
plot(T,Y, 'r--', 'linewidth', 2)
end
答案 0 :(得分:0)
将此视为开始(仍需要一些工作)。这是我能想到的最好的。
你的情节plot(time, exp,'ko', 'markersize',10,'markerfacecolor','black')
对我来说没有意义,因为它会绘制一段时间内的数据,这(指的是你的最新评论)不是exp
应该是什么。这就是我在评论中提出的原因
对我来说,优化会停止,错误大约为139.3828,同时也会对数值积分问题提出一些警告。最佳参数是
k_opt =
-0.2258 6.2298 -1.2666 3.6352 -1.8671 0.0001 2.5592 -2.2011
代码如下:
function main
k0 = ones(1,8);
exp=[8;0;0.8;12;0;0]; %//experimental data
time=[0;5;10;15;20;25]; %//time span
%// initial values of state variables
x01=8;
x02=0;
x03=0.8;
x04=12;
x05=0;
x06=0;
x0 = [x01,x02,x03,x04,x05,x06];
tspan = [min(time),max(time)];
k_opt = fminsearch(@minimize, k0)
function e = minimize(k0)
[t,y_hat] = ode45(@reaction, tspan, x0,[], k0);
% y_hat = deval(sol, time(end)); % // evaluate solution at given times
e = sum((y_hat(end,:)' - exp).^2) % // compute squarederror '
end
% // plot with optimal parameter
[T,Y] = ode45(@reaction, tspan, [x01,x02,x03,x04,x05,x06], [], k_opt);
figure
subplot(1,2,1)
plot(time(end), exp, '*', 'markersize',15)
hold on
plot(T,Y, 'linewidth', 2)
% // Scatter: data vs model
subplot(1,2,2)
scatter(Y(end,:), exp)
hold on
axis equal
grid on
xlabel('model')
ylabel('data')
disp('yay')
end
function dx = reaction(t, x, k)
dx = zeros(6,1);
dx(1)=0;
dx(2)= k(1)*x(1) - k(2)*x(2) - k(3)*x(5) + k(4)*x(6);
dx(3)=0;
dx(4) = -k(2)*x(3)*x(4) + k(3)*x(5);
dx(5) = k(8)*x(3)*x(4) - k(7)*x(5) - k(3)*x(2)*x(5) + k(5)*x(6);
dx(6) = k(6)*x(2)*x(5) - k(3)*x(6) - k(4)*x(2)*x(6);
end
两个结果图。蓝色和红色非常适合,但是,它们在整合时不会改变。我不知道其他人,即你的方程是否正确,实际上可以重现结果。