Source code for openmdao.examples.cokriging_forrester

"""
Cokriging example from [Forrester 2007] to show
MultiFiMetaModel and MultiFiCoKrigingSurrogate usage
"""

import numpy as np

from openmdao.api import Component, Group, Problem, MultiFiMetaModel, MultiFiCoKrigingSurrogate, KrigingSurrogate

[docs]def model_hifi(x): return ((6*x-2)**2)*np.sin((6*x-2)*2)
[docs]def model_lofi(x): return 0.5*((6*x-2)**2)*np.sin((6*x-2)*2)+(x-0.5)*10. - 5
[docs]class Simulation(Group): def __init__(self, surrogate, nfi): super(Simulation, self).__init__() self.surrogate = surrogate mm = self.add("mm", MultiFiMetaModel(nfi=nfi)) mm.add_param('x', val=0.) mm.add_output('f_x', val=(0.,0.), surrogate=surrogate)
if __name__ == "__main__": # Co-kriging with 2 levels of fidelity surrogate = MultiFiCoKrigingSurrogate() pbcok = Problem(Simulation(surrogate, nfi=2)) pbcok.setup(check=False) doe_e = [0.0, 0.4, 0.6, 1.0] doe_c = [0.1, 0.2, 0.3, 0.5, 0.7, 0.8, 0.9] + doe_e pbcok['mm.train:x'] = np.array(doe_e).reshape(len(doe_e),1) pbcok['mm.train:x_fi2'] = np.array(doe_c).reshape(len(doe_c),1) pbcok['mm.train:f_x'] = model_hifi(pbcok['mm.train:x']) pbcok['mm.train:f_x_fi2'] = model_lofi(pbcok['mm.train:x_fi2']) # train pbcok.run() ngrid = 100 pred_cok = [] inputs = np.linspace(0, 1, ngrid) for x in inputs: pbcok['mm.x'] = x pbcok.run() pred_cok.append(pbcok['mm.f_x']) pbcok_mu = np.array([float(p[0]) for p in pred_cok]) pbcok_sigma = np.array([float(p[1]) for p in pred_cok]) ## "Co-kriging" with 1 level of fidelity a.k.a. kriging surrogate = MultiFiCoKrigingSurrogate() ## Kriging from openmdao #surrogate = KrigingSurrogate() pbk = Problem(Simulation(surrogate, nfi=1)) pbk.setup() pbk['mm.train:x'] = np.array(doe_e).reshape(len(doe_e),1) pbk['mm.train:f_x'] = model_hifi(pbk['mm.train:x']) pbk.run() # train ngrid = 100 pred_k = [] inputs = np.linspace(0, 1, ngrid) for x in inputs: pbk['mm.x'] = x pbk.run() pred_k.append(pbk['mm.f_x']) pbk_mu = np.array([float(p[0]) for p in pred_k]) pbk_sigma = np.array([float(p[1]) for p in pred_k]) check = inputs actual = model_hifi(inputs) import pylab as plt plt.figure(2) plt.plot(check, actual, 'k', label='True f') plt.plot(doe_e, model_hifi(np.array(doe_e)),'ok',label="High Fi") plt.plot(doe_c, model_lofi(np.array(doe_c)),'or',label="Low Fi") plt.plot(check, pbcok_mu, 'g', label='Co-kriging') plt.plot(check, pbcok_mu + 2*pbcok_sigma, 'g', alpha=0.5, label='I95%') plt.plot(check, pbcok_mu - 2*pbcok_sigma, 'g', alpha=0.5) plt.fill_between(check, pbcok_mu + 2*pbcok_sigma, pbcok_mu - 2*pbcok_sigma, facecolor='g', alpha=0.2) plt.plot(check, pbk_mu, 'b', label='Kriging') plt.plot(check, pbk_mu + 2*pbk_sigma, 'b', alpha=0.5, label='I95%') plt.plot(check, pbk_mu - 2*pbk_sigma, 'b', alpha=0.5) plt.fill_between(check, pbk_mu + 2*pbk_sigma, pbk_mu - 2*pbk_sigma, facecolor='b', alpha=0.2) plt.legend(loc='best') plt.show() # RMSE CoKriging error = 0. for a,p in zip(actual, pbcok_mu): error += (a-p)**2 error = (error/len(actual)) print("RMSE Cokriging = %g" % error) # RMSE Kriging error = 0. for a,p in zip(actual, pbk_mu): error += (a-p)**2 error = (error/len(actual)) print("RMSE Kriging = %g" % error)