The input and output variable for each of the analysis cases are define in the problem definition spreadsheet file (Download:Problemdefinitionspreadsheetfile). This definition spreadsheet includes the table with the main cases definition (Table 4.1.1), the table with model input variables (Table 4.1.2) and the table with output variables (Table 4.1.3).
Table 4.1.1 Main cases description for the coupled function tutorial
case
vars sheet
output sheet
samples
sensitivity method
comment
case_0
case_0_vars_sensi
case_out
50.0
DGSM
case_1
case_1_vars_sensi
case_out
50.0
RBD-Fast
Table 4.1.2 Main case input model variables description for the coupled function tutorial
variable
value
min
max
distribution
is_range
cov_un
ud
alias
comment
constrain
comment
X1
1.0
-3.14
3.14
unif
1
0.05
[-]
X1
None
0
var X1
X2
1.0
-3.14
3.14
unif
1
0.05
[-]
X2
None
0
var X2
X3
1.0
-3.14
3.14
unif
1
0.05
[-]
X3
None
0
var X3
X4
1.0
-3.14
3.14
unif
1
0.05
[-]
X4
None
0
var X4
X5
1.0
-3.14
3.14
unif
1
0.05
[-]
X5
None
0
var X5
Table 4.1.3 Main case output model variables description for the coupled function tutorial
variable
value
ud
comment
array
Y
None
m^3
function output
0
The analysis is performed with pymetamodels based on a basic analysis script as follows in test_analysis.py,
Listing 4.1.1 Coupled function test analysis. Sensitivity analysis
1#!/usr/bin/env python3 2 3## Analytical model, 4## 5 6importos,sys,random 7importnumpyasnp 8importgc 9 10importpymetamodels 11importcoupled_function_modelasmodel_obj 12 13classanalysis(object): 14 15""" 16 17 .. _model_coupled_function: 18 19 **Synopsis:** 20 * Analysis framework with pymetamodels 21 22 """ 23 24def__init__(self): 25 26## Initial variables 27self.name="coupled_function" 28self.folder_script=os.path.dirname(os.path.realpath(__file__)) 29 30self.folder_path_inputs=self.folder_script 31 32self.folder_path_outputs=os.path.join(os.path.join(os.path.join(self.folder_script,os.pardir),"_examples_raw"),self.name+"_out") 33ifnotos.path.exists(self.folder_path_outputs):os.makedirs(self.folder_path_outputs) 34 35self.file_name_inputs=r"configuration_spreadsheet" 36self.file_name_outputs=r"outputs" 37 38## Initialise 39self.mita=pymetamodels.load() 40self.mita.logging_start(self.folder_path_outputs) 41 42defrun_model(self): 43 44## Inputs load 45folder_path=self.folder_path_inputs 46file_name=self.file_name_inputs 47self.mita.read_xls_case(folder_path,file_name,sheet="cases",col_start=0,row_start=1,tit_row=0) 48 49## Sampling 50forcaseinself.mita.keys(): 51 52## Run samplimg cases 53self.mita.run_sampling_routine(case) 54 55## Run / Load model 56self.model_iteration(case,model_obj) 57 58## Sensitivity analysis 59self.mita.run_sensitivity_analisis(case) 60#self.mita.print_dict(self.mita.SiY(case)) 61 62## 63self.mita.run_sensitivity_normalization() 64 65## Ploting and others 66forcaseinself.mita.keys(): 67 68## Plot cross varible relation in the sensitivity analysis 69self.mita.output_plts_sensitivity(self.folder_path_outputs,case) 70 71## Output variables save 72folder_path=self.folder_path_outputs 73file_name=self.file_name_outputs 74out_path=self.mita.output_xls(folder_path,file_name,col_start=0,tit_row=0) 75 76defmodel_iteration(self,case,_model_obj): 77 78## Model iteration to generate Y doe output values 79doeX=self.mita.doeX(case) 80doeY=self.mita.doeY(case) 81vars_in=self.mita.vars_parameter_matrix(case) 82case_dict=self.mita.case[case] 83samples=len(doeX[list(doeX.keys())[0]]) 84 85foriiinrange(0,samples): 86 87obj_model=_model_obj.model_obj() 88 89# initialize dictionaries 90obj_model.doeX=doeX 91obj_model.doeY=doeY 92obj_model.case_dict=case_dict 93obj_model.ii=ii 94obj_model.vars_in=vars_in 95 96# add variables as atributes 97forkeyinobj_model.doeX.keys(): 98setattr(obj_model,key,obj_model.doeX[key][obj_model.ii]) 99100# run the model for ii sample101obj_model.run_model()102103if__name__=="__main__":104105analysis=analysis()106107analysis.run_model()
The analysis frameworks iterates the model defined in a secondary file as follows in coupled_function_model.py,
Listing 4.1.2 Coupled function model code block. Sensitivity analysis
The function output_plts_sensitivity() generates several plots showing the DOEX variables correlation and a summary of the sensitivity analysis. For example this can be seen in Fig. 4.1.1 and Fig. 4.1.2. This plot are located in the output folder.
Fig. 4.1.1 Sensitivity bar plot for case_0. Tutorial A01
Fig. 4.1.2 Cross represenation of variable X1 versus X2 in case_0. Tutorial A01
4.2. Tutorial case A02: “Sensitivity analysis of a coupled function, structure of data objects”
Based on the DOE design and sensitivity analysis for a coupled function described in the previous Tutorial case. In this tutorial are described the data object structure. For this purpose the different data object structure is access and printed.
The input and output variable for each of the analysis cases are define in the problem definition spreadsheet file (Download:Problemdefinitionspreadsheetfile). This definition spreadsheet includes the table with the main cases definition (Table 4.1.1), the table with model input variables (Table 4.1.2) and the table with output variables (Table 4.1.3).
Table 4.2.1 Main cases description for the coupled function tutorial data structure
case
vars sheet
output sheet
samples
sensitivity method
comment
case_1
case_1_vars_sensi
case_out
50.0
RBD-Fast
Table 4.2.2 Main case input model variables description for the coupled function tutorial data structure
variable
value
min
max
distribution
is_range
cov_un
ud
alias
comment
constrain
comment
X1
1.0
-3.14
3.14
unif
1
0.05
[-]
X1
None
0
var X1
X2
1.0
-3.14
3.14
unif
1
0.05
[-]
X2
None
0
var X2
X3
1.0
-3.14
3.14
unif
1
0.05
[-]
X3
None
0
var X3
X4
1.0
-3.14
3.14
unif
1
0.05
[-]
X4
None
0
var X4
X5
1.0
-3.14
3.14
unif
1
0.05
[-]
X5
None
0
var X5
Table 4.2.3 Main case output model variables description for the coupled function tutorial data structure
variable
value
ud
comment
array
Y
None
m^3
function output
0
The code to print the data structure objects are described in the script as follows in test_analysis.py,
Listing 4.2.1 Coupled function test analysis. Structure of data objects
1#!/usr/bin/env python3 2 3## Analytical model, 4## 5 6importos,sys,random 7importnumpyasnp 8importgc 9 10importpymetamodels 11importcoupled_function_modelasmodel_obj 12 13classanalysis(object): 14 15""" 16 17 .. _model_coupled_function_data_struct: 18 19 **Synopsis:** 20 * Analysis framework with pymetamodels 21 22 """ 23 24def__init__(self): 25 26## Initial variables 27self.name="coupled_function_data_struct" 28self.folder_script=os.path.dirname(os.path.realpath(__file__)) 29 30self.folder_path_inputs=self.folder_script 31 32self.folder_path_outputs=os.path.join(os.path.join(os.path.join(self.folder_script,os.pardir),"_examples_raw"),self.name+"_out") 33ifnotos.path.exists(self.folder_path_outputs):os.makedirs(self.folder_path_outputs) 34 35self.file_name_inputs=r"configuration_spreadsheet" 36self.file_name_outputs=r"outputs" 37 38## Initialise 39self.mita=pymetamodels.load() 40self.mita.logging_start(self.folder_path_outputs) 41 42defrun_model(self): 43 44## Inputs load 45folder_path=self.folder_path_inputs 46file_name=self.file_name_inputs 47self.mita.read_xls_case(folder_path,file_name,sheet="cases",col_start=0,row_start=1,tit_row=0) 48 49## Sampling 50forcaseinself.mita.keys(): 51 52## Run samplimg cases 53self.mita.run_sampling_routine(case) 54 55## Run / Load model 56self.model_iteration(case,model_obj) 57 58## Sensitivity analysis 59self.mita.run_sensitivity_analisis(case) 60 61## 62self.mita.run_sensitivity_normalization() 63 64## Print data structure for investigation 65forcaseinself.mita.keys(): 66print("*:-)* Printing data object structure for case %s"%case) 67self.mita.print_structure(case) 68 69## Print data structure for investigation 70forcaseinself.mita.keys(): 71print("*:-)* Printing DOEX data object structure for case %s"%case) 72self.mita.print_dict(self.mita.doeX(case)) 73 74## Print data structure for investigation 75forcaseinself.mita.keys(): 76print("*:-)* Printing DOEY data object structure for case %s"%case) 77self.mita.print_dict(self.mita.doeX(case)) 78 79## Print data structure for investigation 80forcaseinself.mita.keys(): 81print("*:-)* Printing sensitivity SiY data object structure for case %s"%case) 82self.mita.print_dict(self.mita.SiY(case)) 83 84## Print data structure for investigation 85forcaseinself.mita.keys(): 86print("*:-)* Printing parameters values for each input variable data object structure for case %s"%case) 87self.mita.print_dict(self.mita.vars_parameter_matrix(case)) 88 89 90 91## Output variables save 92folder_path=self.folder_path_outputs 93file_name=self.file_name_outputs 94out_path=self.mita.output_xls(folder_path,file_name,col_start=0,tit_row=0) 95 96defmodel_iteration(self,case,_model_obj): 97 98## Model iteration to generate Y doe output values 99doeX=self.mita.doeX(case)100doeY=self.mita.doeY(case)101vars_in=self.mita.vars_parameter_matrix(case)102case_dict=self.mita.case[case]103samples=len(doeX[list(doeX.keys())[0]])104105foriiinrange(0,samples):106107obj_model=_model_obj.model_obj()108109# initialize dictionaries110obj_model.doeX=doeX111obj_model.doeY=doeY112obj_model.case_dict=case_dict113obj_model.ii=ii114obj_model.vars_in=vars_in115116# add variables as atributes117forkeyinobj_model.doeX.keys():118setattr(obj_model,key,obj_model.doeX[key][obj_model.ii])119120# run the model for ii sample121obj_model.run_model()122123if__name__=="__main__":124125analysis=analysis()126127analysis.run_model()
The console output of running the tutorial script is as follow,
4.3. Tutorial case A03: “Models and metamodels construction of a coupled function”
In this tutorial are described the construction of the model and metamodels, as well as the default plotting of them. For this purpose is used the DOE design and sensitivity analysis for a coupled function described in the previous tutorial case.
The code to print the data structure objects are described in the script as follows in test_analysis.py,
Listing 4.3.1 Coupled function test analysis. Metamodels
1#!/usr/bin/env python3 2 3## Analytical model, 4## 5 6importos,sys,random 7importnumpyasnp 8importgc 9 10importpymetamodels 11importcoupled_function_modelasmodel_obj 12 13classanalysis(object): 14 15""" 16 17 .. _model_coupled_function_metamodel: 18 19 **Synopsis:** 20 * Analysis framework with pymetamodels 21 * Coupled function tutorial 22 23 """ 24 25def__init__(self): 26 27## Initial variables 28self.name="coupled_function_metamodel" 29self.folder_script=os.path.dirname(os.path.realpath(__file__)) 30 31self.folder_path_inputs=self.folder_script 32 33self.folder_path_outputs=os.path.join(os.path.join(os.path.join(self.folder_script,os.pardir),"_examples_raw"),self.name+"_out") 34ifnotos.path.exists(self.folder_path_outputs):os.makedirs(self.folder_path_outputs) 35 36self.file_name_inputs=r"configuration_spreadsheet" 37self.file_name_outputs=r"outputs" 38 39## Initialise 40self.mita=pymetamodels.load() 41self.mita.logging_start(self.folder_path_outputs) 42 43defrun_model(self): 44 45## Inputs load 46folder_path=self.folder_path_inputs 47file_name=self.file_name_inputs 48self.mita.read_xls_case(folder_path,file_name,sheet="cases",col_start=0,row_start=1,tit_row=0) 49 50## Sampling 51forcaseinself.mita.keys(): 52 53## Run samplimg cases 54self.mita.run_sampling_routine(case) 55 56## Run / Load model 57self.model_iteration(case,model_obj) 58 59## Sensitivity analysis 60self.mita.run_sensitivity_analisis(case) 61 62## Metamodeling construction 63#self.mita.run_metamodel_construction(case, scheme = "general") 64self.mita.run_metamodel_construction(case,scheme="general_fast") 65 66## 67self.mita.run_sensitivity_normalization() 68 69## Ploting and others 70forcaseinself.mita.keys(): 71 72## Plots cross varible relation in the sensitivity analysis 73self.mita.output_plts_sensitivity(self.folder_path_outputs,case) 74 75## Plots showing the model DOEX and DOEY variables relationship 2D XY 76self.mita.output_plts_models_XY(self.folder_path_outputs,case) 77 78## Residual values plots 79self.mita.output_plts_models_residuals_plot(self.folder_path_outputs,case) 80 81## Plots showing the model DOEX and DOEY variables relationship 3D XYZ 82self.mita.output_plts_models_XYZ(self.folder_path_outputs,case,scatter=False) 83 84## Output variables save 85folder_path=self.folder_path_outputs 86file_name=self.file_name_outputs 87out_path=self.mita.output_xls(folder_path,file_name,col_start=0,tit_row=0) 88 89defmodel_iteration(self,case,_model_obj): 90 91## Model iteration to generate Y doe output values 92doeX=self.mita.doeX(case) 93doeY=self.mita.doeY(case) 94vars_in=self.mita.vars_parameter_matrix(case) 95case_dict=self.mita.case[case] 96samples=len(doeX[list(doeX.keys())[0]]) 97 98foriiinrange(0,samples): 99100obj_model=_model_obj.model_obj()101102# initialize dictionaries103obj_model.doeX=doeX104obj_model.doeY=doeY105obj_model.case_dict=case_dict106obj_model.ii=ii107obj_model.vars_in=vars_in108109# add variables as atributes110forkeyinobj_model.doeX.keys():111setattr(obj_model,key,obj_model.doeX[key][obj_model.ii])112113# run the model for ii sample114obj_model.run_model()115116if__name__=="__main__":117118analysis=analysis()119120analysis.run_model()
The function run_metamodel_construction() is included in the code to execute the routines related with the metamodeling construction of the DOEY as function of the DOEX data. This functions allows to choose different metamodeling schemas. This schemas perform a robust metamodeling search and find to determine the most adequate metamodeling ML model. Once the ML metamodel is determined allows to predict any data in the ranges of the DOEX and DOEY training values.
The function output_plts_models_residuals_plot() plots the residual values of the ML metamodel DOEY predictions in comparison with the ground truth DOEY values showing the regression score between the data and the predictions. An example can be seen in Fig. 4.3.3.
In addition, the function output_plts_models_XYZ() plot all the combinations of XYZ plots showing the prediction surfaces constructed using the ML metamodel. An example can be seen in Fig. 4.3.1 and Fig. 4.3.2.
Fig. 4.3.1 Metamodels surface of variable X1 versus X2 versus Y in case_1. Tutorial A03
Fig. 4.3.2 Metamodels surface of variable X2 versus X3 versus Y in case_1. Tutorial A03
Fig. 4.3.3 Metamodels residual plot Y values versus predictions in case_1. Tutorial A03
4.4. Tutorial case A04: “Sensitivity analysis and metamodeling of Kursawe Functions”
In this tutorial are described the construction of the model, sensitivity analysis and metamodels, as well as the default plotting of them. For this purpose is used the DOE design and sensitivity analysis for a coupled function described in the previous tutorial case as a base line. The Kursawe Functions are define by three variables \(X_1, X_2, X_3\) and two output functions \(f_{kursawe1}, f_{kursawe2}\),
The function output_plts_sensitivity() generates several plots showing the DOEX variables correlation and a summary of the sensitivity analysis. For example this can be seen in Fig. 4.4.1 and Fig. 4.4.2. These plots are located in the output folder.
Fig. 4.4.1 Sensitivity bar plot for case_1, Kursawe function 1. Tutorial A04
Fig. 4.4.2 Sensitivity bar plot for case_1, Kursawe function 2. Tutorial A04
The function run_metamodel_construction() is included in the code to execute the routines related with the metamodeling construction of the DOEY as function of the DOEX data. This functions allows to choose different metamodeling schemas. This schemas perform a robust metamodeling search and find to determine the most adequate metamodeling ML model. Once the ML metamodel is determined allows to predict any data in the ranges of the DOEX and DOEY training values.
The function output_plts_models_residuals_plot() plots the residual values of the ML metamodel DOEY predictions in comparison with the ground truth DOEY values showing the regression score between the data and the predictions. An example can be seen in Fig. 4.4.7 and Fig. 4.4.8.
Fig. 4.4.3 Metamodels surface of variable X1 versus X2 versus kursawe1 in case_1. Tutorial A04
Fig. 4.4.4 Metamodels surface of variable X1 versus X3 versus kursawe1 in case_1. Tutorial A04
Fig. 4.4.5 Metamodels surface of variable X2 versus X3 versus kursawe1 in case_1. Tutorial A04
Fig. 4.4.6 Metamodels surface of variable X1 versus X2 versus kursawe2 in case_1. Tutorial A04
Fig. 4.4.7 Metamodels residual plot Kursawe function 1 values versus predictions in case_1. Tutorial A04
Fig. 4.4.8 Metamodels residual plot Kursawe function 2 values versus predictions in case_1. Tutorial A04
4.5. Tutorial case A05: “Sensitivity analysis and metamodeling of a damped oscillator”
In this tutorial are described the construction of the model, sensitivity analysis and metamodels, as well as the default plotting of them. For this purpose is used the DOE design and sensitivity analysis for a coupled function described in the previous tutorial case as a base line. The damped oscillator is define by a mass paramter \(m\), a spring constant \(k\) and a damping factor \(D\) (see Fig. 4.5.1) drive by a kinetical energy \(E_{kin}\). The damped oscillator is driven by the following equations,
\begin{equation}
\begin{cases}
\ddot{x} + 2 \cdot D \cdot w_0 \cdot \dot{x} + w_0^2 \cdot x = 0 \quad \quad Differential \ equation \ of \ movement \\
E_{kin} = \frac{m \cdot v^2_0}{2}, \quad x_0=0 \quad \quad Initial \ conditions \\
x(t) = e^{-D \cdot w_0 \cdot t} \cdot \frac{v_0}{w} \cdot sin(w \cdot t) \quad \quad Solution \ eq. \ x(t) \ dependant \ on \ the \ time \\
w_0 = \sqrt{k/m} \quad w = w_0 \sqrt{1-D^2} \quad \quad Natural \ frequency, \ damped \ and \ non-damped
\end{cases}
\end{equation}
The function output_plts_sensitivity() generates several plots showing the DOEX variables correlation and a summary of the sensitivity analysis. For example this can be seen in Fig. 4.5.2 and Fig. 4.5.3. These plots are located in the output folder.
Fig. 4.5.2 Sensitivity bar plot for case_2, :math:` x_{max}`. Tutorial A05
Fig. 4.5.3 Sensitivity bar plot for case_1, \(w_{damped}\). Tutorial A05
The function run_metamodel_construction() is included in the code to execute the routines related with the metamodeling construction of the DOEY as function of the DOEX data. This functions allows to choose different metamodeling schemas. This schemas perform a robust metamodeling search and find to determine the most adequate metamodeling ML model. Once the ML metamodel is determined allows to predict any data in the ranges of the DOEX and DOEY training values.
The function output_plts_models_residuals_plot() plots the residual values of the ML metamodel DOEY predictions in comparison with the ground truth DOEY values showing the regression score between the data and the predictions. An example can be seen in Fig. 4.4.7 and Fig. 4.4.8.
In addition, the function output_plts_models_XYZ() plot all the combinations of XYZ plots showing the prediction surfaces constructed using the ML metamodel. An example can be seen from Fig. 4.5.4 to Fig. 4.5.13.
Fig. 4.5.4 Metamodels surface of variable \(m\) versus \(k\) versus \(x_{max}\) in case_2. Tutorial A05
Fig. 4.5.5 Metamodels surface of variable \(m\) versus \(E_{kin}\) versus \(x_{max}\) in case_2. Tutorial A05
Fig. 4.5.6 Metamodels surface of variable \(m\) versus \(D\) versus \(x_{max}\) in case_2. Tutorial A05
Fig. 4.5.7 Metamodels surface of variable \(k\) versus \(E_{kin}\) versus \(x_{max}\) in case_2. Tutorial A05
Fig. 4.5.8 Metamodels surface of variable \(k\) versus \(D\) versus \(x_{max}\) in case_2. Tutorial A05
Fig. 4.5.9 Metamodels surface of variable \(E_{kin}\) versus \(D\) versus \(x_{max}\) in case_2. Tutorial A05
Fig. 4.5.10 Metamodels surface of variable \(m\) versus \(k\) versus \(w_{damped}\) in case_2. Tutorial A05
Fig. 4.5.11 Metamodels surface of variable \(m\) versus \(E_{kin}\) versus \(w_{damped}\) in case_2. Tutorial A05
Fig. 4.5.12 Metamodels surface of variable \(m\) versus \(D\) versus \(w_{damped}\) in case_2. Tutorial A05
Fig. 4.5.13 Metamodels surface of variable \(k\) versus \(E_{kin}\) versus \(w_{damped}\) in case_2. Tutorial A05
4.6. Tutorial case A06: “Minimization of the Kursawe Functions”
In this tutorial is described the extension of tutorial A04 Section 4.4 regarding the Kursawe Functions with the minimization of one of the Kursawe functions according a non linear constrain. This problem is described in Eq.4.4.1.
The same model as in tutorial A04 (see Section 4.4) is used. The analysis is performed with pymetamodels based on a basic analysis script as follows in test_analysis.py (see Listing 4.6.1).
Apart of the sensitivity analysis and metamodeling construction carried out in tutorial A04. The optimization routine is call with the function run_optimization_problem() using a “general_fast” schema approach. The optimization problem is solve resulting in Eq.4.6.2.
Listing 4.6.1 Kursawe Functions test analysis. Minimization of the Kursawe Functions
1#!/usr/bin/env python3 2 3## Analytical model, 4## 5 6importos,sys,random 7importnumpyasnp 8importgc 9 10importpymetamodels 11importkursawe_modelasmodel_obj 12 13classanalysis(object): 14 15""" 16 17 .. _model_kursawe_model_optimize: 18 19 **Synopsis:** 20 * Analysis framework with pymetamodels 21 * Coupled function tutorial 22 23 """ 24 25def__init__(self): 26 27## Initial variables 28self.name="kuwase_optimize" 29self.folder_script=os.path.dirname(os.path.realpath(__file__)) 30 31self.folder_path_inputs=self.folder_script 32 33self.folder_path_outputs=os.path.join(os.path.join(os.path.join(self.folder_script,os.pardir),"_examples_raw"),self.name+"_out") 34ifnotos.path.exists(self.folder_path_outputs):os.makedirs(self.folder_path_outputs) 35 36self.file_name_inputs=r"configuration_spreadsheet" 37self.file_name_outputs=r"outputs" 38 39## Initialise 40self.mita=pymetamodels.load() 41self.mita.logging_start(self.folder_path_outputs) 42 43defrun_model(self): 44 45## Inputs load 46folder_path=self.folder_path_inputs 47file_name=self.file_name_inputs 48self.mita.read_xls_case(folder_path,file_name,sheet="cases",col_start=0,row_start=1,tit_row=0) 49 50## Sampling 51forcaseinself.mita.keys(): 52 53## Run samplimg cases 54self.mita.run_sampling_routine(case) 55 56## Run / Load model 57self.model_iteration(case,model_obj) 58 59## Sensitivity analysis 60self.mita.run_sensitivity_analisis(case) 61 62## Metamodeling construction 63ifself.mita.load_metamodel(self.folder_path_outputs,case): 64pass 65else: 66self.mita.run_metamodel_construction(case,scheme="general_fast") 67 68## Save metamodels .metaita 69self.mita.save_metamodel(self.folder_path_outputs,case) 70 71## Solve optimization problem 72self.mita.run_optimization_problem(case,scheme="general_fast",verbose_testing=True) 73 74## 75self.mita.run_sensitivity_normalization() 76 77## Ploting and others 78forcaseinself.mita.keys(): 79 80## Save DOEX and DOEY 81 82## Plots cross varible relation in the sensitivity analysis 83self.mita.output_plts_sensitivity(self.folder_path_outputs,case) 84 85## Plots showing the model DOEX and DOEY variables relationship 2D XY 86self.mita.output_plts_models_XY(self.folder_path_outputs,case) 87 88## Residual values plots 89self.mita.output_plts_models_residuals_plot(self.folder_path_outputs,case) 90 91## Plots showing the model DOEX and DOEY variables relationship 3D XYZ 92self.mita.output_plts_models_XYZ(self.folder_path_outputs,case,scatter=False) 93 94## Output variables save 95folder_path=self.folder_path_outputs 96file_name=self.file_name_outputs 97out_path=self.mita.output_xls(folder_path,file_name,col_start=0,tit_row=0) 98 99defmodel_iteration(self,case,_model_obj):100101## Model iteration to generate Y doe output values102doeX=self.mita.doeX(case)103doeY=self.mita.doeY(case)104vars_in=self.mita.vars_parameter_matrix(case)105case_dict=self.mita.case[case]106samples=len(doeX[list(doeX.keys())[0]])107108foriiinrange(0,samples):109110obj_model=_model_obj.model_obj()111112# initialize dictionaries113obj_model.doeX=doeX114obj_model.doeY=doeY115obj_model.case_dict=case_dict116obj_model.ii=ii117obj_model.vars_in=vars_in118119# add variables as atributes120forkeyinobj_model.doeX.keys():121setattr(obj_model,key,obj_model.doeX[key][obj_model.ii])122123# run the model for ii sample124obj_model.run_model()125126if__name__=="__main__":127128analysis=analysis()129130analysis.run_model()
4.7. Tutorial case A07: “Calibration of a damped oscillator”
In this tutorial is described the extension of tutorial A05 Section 4.5 regarding a damped oscillator with the calibration of the oscillating system according a given reference signal. This problem is described in Eq.4.7.1.
The same model as in tutorial A05 (see Section 4.5) is used, with a small modification. The constrain function and the objective function to be minimize as equal to zero has been added (see Listing 4.7.2). In addition the reference signal to be math in the calibration is loaded (Download:Referencesignalspreadsheetfile) in order to build the objective function.
The analysis is performed with pymetamodels based on a basic analysis script as follows in test_analysis.py (see Listing 4.7.1). Apart of the sensitivity analysis and metamodeling construction carried out in tutorial A05. The optimization routine is call with the function run_optimization_problem() using a “general_fast” schema approach.
The calibration problem is solve resulting in Eq.4.7.2. When the reference and simulation signal for the aforementioned values are compared in Fig. 4.7.1 showing a good agreement for the calibration solution values.
4.8. Tutorial case A08: “Building the configuration spreadsheet programatically”
Based in the tutorial related with the coupled function, in this tutorial is described how to build the configuration spreadsheet programatically using the objconf(). The analysis includes the sampling, metamodeling and optimization routines.
The code to print the data structure objects are described in the script as follows in test_analysis.py,
Listing 4.8.1 Coupled function test analysis. Objconf()
1 2## Analytical model, 3## 4 5importos,sys,random 6importnumpyasnp 7importgc 8 9importpymetamodels 10importcoupled_function_modelasmodel_obj 11 12classanalysis(object): 13 14""" 15 16 .. _model_coupled_function_obj_conf: 17 18 **Synopsis:** 19 * Analysis framework with pymetamodels 20 * Coupled function tutorial 21 22 """ 23 24def__init__(self): 25 26## Initial variables 27self.name="coupled_function_obj_conf" 28self.folder_script=os.path.dirname(os.path.realpath(__file__)) 29 30self.folder_path_inputs=self.folder_script 31 32self.folder_path_outputs=os.path.join(os.path.join(os.path.join(self.folder_script,os.pardir),"_examples_raw"),self.name+"_out") 33ifnotos.path.exists(self.folder_path_outputs):os.makedirs(self.folder_path_outputs) 34 35self.file_name_inputs=r"configuration_spreadsheet" 36self.file_name_outputs=r"outputs" 37 38## Initialise 39self.mita=pymetamodels.load() 40self.mita.logging_start(self.folder_path_outputs) 41 42defrun_model(self): 43 44## Build programatically configuration sheet 45_conf=self.mita.objconf() 46_conf.start(self.folder_path_inputs,self.file_name_inputs) 47 48_conf.add_case("case_1","case_1_vars_sensi","case_out",1024,"DGSM") 49_conf.add_case("case_2","case_1_vars_sensi","case_out_2",256,"DGSM") 50 51_conf.add_vars_sheet_variable("case_1_vars_sensi","X1",1,-3.14,3.14,"unif",True,5/100.,"[-]","X1") 52_conf.add_vars_sheet_variable("case_1_vars_sensi","X2",1,-3.14,3.14,"unif",True,5/100.,"[-]","X2") 53_conf.add_vars_sheet_variable("case_1_vars_sensi","X3",1,-3.14,3.14,"unif",True,5/100.,"[-]","X3") 54_conf.add_vars_sheet_variable("case_1_vars_sensi","X4",1,-3.14,3.14,"unif",True,5/100.,"[-]","X4") 55_conf.add_vars_sheet_variable("case_1_vars_sensi","X5",1,-3.14,3.14,"unif",True,5/100.,"[-]","X5") 56_conf.add_vars_sheet_variable("case_1_vars_sensi","cte",1.,1.,1.,"unif",False,5/100.,"[-]","cte") 57 58_conf.add_output_sheet("case_out","Y",None,"m^3",False,True,False,False,False,"function output") 59_conf.add_output_sheet("case_out_2","Y",None,"m^3",False,True,False,False,False,"function output") 60_conf.add_output_sheet("case_out_2","Y2",None,"m^3",False,False,False,False,False,"function output") 61 62_conf.save_conf() 63 64## Inputs load 65self.mita.read_xls_case(self.folder_path_inputs,self.file_name_inputs) 66 67## Sampling, metamodeling and optimization 68forcaseinself.mita.keys(): 69 70## Run samplimg cases 71self.mita.run_sampling_routine(case) 72 73## Run / Load model 74self.model_iteration(case,model_obj) 75 76## Sensitivity analysis 77self.mita.run_sensitivity_analisis(case) 78 79## Metamodeling construction 80self.mita.run_metamodel_construction(case,scheme="general_fast") 81 82## Solve optimization problem 83self.mita.run_optimization_problem(case,scheme="general_fast") 84 85## 86self.mita.run_sensitivity_normalization() 87 88## Ploting and others 89forcaseinself.mita.keys(): 90 91## Plots cross varible relation in the sensitivity analysis 92self.mita.output_plts_sensitivity(self.folder_path_outputs,case) 93 94## Plots showing the model DOEX and DOEY variables relationship 2D XY 95self.mita.output_plts_models_XY(self.folder_path_outputs,case) 96 97## Residual values plots 98self.mita.output_plts_models_residuals_plot(self.folder_path_outputs,case) 99100## Plots showing the model DOEX and DOEY variables relationship 3D XYZ101self.mita.output_plts_models_XYZ(self.folder_path_outputs,case)102103## Output variables save104folder_path=self.folder_path_outputs105file_name=self.file_name_outputs106out_path=self.mita.output_xls(folder_path,file_name,col_start=0,tit_row=0)107108defmodel_iteration(self,case,_model_obj):109110## Model iteration to generate Y doe output values111doeX=self.mita.doeX(case)112doeY=self.mita.doeY(case)113vars_in=self.mita.vars_parameter_matrix(case)114case_dict=self.mita.case[case]115samples=len(doeX[list(doeX.keys())[0]])116117foriiinrange(0,samples):118119obj_model=_model_obj.model_obj()120121# initialize dictionaries122obj_model.doeX=doeX123obj_model.doeY=doeY124obj_model.case_dict=case_dict125obj_model.ii=ii126obj_model.vars_in=vars_in127128# add variables as atributes129forkeyinobj_model.doeX.keys():130setattr(obj_model,key,obj_model.doeX[key][obj_model.ii])131132# run the model for ii sample133obj_model.run_model()134135if__name__=="__main__":136137analysis=analysis()138139analysis.run_model()
4.9. Tutorial case A09: “Loading DOEs from file, couple function case”
Based in the tutorial related with the coupled function, in this tutorial is described how to load tables of data as DOEX and DOEY input and outputs. The analysis includes the sampling, metamodeling and optimization routines.
The code to print the data structure objects are described in the script as follows in test_analysis.py,
Listing 4.9.1 Coupled function test analysis. Loading DOEX and DOEY data.
1 2## Analytical model, 3## 4 5importos,sys,random 6importnumpyasnp 7importgc 8 9importpymetamodels 10importcoupled_function_modelasmodel_obj 11 12classanalysis(object): 13 14""" 15 16 .. _model_coupled_function_obj_conf: 17 18 **Synopsis:** 19 * Analysis framework with pymetamodels 20 * Coupled function tutorial 21 22 """ 23 24def__init__(self): 25 26## Initial variables 27self.name="coupled_function_load_DOEs" 28self.folder_script=os.path.dirname(os.path.realpath(__file__)) 29 30self.folder_path_inputs=self.folder_script 31 32self.folder_path_outputs=os.path.join(os.path.join(os.path.join(self.folder_script,os.pardir),"_examples_raw"),self.name+"_out") 33ifnotos.path.exists(self.folder_path_outputs):os.makedirs(self.folder_path_outputs) 34 35self.file_name_inputs=r"configuration_spreadsheet" 36self.file_name_outputs=r"outputs" 37 38## Initialise 39self.mita=pymetamodels.load() 40self.mita.logging_start(self.folder_path_outputs) 41 42defrun_model(self): 43 44## Build programatically configuration sheet 45_conf=self.mita.objconf() 46_conf.start(self.folder_path_inputs,self.file_name_inputs) 47 48_conf.add_case("case_1","case_1_vars_sensi","case_out",1024,"DGSM") 49_conf.add_case("case_2","case_1_vars_sensi","case_out_2",256,"DGSM") 50 51_conf.add_vars_sheet_variable("case_1_vars_sensi","X1",1,-3.14,3.14,"unif",True,5/100.,"[-]","X1") 52_conf.add_vars_sheet_variable("case_1_vars_sensi","X2",1,-3.14,3.14,"unif",True,5/100.,"[-]","X2") 53_conf.add_vars_sheet_variable("case_1_vars_sensi","X3",1,-3.14,3.14,"unif",True,5/100.,"[-]","X3") 54_conf.add_vars_sheet_variable("case_1_vars_sensi","X4",1,-3.14,3.14,"unif",True,5/100.,"[-]","X4") 55_conf.add_vars_sheet_variable("case_1_vars_sensi","X5",1,-3.14,3.14,"unif",True,5/100.,"[-]","X5") 56_conf.add_vars_sheet_variable("case_1_vars_sensi","cte",1.,1.,1.,"unif",False,5/100.,"[-]","cte") 57 58_conf.add_output_sheet("case_out","Y",None,"m^3",False,True,False,False,False,"function output") 59_conf.add_output_sheet("case_out_2","Y",None,"m^3",False,True,False,False,False,"function output") 60_conf.add_output_sheet("case_out_2","Y2",None,"m^3",False,False,False,False,False,"function output") 61 62_conf.save_conf() 63 64## Inputs load 65self.mita.read_xls_case(self.folder_path_inputs,self.file_name_inputs) 66 67""" 68 ## Save DOEX and DOEY 69 ## Sampling, metamodeling and optimization 70 for case in self.mita.keys(): 71 72 ## Run samplimg cases 73 self.mita.run_sampling_routine(case) 74 75 ## Run / Load model 76 self.model_iteration(case, model_obj) 77 78 self.mita.save_tofile_DOEX(self.folder_path_outputs, "DOEX") 79 self.mita.save_tofile_DOEY(self.folder_path_outputs, "DOEY") 80 """ 81 82## Load DOEX and DOEY 83## Sampling, metamodeling and optimization 84 85self.mita.read_fromfile_DOEX(self.folder_path_outputs,"DOEX") 86self.mita.read_fromfile_DOEY(self.folder_path_outputs,"DOEY") 87 88forcaseinself.mita.keys(): 89 90## Sensitivity analysis 91self.mita.run_sensitivity_analisis(case) 92 93## Metamodeling construction 94self.mita.run_metamodel_construction(case,scheme="general_fast") 95 96## Solve optimization problem 97self.mita.run_optimization_problem(case,scheme="general_fast") 98 99##100self.mita.run_sensitivity_normalization()101102## Ploting and others103forcaseinself.mita.keys():104105## Plots cross varible relation in the sensitivity analysis106self.mita.output_plts_sensitivity(self.folder_path_outputs,case)107108## Plots showing the model DOEX and DOEY variables relationship 2D XY109self.mita.output_plts_models_XY(self.folder_path_outputs,case)110111## Residual values plots112self.mita.output_plts_models_residuals_plot(self.folder_path_outputs,case)113114## Plots showing the model DOEX and DOEY variables relationship 3D XYZ115self.mita.output_plts_models_XYZ(self.folder_path_outputs,case)116117## Output variables save118folder_path=self.folder_path_outputs119file_name=self.file_name_outputs120out_path=self.mita.output_xls(folder_path,file_name,col_start=0,tit_row=0)121122defmodel_iteration(self,case,_model_obj):123124## Model iteration to generate Y doe output values125doeX=self.mita.doeX(case)126doeY=self.mita.doeY(case)127vars_in=self.mita.vars_parameter_matrix(case)128case_dict=self.mita.case[case]129samples=len(doeX[list(doeX.keys())[0]])130131foriiinrange(0,samples):132133obj_model=_model_obj.model_obj()134135# initialize dictionaries136obj_model.doeX=doeX137obj_model.doeY=doeY138obj_model.case_dict=case_dict139obj_model.ii=ii140obj_model.vars_in=vars_in141142# add variables as atributes143forkeyinobj_model.doeX.keys():144setattr(obj_model,key,obj_model.doeX[key][obj_model.ii])145146# run the model for ii sample147obj_model.run_model()148149if__name__=="__main__":150151analysis=analysis()152153analysis.run_model()