1import pyomo.environ as pyo 2import numpy.random as rnd 3import pyomo.contrib.pynumero.examples.external_grey_box.param_est.models as pm 4import pandas as pd 5 6def generate_data(N, UA_mean, UA_std, seed=42): 7 rnd.seed(seed) 8 m = pyo.ConcreteModel() 9 pm.build_single_point_model_pyomo_only(m) 10 11 # dummy objective since this is a square problem 12 m.obj = pyo.Objective(expr=1) 13 14 # create the ipopt solver 15 solver = pyo.SolverFactory('ipopt') 16 17 data = {'run': [], 'Th_in': [], 'Tc_in': [], 'Th_out':[], 18 'Tc_out': []} 19 for i in range(N): 20 # draw a random value for the parameters 21 ua = float(rnd.normal(UA_mean, UA_std)) 22 # draw a noisy value for the test input conditions 23 Th_in = 100 + float(rnd.normal(0, 2)) 24 Tc_in = 30 + float(rnd.normal(0, 2)) 25 m.UA.fix(ua) 26 m.Th_in.fix(Th_in) 27 m.Tc_in.fix(Tc_in) 28 29 status = solver.solve(m, tee=False) 30 data['run'].append(i) 31 data['Th_in'].append(pyo.value(m.Th_in)) 32 data['Tc_in'].append(pyo.value(m.Tc_in)) 33 data['Th_out'].append(pyo.value(m.Th_out)) 34 data['Tc_out'].append(pyo.value(m.Tc_out)) 35 36 return pd.DataFrame(data) 37 38def generate_data_external(N, UA_mean, UA_std, seed=42): 39 rnd.seed(seed) 40 m = pyo.ConcreteModel() 41 pm.build_single_point_model_external(m) 42 43 # Add mutable parameters for the rhs of the equalities 44 m.UA_spec = pyo.Param(initialize=200, mutable=True) 45 m.Th_in_spec = pyo.Param(initialize=100, mutable=True) 46 m.Tc_in_spec = pyo.Param(initialize=30, mutable=True) 47 m.UA_spec_con = pyo.Constraint(expr=m.egb.inputs['UA'] == m.UA_spec) 48 m.Th_in_spec_con = pyo.Constraint(expr=m.egb.inputs['Th_in'] == m.Th_in_spec) 49 m.Tc_in_spec_con = pyo.Constraint(expr=m.egb.inputs['Tc_in'] == m.Tc_in_spec) 50 51 52 # dummy objective since this is a square problem 53 m.obj = pyo.Objective(expr=(m.egb.inputs['UA'] - m.UA_spec)**2) 54 55 # create the ipopt solver 56 solver = pyo.SolverFactory('cyipopt') 57 58 data = {'run': [], 'Th_in': [], 'Tc_in': [], 'Th_out':[], 59 'Tc_out': []} 60 for i in range(N): 61 # draw a random value for the parameters 62 UA = float(rnd.normal(UA_mean, UA_std)) 63 # draw a noisy value for the test input conditions 64 Th_in = 100 + float(rnd.normal(0, 2)) 65 Tc_in = 30 + float(rnd.normal(0, 2)) 66 m.UA_spec.value = UA 67 m.Th_in_spec.value = Th_in 68 m.Tc_in_spec.value = Tc_in 69 70 status = solver.solve(m, tee=False) 71 data['run'].append(i) 72 data['Th_in'].append(pyo.value(m.egb.inputs['Th_in'])) 73 data['Tc_in'].append(pyo.value(m.egb.inputs['Tc_in'])) 74 data['Th_out'].append(pyo.value(m.egb.inputs['Th_out'])) 75 data['Tc_out'].append(pyo.value(m.egb.inputs['Tc_out'])) 76 77 return pd.DataFrame(data) 78 79if __name__ == '__main__': 80 #df = generate_data(50, 200, 5) 81 df = generate_data_external(50, 200, 5) 82 df.to_csv('data.csv', index=False) 83 84 85