forward: The forward model:

The specification of the prior and data is intended to be generic, applicable to any inverse problem considered. The forward problem, on the other hand, is typically specific for each different inverse problem.

In order to make use of SIPPI to sample the posterior distribution of an inverse problem, the solution to the forward problem must be embedded in a Matlab function with the following input and output arguments:

[d,forward,prior,data]=sippi_forward(m,forward,prior,data,id)

m is a realization of the prior model, and prior and data are the Matlab structures defining the prior and the noise model (see Prior and Data)

id is optional, and can be used to compute the forward response of a subset of the different types of data available (i.e. data{1}, data{2},… )

The forward variable is a Matlab structure that can contain any information needed to solve the forward problem. Thus, the parameters for the forward structure is problem dependent. One option, forward.forward_function is though generic, and point to the m-file that implements the forward problem.

The output variable d is a Matlab structure of the same size of data. Thus, if 4 types of data have been specified, then d must also be a structures of size 4.

length(data) == length(d);

Further, d{i} must refer to an array of the same size as data{i}.d_obs.

An example of an implementation of the forward problem related to a simple line fitting problem is:

function [d,forward,prior,data]=sippi_forward_linefit(m,forward,prior,data);
    d{1}=forward.x*m{2}+m{1};

This implementation requires that the ‘x’-locations, for which the y-values of the straight line is to be computed, is specified through forward.x. Say some y-data has been observed at locations x=[1,5,8], with the values [2,4,9], and a standard deviation of 1 specifying the uncertainty, the forward structure must be set as

forward.forward_function='sippi_forward_linefit';
forward.x=[1,5,8];

while the data structure will be

data{1}.d_obs=[2 4 9]
data{1}.d_std=1;

This implementation also requires that the prior model consists of two 1D prior types, such that

m=sippi_prior(prior)

returns the intercept in m{1} and the gradient in m{2}.

An example of computing the forward response using an intercept of 0, and a gradients of 2 is then

m{1}=0;
m{2}=2;
d=sippi_forward(m,forward)

and the corresponding log-likelihood of m, can be computed using

logL=sippi_likelihood(data,d);

[see more details and examples related to polynomial line fitting at polynomial line fitting].

The Examples section contains more example of implementation of different forward problems.

Validating prior, data, and forward

A simple way to test the validity of prior, data, and forward is to test if the following sequence can be evaluated without errors:

% Generate a realization, m, of the prior model
m=sippi_prior(prior);
% Compute the forward response
d=sippi_forward(m,forward,prior,data);
% Evaluate the log-likelihood of m
logL=sippi_likelihood(data,d);