Example7_15_long.m

Construct synthetic data and sampling distribution for the damping parameter C as illustrated in Example 7.15. This code also constructs the density from 10,000 simulations, which is compared with the sampling distribution. Because this requires repeated optimization, the code takes approximately 40 seconds to run.

Required functions: spring_function.m ksdensity.m

  clear all
  close all

Specify true parameter and measurement variance values.

  m = 1;
  k = 20.5;
  c = 1.5;
  sigma = .1;
  var = sigma^2;

Construct synthetic data, the sensitivity matrix, and covariance matrix V.

  num = sqrt(4*m*k - c^2);
  den = 2*m;

  t = 0:.01:5;
  error = sigma*randn(size(t));
  n = length(t);

  y = 2*exp((-c/den)*t).*cos((num/den)*t);
  dydc = -(t/m).*exp((-c/den)*t).*cos((num/den)*t) + (c*t/(m*num)).*exp((-c/den)*t).*sin((num/den)*t);
  V = inv(dydc*dydc')*var;
  obs = y + error;

Plot the model response, synthetic data, and residuals. One notes in the residual plot that the 2 sigma interval contains approximately 95% of the residuals.

  figure(1)
  plot(t,y,'k','linewidth',2)
  hold on
  plot(t,obs,'x','linewidth',1)
  plot(t,0*y,'k','linewidth',2)
  hold off
  set(gca,'Fontsize',[20]);
  legend('Model','Synthetic Data','Location','NorthEast')
  xlabel('Time (s)')
  ylabel('Displacement')

  figure(2)
  plot(t,error,'x',t,0*y,'k','linewidth',2)
  hold on
  plot(t,2*sigma*ones(size(t)),'--r',t,-2*sigma*ones(size(t)),'--r','linewidth',2)
  hold off
  set(gca,'Fontsize',[20]);
  xlabel('Time (s)')
  ylabel('Residuals')

Construct sampling distribution and determine optimal value of C using the routine fminsearch.m for this data. We additionally compute the confidence interval.

  C = [1.4:.001:1.6];
  sample_dist = normpdf(C,1.5,sqrt(V));

  modelfun = @(c) spring_function(c,m,k,obs,t);
  [c_opt,fval] = fminsearch(modelfun,c);

  c_opt
  conf_int = [c_opt - 1.96*sqrt(V) c_opt + 1.96*sqrt(V)]
c_opt =

    1.4512


conf_int =

    1.4154    1.4871

Construct the density by repeated sampling. The final KDE is performed using ksdensity. The variable count compiles the number of 95% confidence intervals that contain the true parameter value.

  count = 0;
  for j = 1:10000
    error = sigma*randn(size(t));
    y = 2*exp((-c/den)*t).*cos((num/den)*t);
    obs = y + error;
    modelfun = @(c) spring_function(c,m,k,obs,t);
    [c_opt,fval] = fminsearch(modelfun,c);
    c_lower = c_opt - 1.96*sqrt(V);
    c_upper = c_opt + 1.96*sqrt(V);
    if (c_lower <= c) & (c <= c_upper)
      count = count + 1;
    end
    Cvals(j) = c_opt;
  end
  count

  [density_C,Cmesh] = ksdensity(Cvals);
count =

        9510

Plot the sampling distribution and constructed density computed by generating data and optimizing 10,000 times.

  ylabel('Residuals')

  figure(3)
  plot(Cmesh,density_C,'k--','linewidth',3)
  axis([1.4 1.6 0 25])
  hold on
  plot(C,sample_dist,'linewidth',3)
  set(gca,'Fontsize',[22]);
  xlabel('Optimal C')
  ylabel('Density')
  legend('Constructed Density','Sampling Density','Location','NorthEast')