-
Notifications
You must be signed in to change notification settings - Fork 2
/
model_fd.m
137 lines (115 loc) · 4.56 KB
/
model_fd.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
classdef model_fd < model
% MODEL_FD implements the model interface and provides the first and second derivatives with respect to the parameters by finite differences approximations.
%
% MODEL_FD Methods:
% GET_M - returns the result of the model function with
% model parameters P and experimental design X.
% GET_DP_M - returns the first derivative of the model function with
% model parameters P and experimental design X.
% GET_DPDP_M - returns the second derivative of the model function with
% model parameters P and experimental design X.
%
% see also MODEL
%
%{
---------------------------------------------------------------------------
Copyright (C) 2010-2017 Joscha Reimer jor@informatik.uni-kiel.de
This file is part of the Optimal Experimental Design Toolbox.
The Optimal Experimental Design Toolbox is free software: you can redistribute
it and/or modify it under the terms of the GNU General Public License
as published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
The Optimal Experimental Design Toolbox is distributed in the hope that it will
be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with the Optimal Experimental Design Toolbox. If not, see
<http://www.gnu.org/licenses/>.
---------------------------------------------------------------------------
%}
properties (Access = protected)
f = [];
p = [];
x = [];
dp_M = [];
dpdp_M = [];
end
methods (Access = public)
function this = model_fd(f)
% MODEL_FD creates a MODEL_FD object.
%
% Example:
% OBJ = MODEL_FD(F)
%
% Input:
% F: the function to vcalculate the model output
%
% Output:
% OBJ: a MODEL_FD object with the passed configurations
%
this.f = f;
end
function M = get_M(this, p, x)
% GET_M returns the result of the model function with model parameters P and experimental design X.
%
% Example:
% M = MODEL_OBJECT.GET_M(P, X)
%
% Input:
% P: the model parameter values
% X: the experimental design values
%
% Output:
% M: the result of the model function with model parameters P and experimental design X
%
M = this.f(p, x);
end
function dp_M = get_dp_M(this, p, x)
% GET_DP_M returns the first derivative of the model function with model parameters P and experimental design X.
%
% Example:
% M = MODEL_OBJECT.GET_DP_M(P, X)
%
% Input:
% P: the model parameter values
% X: the experimental design values
%
% Output:
% M: the first derivative of the model function with model parameters P and experimental design X
%
if ~ isequal(this.p, p) || ~ isequal(this.x, x) || isempty(this.dp_M)
dp_M = util.approximate_Jacobian(@(p) (this.get_M(p, x)), p);
this.dp_M = dp_M;
this.p = p;
this.x = x;
else
dp_M = this.dp_M;
end
end
function dpdp_M = get_dpdp_M(this, p, x)
% GET_DPDP_M returns the second derivative of the model function with model parameters P and experimental design X.
%
% Example:
% M = MODEL_OBJECT.GET_DPDP_M(P, X)
%
% Input:
% P: the model parameter values
% X: the experimental design values
%
% Output:
% M: the second derivative of the model function with model parameters P and experimental design X
%
if ~ isequal(this.p, p) || ~ isequal(this.x, x) || isempty(this.dpdp_M)
dp_M = this.get_dp_M(p, x);
dpdp_M = util.approximate_Hessian(@(p) (this.get_M(p, x)), p, dp_M);
this.dp_M = dp_M;
this.dpdp_M = dpdp_M;
this.p = p;
this.x = x;
else
dpdp_M = this.dpdp_M;
end
end
end
end