Part 2
Parameter fitting for ODEs using fmincon function
Example by Xueyang Feng: Nov 16th
X = FMINCON(FUN,X0,A,B,Aeq,Beq) minimizes FUN subject to the linear equalities Aeq*X = Beq as well as A*X <= B. (Set A=[] and B=[] if no inequalities exist.)
4/12/2020 1
Inverse problem
Unlike forward problems, inverse problems require experimental data, and an
iterative solution. Because inverse problems require solving the forward problem numerous time, the ode45 solver will be nested within a nonlinear regression routine called “nlinfit.”
The syntax is: [param, r, J, COVB, mse] = nlinfit(X, y, fun, beta0); returns the fitted coefficients param, the residuals r, the Jacobian J of function fun, the estimated covariance matrix COVB for the fitted coefficients, and an estimate MSE of the variance of the error term.
X is a matrix of n rows of the independent variable y is n-by-1 vector of the observed data fun is a function handle to a separate m-file to a function of this form: yhat = fun(b,X) where yhat is an n-by-1 vector of the predicted responses, and b is a vector of the parameter values. beta0 is the initial guesses of the parameters.
120 ypred yobs Example 1: Model fitting ODE equation dy
k
y dt
100
80
60
40
Based on experimental data, find y 0 and k .
20 data =xlsread('exp_data.xls'); %read data from excel yo=100; k=0.6; beta0(1)=yo; beta0(2)=k;
0
-20
0 1 x=data(:,1); yobs=data(:,2);
[param,resids,J,COVB,mse] = nlinfit(x,yobs,'forderinv',beta0);
2 3 4 5 time (min)
6 rmse=sqrt(mse); %root mean square error = SS/(n-p)
%R is the correlation matrix for the parameters, sigma is the standard error vector
[R,sigma]=corrcov(COVB);
%confidence intervals for parameters ci=nlparci(param,resids,J);
7
%computed Cpredicted by solving ode45 once with the estimated parameters ypred=forderinv(param,x);
%mean of the residuals meanr=mean(resids);
8 9 10
figure hold on h1(1)=plot(x,ypred,'-','linewidth',3); %predicted y values h1(2)=plot(x,yobs,'square', 'Markerfacecolor', 'r'); legend(h1,'ypred','yobs') xlabel('time (min)') ylabel('y')
Function with ode45
%residual scatter plot figure hold on plot(x, resids, 'square','Markerfacecolor', 'b');
YLine = [0 0];
XLine = [0 max(x)]; plot (XLine, YLine,'R'); %plot a straight red line at zero ylabel('Observed y - Predicted y') xlabel('time (min)‘) function y = forderinv(param,t)
%first-order reaction equation tspan=t; %we want y at every t
[t,y]=ode45(@ff, tspan, param(1));
%param(1) is y(0) function dy = ff(t, y) %function that computes the dydt dy(1)= -param(2)*y(1); end end
120
100
80
60
40
20 ypred yobs
0
-20
0 1 2 3 4 5 time (min)
6 7 8 9 10
15
10
5
0
-5
-10
-15
0 1 2 3 4 5 time (min)
6 7 8 9 10
2.929293
3.232323
3.333333
3.434343
3.535354
3.939394
4.040404
4.343434
4.444444
4.545455
4.646465
4.747475
4.848485
4.949495
Time y
0
0.10101
0.20202
107.2637
102.9394
92.71275
0.909091
1.010101
1.111111
1.212121
1.313131
75.15614
70.4741
69.83605
57.00548
60.03961
1.616162
1.717172
1.818182
1.919192
2.020202
2.121212
2.525253
2.626263
2.727273
2.828283
54.01795
56.79646
53.81866
49.67512
42.0459
40.42633
41.06735
39.48581
34.28254
30.3689
31.69877
25.20435
27.20177
19.71342
26.31708
23.20818
15.5449
19.08923
16.08262
19.26572
23.76179
11.85451
7.628606
7.998508
Raw data File name: exp_data.xls
Time y
5.050505
8.541471
5.454545
5.555556
5.656566
12.46344
6.944696
15.90549
5.757576
5.858586
5.959596
6.060606
6.161616
5.717727
9.637526
4.531673
5.446719
7.203193
6.262626
6.666667
6.767677
6.868687
6.969697
7.070707
417395
7.575758
7.676768
7.777778
8.181818
8.282828
8.383838
8.484848
8.888889
8.989899
9.090909
9.191919
7.02317
16.22408
5.286706
11.7421
-4.34103
9.103846
9.998128
6.737791
7.460489
4.723043
8.394924
-0.45654
9.292929
9.393939
9.494949
9.59596
9.69697
10
0.910225
7.662295
-0.04558
2.102022
1.454657
4.797709
9.16223
-5.94742
12.27148
5.956534
3.329466
S
15
10
X
P
5
0
0 5 10 time (min)
15 20 25
Y p/s
=Y x/s
*Y p/x
/ s
8.1
14
20.5
24.1
t
0
2.7
5.4
X
File name: HW217.xls
P S
0.05
0 15
0.082555
0.019533
14.86978
0.136259
0.051755
14.65496
0.224763
0.104858
14.30095
0.667768
0.370661
12.52893
2.151108
1.260665
6.595568
3.652464
2.161478
0.590144
Fitting four parameters
Script clear all %clear all variables global y0 data =xlsread('HW217.xls');
%initial conditions y0=[0.05 0 15];
%initial guess
Umax=0.1; Ks=10; Ypx=0.11; Yxs=0.45; beta0(1)=Umax; beta0(2)=Ks; beta0(3)=Ypx; beta0(4)=Yxs;
%Measured data x=data(:,1); yobsX=data(:,2); yobsP=data(:,3); yobsS=data(:,4); yobs=[yobsX; yobsP; yobsS];
%nlinfit returns parameters, residuals, Jacobian (sensitivity coefficient matrix),
%covariance matrix, and mean square error. ode45 is solved many times
%iteratively
[param,resids,J,COVB,mse] = nlinfit(x, yobs,'forderinv2', beta0);
Script rmse=sqrt(mse); %root mean square error = SS/(n-p) n=size(x); nn=n(1);
%confidence intervals for parameters ci=nlparci(param,resids,J);
%computed Cpredicted by solving ode45 once with the estimated parameters ypred=forderinv2(param,x); ypredX=ypred(1:nn); ypredP=ypred(nn+1:2*nn); ypredS=ypred(2*nn+1:3*nn);
%mean of the residuals meanr=mean(resids);
Script figure hold on plot(x, ypredX, x, ypredP, x, ypredS); %predicted y values plot(x, yobsX, 'r+', x, yobsP, 'ro', x, yobsS, 'rx'); xlabel('time (min)') ylabel('y')
%residual scatter plot x3=[x; x; x]; figure hold on plot(x3, resids, 'square', 'Markerfacecolor', 'b');
YLine = [0 0];
XLine = [0 max(x)]; plot (XLine, YLine,'R'); %plot a straight red line at zero ylabel('Observed y - Predicted y') xlabel('time (min)‘)
Function and sub-function function y = forderinv2(param,t)
%first-order reaction equation global y0; tspan=t; %we want y at every t
[t,y]=ode45(@ff,tspan,y0); %param(1) is y(0) function dy = ff(t,y) %function that computes the dydt dy(1)= param(1)*y(3)/(param(2)+y(3))*y(1); %biomass dy(2)= param(1)*param(3)*y(3)/(param(2)+y(3))*y(1); %product dy(3)= -1/param(4)*dy(1)-1/(param(3)*param(4))*dy(2); %substrate dy=dy'; end
% after the ode45, rearrange the n-by-3 y matrix into a 3n-by-1 matrix
% and send that back to nlinfit. y1=y(:,1); y2=y(:,2); y3=y(:,3); y=[y1; y2; y3]; end
Basic elements
Blocks
Blocks: generate, modify, combine, and display signals
Typical blocks
Continuous: Linear, continuous-time system elements (integrators, transfer functions, state-space models, etc.)
Discrete: Linear, discrete-time system elements (integrators, transfer functions, state-space models, etc.)
Functions & Tables: User-defined functions and tables for interpolating function values
Math: Mathematical operators (sum, gain, dot product, etc.)
Nonlinear: Nonlinear operators (coulomb/viscous friction, switches, relays, etc.)
Signals: Blocks for controlling/monitoring signals
Sinks: Used to output or display signals (displays, scopes, graphs, etc.)
Sources: Used to generate various signals (step, ramp, sinusoidal, etc.)
Lines
transfer signals from one block to another
3. Simulink
Type “simulink” in the command window
The graphic interfaces
Matlab
Simulink
Tutorial example x = sin (t)
4/12/2020 simout
Simulink example 2
Creep compliance of a wheat protein film
Using formaldehyde cross-linker
Creep compliance of a wheat protein film (determination of retardation time and free dashpot viscosity in the Jefferys model)
J
J
1
( 1
exp(
t
ret
))
t
0
Where J is the strain, J
1 retardation time (s); µ
0 is the retarded compliance (Pa -1 ); λ ret
=µ
1
/G
1 is is the free dashpot viscosity (Pa s); t is the time.
The recovery of the compliance is following the equation (t >t
1
):
J
J
1 exp(
t
ret t
1 )
Where t1 is the time the stress was released.
4. Simulink examples
Creep compliance of a wheat protein film
Simulink model
Parameters: J
1
= a = 0.38 Mpa -1 ; λ ret
= b = 510.6 s; µ
0
= c = 260800 Mpa s
J
J
1
( 1
exp(
ret t
))
t
0
J
J
1 exp(
t
ret t
1 )
4. Simulink examples
Creep compliance of a wheat protein film
Simulation result
Regular fermenter
Agitation
4. Simulink example
Fermentation system
Ethanol fermenter
Heater
Products
Biomass
Heater
Ethanol
Biomass
Aeration
4. Simulink examples
Growth kinetics
Ethanol production kinetics f ( s , p )
K
S max
s s
( 1
p p max
)
dx
r x dt
x
K
S max
s s
( 1
p p max
)
x
Substance consumption dC
S dt
r
S
[
Y
XS
m
S
] x
[
Y
XS
max
( K
S s
s )
( 1
p p max
)
m
S
] x
Product production dC
P dt
r
P
[ Y
PX
m
P
] x
[ Y
PX
K
S max
s s
( 1
p p max
)
m
P
] x
Where: η is the toxic power, Pmax is the maximum product concentration at which the growth is completely inhibited
4. Simulink examples a. Using blocks to construct the model
Using S-function to construct the model (you may also writing the programs for simulink function)
4/12/2020 21
The maximizing or minimizing of a given function subject to some type of constraints.
Make your processes as effective as possible
c) Introduction to Optimization
Example 1 (fminsearch)
To find the minimum of a multidimensional function in [-1.2, 1]: f ( x )
100 ( x
2
x
1
2
)
2
( 1
x
1
)
2
The plot of the function can be generated by the following code:
[x, y]=meshgrid ([-2:0.1:2]); z=100*(y-x.^2).^2+(1-x).^2; mesh(x, y, z); grid on
The function of ex2c is written as follow: function f=ex2c(x) f=100*(x(2)-x(1)^2)^2+(1-x(1))^2;
The function of ex2cMinimum is written as follow: function ex2cMinimum fminsearch(@ex2c, [-1.2,1]); clear clc
[x, y]=meshgrid ([-2:0.1:2]); z=100*(y-x.^2).^2+(1-x).^2; mesh(x, y, z); grid on a=fminsearch(@ex2c, [-1.2,1]); x=a(1) y=a(2) z=100*(y-x.^2).^2+(1-x).^2
%===========================================
% Michaelis & Menten Model Fit.
% File name "SimpleMMplot.m".
%===========================================
Using fmin for curve fitting clear clf global S V;
% experiemntal data
S=[0 1 2 3 4 5 6 7 8];
V=[0 0.08 0.15 0.18 0.2 0.21 0.215 0.216 0.216]; v0=[1; 1]; a=fminsearch('two_var',v0); %least square errors
Km=a(1);
Vmax=a(2);
Vmodel=Vmax*S./(Km+S); plot(S,V,'ro', S, Vmodel) xlabel('Concentrations') ylabel('rate') legend('Data','Predict') global S V;
V
V max
K m
function sumsqe= two_var(aa)
Km =aa(1); Vmax =aa(2);
Vmodel=Vmax*S./(Km+S); err=V-Vmodel; err2=err.*err; sumsqe=sum(err2); return
X = FMINCON(FUN, X0, A, B, Aeq, Beq, LB, UB ) minimizes
FUN subject to the linear equalities Aeq*X = Beq as well as
A*X <= B. (Set A=[] and B=[] if no inequalities exist.)
Use fmincon for optimization
FMINCON attempts to solve problems of the form: min F(X) subject to: A*X <= B, Aeq*X = Beq (linear constraints)
C(X) <= 0, Ceq(X) = 0 (nonlinear constraints)
LB <= X <= UB (bounds)
%file name example1 clc;close all;clear all; int_guess=[10;10;10];% INITIAL GUESS FOR U'S
A=[-1 -2 -2;1 2 2]; % equality constraints
B=[0 72];
[u]=fmincon(@eg_1, int_guess, A, B) % CALL FOR OPTIMIZER
%file name eg_1.m
function [err]=eg_1(u) x1=u(1); x2=u(2); x3=u(3); err=-x1*x2*x3;
Example 4 (dynamic optimization)
A B C
Find the temperature, at which the product B is maximum
Mathematical Representation of the system is as :
clc;close all;clear all; warning off int_guess=300;% INITIAL GUESS FOR U'S
LB=298; % LOWER BOUND OF U
UB=398;% UPPER BOUND ON U
[u, FVAL ]=fmincon(@reactor_problem,int_guess,[],[],[],[],LB,UB,[]); %
CALL FOR OPTIMIZER PROBABLY NOT TO CHANGE BE USER
[err]=reactor_problem(u); load data_for_system plot(t,Y(:,1),'k') hold on plot(t,Y(:,2),'m') legend('opt c_A','opt c_B') u
T=335.3244
FVAL = -0.6058
0.5
0.4
0.3
0.2
0.1
0
0
1
0.9
0.8
0.7
0.6
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
opt c
A opt c
B
1
function [err]=reactor_problem(u)
A=[1 0]; %initial condition
[t,Y]=ode15s(@reactor_ODE,[0 1], A,[],u); %tspan=1 err= Y(end,2); %make the maximum B save data_for_system t Y %just for plotting
ODE calculation function [YPRIME]=reactor_ODE(t,x,u)
YPRIME=zeros(2,1);
T=u; k1=4000*exp(-2500/T); k2=620000*exp(-5000/T);
YPRIME(1)=-k1*(x(1))^2;
YPRIME(2)=(k1*x(1)^2)-k2*x(2);
4/12/2020
30
Many biological systems are dynamic and heterogeneous! Therefore, structured and segregated models have to be used.
• Ordinary Differential Equation (ODE): The dependent variable is a function of only one independent variable.
• Partial Differential Equation (PDE): The dependent variable is a function of more than one dependent variable.
•
Boundary-value problems are those where space conditions are not known; Initial-value problems are those dynamic condition are not known.
Boundary-value problems
• Dirichlet boundary conditions are those where a fixed value of a variable is known at a particular location.
• Neumann boundary conditions are those where a derivative is known at a particular location.
Finite-Difference Methods are often used to solve boundary-value problems.
In these techniques, finite differences are substituted for the derivatives in the original equation, transforming a linear differential equation into a set of simultaneous algebraic equations.
Final equation
4/12/2020
Oil transport and degradation in the porous sediment
35
How to solve PDEs using the finite difference method?
C b
t
( 1
)
D m
s
K
P
[
2
r
C
2 b
1 r
C b
r
2 C b
Z
2
]
K s
[( 1
) r max
s
K
C
P b
]
C b
C i , j
Z
C i , j
1
C i , j
1
2 h
Z
The change of
Contaminant concentrations in the porous environment
2
C i , j
Z
2
C i , j
1
2 C i , j h
Z
2
C i , j
1
2
C i , j
r
2
C i
1 , j
2 C i , j h r
2
C i
1 , j a: one injection unit
Find the time and space dependent change of C i,j
C i , j
r
C i
1 , j
2 h r
C i
1 , j
C i ,
t j f ( r , Z , C i , j
)
function ydot=rhs2d2(t, y) global dx D ii jj Km Vmax for j=1:jj for i=1:ii vv=vv+1; yy(i,j) = y(vv); end end for j=2:jj-1 for i=2:ii-1
Sample codes for PDE problem.
R=-Vmax*yy(i,j)/(Km+yy(i,j));
Dffu1=(yy(i+1,j)-2*yy(i,j)+yy(i-1,j))/(dx*dx);
Dffu2=(1/(dx*(i-1)))*(yy(i+1,j)-yy(i-1,j))/2/dx;
Dffu3=(yy(i,j+1)-2*yy(i,j)+yy(i,j-1))/(dx*dx); dot(i,j) = D*(Dffu1+Dffu2+Dffu3)+R; bb = ii*(j-1)+i; ydot(bb) = dot(i,j); end end ydot=ydot';
You can change
PDE problem to many mini ODE problem, then you solve them at the same time.
4/12/2020
The spherical catalysts are exposed to reactants at the initial time point. Given the information about the diffusion coefficient De, reaction rate, etc., we want to know the reactant concentration profile. (We assume that the reactant concentration in the catalyst is only a function of time and distance to the center for simplicity. )
R
•
PDE
Dimensionless form
Initial condition u (0, x )=0
Boundary conditions u ( t , 1)=S surf Thiele Module
Syntax sol = pdepe(m, @pdefun, @icfun, @bcfun, xmesh, tspan, options) pr=ur-1; function u0=icfun(x) pl=0; f=φ^(-2)*DuDx; end end
Main script clc; clear all; x=0:0.02:1; %radius range t=0:0.04:8; %timespan u=pdepe(2,@pdefun,@icfun,@bcfun,x,t);%m=2
%Show the concentration profile as a function of time for k=1:length(t) plot(x,u(k,:),'linewidth',2); xlabel('distance from the center'); ylabel('substrate concentration'); pause(.2) end figure(2)
%3D plot mesh(x,t,u); xlabel('x'); ylabel('t'); zlabel('u'); axis([0 1 0 8 0 1]);
Three Functions function [pl, ql, pr, qr]=bcfun(xl, ul, xr, ur, t) pr=ur-1; qr=0; pl=0; ql=1; end function u0=icfun(x) u0=0; end function[c,f,s]=pdefun(x,t,u,DuDx)
De=3*10^-4;
Ss=1*10^-4;
Km=0.1*Ss;
R=0.001; umax=0.5;
Mt=R*sqrt(umax/Km/De); beta=Km/Ss; c=1; f=Mt^(-2)*DuDx; s=-u/(1+u/beta); end
2
3
#
1
Species
H
2
O
CO
2
CO
CH
4
H
2 sum
Reaction
C+2H
2
O=CO
2
+2H
2
C+CO
2
=2CO
C+2H
2
=CH
4
0
0 n j0
1
0
0
1
Molar Extent
X
1
X
2
X
3 n j
1-2X
1
X
1
-X
2
2X
2
X
3
2(X
1
-X
3
)
1+X
1
+X
2
-X
3
You can use MATLAB tool-fsolve to solve the problem
clear all; clc;
%initial guess of molar extent x0=[0.3 0.3 0.3];
%set the intial values
T=600;
%creat different vectors for recording temperature, molar extent and molar
%fraction t=zeros(101,1); X=zeros(101,3); yH2O=zeros(101,1); yCO2=zeros(101,1); yCO=zeros(101,1); yCH4=zeros(101,1); yH2=zeros(101,1); for i=1:101
%find the solution
[x,fval] = fsolve(@nlfunc,x0,[],T);
%record the results t(i)=T; X(i,:)=x;
%caculate the molar fraction of each species yH2O(i)=(1-2*x(1))/(1+x(1)+x(2)-x(3)); yCO2(i)=(x(1)-x(2))/(1+x(1)+x(2)-x(3)); yCO(i)=2*x(2)/(1+x(1)+x(2)-x(3)); yCH4(i)=x(3)/(1+x(1)+x(2)-x(3)); yH2(i)=2*(x(1)-x(3))/(1+x(1)+x(2)-x(3));
%change values for the next loops
T=T+10; end
%plotting subplot(2,2,[1 3]); plot(t,X(:,1),'o',t,X(:,2),'*',t,X(:,3),'.'); legend('C+H_2O=>CO_2+2H_2','C+CO_2=>2CO','C+2H_2=>CH_4'); xlabel('Temperature (K)'); ylabel('molar extent'); axis([600 1600 0 0.6]); subplot(2,2,[2 4]); plot(t,yH2O,'o',t,yCO2,'-o',t,yCO,'.',t,yCH4,'*',t,yH2,'^'); legend('H_2O','CO_2','CO','CH_4','H_2'); xlabel('Temperature (K)'); ylabel('molar fraction'); axis([600 1600 0 0.6]);
function F = nlfunc(x,T)
%coefficient values
K1=9.73*10^(-12)*exp(-10835/T+36.36);
K2=9.92*10^(-22)*exp(-20740/T+69.60);
K3=8.00*10^8*exp(8973/T-30.11);
%three column vectors
F=zeros(1,3);
%functions
F(1)=4*(x(1)-x(3))^2*(x(1)-x(2))-K1*(1-2*x(1))^2*(1+x(1)+x(2)-x(3));
F(2)=4*x(2)^2-K2*(x(1)-x(2))*(1+x(1)+x(2)-x(3));
F(3)=x(3)*(1+x(1)+x(2)-x(3))-4*K3*(x(1)-x(3))^2; end