| 1 | within ;
|
|---|
| 2 | package HeatedRoom
|
|---|
| 3 | model HeatedRoom_BlockDiagram
|
|---|
| 4 |
|
|---|
| 5 | Modelica.Blocks.Sources.Constant const(k=5)
|
|---|
| 6 | annotation (Placement(transformation(extent={{-180,90},{-160,110}})));
|
|---|
| 7 | Modelica.Blocks.Sources.Constant Outside_Temperature(k=13)
|
|---|
| 8 | annotation (Placement(transformation(extent={{-180,10},{-160,30}})));
|
|---|
| 9 | Modelica.Blocks.Math.Add add(k1=-0.1, k2=+0.1)
|
|---|
| 10 | annotation (Placement(transformation(extent={{-120,20},{-100,40}})));
|
|---|
| 11 | Modelica.Blocks.Math.Add add1
|
|---|
| 12 | annotation (Placement(transformation(extent={{-60,60},{-40,80}})));
|
|---|
| 13 | Modelica.Blocks.Math.Product product
|
|---|
| 14 | annotation (Placement(transformation(extent={{-120,100},{-100,120}})));
|
|---|
| 15 | Modelica.Blocks.Continuous.Integrator integrator(y_start=17)
|
|---|
| 16 | annotation (Placement(transformation(extent={{-20,62},{0,82}})));
|
|---|
| 17 | Modelica.Blocks.Logical.Hysteresis hysteresis(uLow=15, uHigh=20)
|
|---|
| 18 | annotation (Placement(transformation(extent={{20,60},{40,80}})));
|
|---|
| 19 | Modelica.Blocks.Math.BooleanToReal booleanToReal
|
|---|
| 20 | annotation (Placement(transformation(extent={{100,60},{120,80}})));
|
|---|
| 21 | Modelica.Blocks.Logical.Not not1
|
|---|
| 22 | annotation (Placement(transformation(extent={{60,60},{80,80}})));
|
|---|
| 23 | equation
|
|---|
| 24 | connect(const.y, product.u2) annotation (Line(
|
|---|
| 25 | points={{-159,100},{-140,100},{-140,104},{-122,104}},
|
|---|
| 26 | color={0,0,127},
|
|---|
| 27 | smooth=Smooth.None));
|
|---|
| 28 | connect(Outside_Temperature.y, add.u2) annotation (Line(
|
|---|
| 29 | points={{-159,20},{-140,20},{-140,24},{-122,24}},
|
|---|
| 30 | color={0,0,127},
|
|---|
| 31 | smooth=Smooth.None));
|
|---|
| 32 | connect(product.y, add1.u1) annotation (Line(
|
|---|
| 33 | points={{-99,110},{-80,110},{-80,76},{-62,76}},
|
|---|
| 34 | color={0,0,127},
|
|---|
| 35 | smooth=Smooth.None));
|
|---|
| 36 | connect(add.y, add1.u2) annotation (Line(
|
|---|
| 37 | points={{-99,30},{-80,30},{-80,64},{-62,64}},
|
|---|
| 38 | color={0,0,127},
|
|---|
| 39 | smooth=Smooth.None));
|
|---|
| 40 | connect(add1.y, integrator.u) annotation (Line(
|
|---|
| 41 | points={{-39,70},{-30,70},{-30,72},{-22,72}},
|
|---|
| 42 | color={0,0,127},
|
|---|
| 43 | smooth=Smooth.None));
|
|---|
| 44 | connect(integrator.y, hysteresis.u) annotation (Line(
|
|---|
| 45 | points={{1,72},{10,72},{10,70},{18,70}},
|
|---|
| 46 | color={0,0,127},
|
|---|
| 47 | smooth=Smooth.None));
|
|---|
| 48 | connect(booleanToReal.y, product.u1) annotation (Line(
|
|---|
| 49 | points={{121,70},{140,70},{140,160},{-140,160},{-140,116},{-122,116}},
|
|---|
| 50 | color={0,0,127},
|
|---|
| 51 | smooth=Smooth.None));
|
|---|
| 52 | connect(integrator.y, add.u1) annotation (Line(
|
|---|
| 53 | points={{1,72},{10,72},{10,50},{-140,50},{-140,36},{-122,36}},
|
|---|
| 54 | color={0,0,127},
|
|---|
| 55 | smooth=Smooth.None));
|
|---|
| 56 | connect(hysteresis.y, not1.u) annotation (Line(
|
|---|
| 57 | points={{41,70},{58,70}},
|
|---|
| 58 | color={255,0,255},
|
|---|
| 59 | smooth=Smooth.None));
|
|---|
| 60 | connect(not1.y, booleanToReal.u) annotation (Line(
|
|---|
| 61 | points={{81,70},{98,70}},
|
|---|
| 62 | color={255,0,255},
|
|---|
| 63 | smooth=Smooth.None));
|
|---|
| 64 | annotation (Diagram(coordinateSystem(preserveAspectRatio=true, extent={{
|
|---|
| 65 | -200,-200},{200,200}}), graphics), Icon(coordinateSystem(
|
|---|
| 66 | preserveAspectRatio=true, extent={{-200,-200},{200,200}})));
|
|---|
| 67 | end HeatedRoom_BlockDiagram;
|
|---|
| 68 |
|
|---|
| 69 | model HeatedRoom_BlockDiagramStructured
|
|---|
| 70 |
|
|---|
| 71 | Modelica.Blocks.Sources.Constant const(k=5)
|
|---|
| 72 | annotation (Placement(transformation(extent={{-60,20},{-40,40}})));
|
|---|
| 73 | Modelica.Blocks.Sources.Constant Outside_Temperature(k=13)
|
|---|
| 74 | annotation (Placement(transformation(extent={{-220,-70},{-200,-50}})));
|
|---|
| 75 | Modelica.Blocks.Math.Add add(k1=-0.1, k2=+0.1)
|
|---|
| 76 | annotation (Placement(transformation(extent={{0,-60},{20,-40}})));
|
|---|
| 77 | Modelica.Blocks.Math.Add add1
|
|---|
| 78 | annotation (Placement(transformation(extent={{60,-10},{80,10}})));
|
|---|
| 79 | Modelica.Blocks.Math.Product product
|
|---|
| 80 | annotation (Placement(transformation(extent={{0,30},{20,50}})));
|
|---|
| 81 | Modelica.Blocks.Continuous.Integrator integrator(y_start=17)
|
|---|
| 82 | annotation (Placement(transformation(extent={{100,-10},{120,10}})));
|
|---|
| 83 | Modelica.Blocks.Logical.Hysteresis hysteresis(uLow=15, uHigh=20)
|
|---|
| 84 | annotation (Placement(transformation(extent={{-220,80},{-200,100}})));
|
|---|
| 85 | Modelica.Blocks.Math.BooleanToReal booleanToReal
|
|---|
| 86 | annotation (Placement(transformation(extent={{-140,80},{-120,100}})));
|
|---|
| 87 | Modelica.Blocks.Logical.Not not1
|
|---|
| 88 | annotation (Placement(transformation(extent={{-180,80},{-160,100}})));
|
|---|
| 89 | equation
|
|---|
| 90 | connect(const.y, product.u2) annotation (Line(
|
|---|
| 91 | points={{-39,30},{-20,30},{-20,34},{-2,34}},
|
|---|
| 92 | color={0,0,127},
|
|---|
| 93 | smooth=Smooth.None));
|
|---|
| 94 | connect(Outside_Temperature.y, add.u2) annotation (Line(
|
|---|
| 95 | points={{-199,-60},{-20,-60},{-20,-56},{-2,-56}},
|
|---|
| 96 | color={0,0,127},
|
|---|
| 97 | smooth=Smooth.None));
|
|---|
| 98 | connect(product.y, add1.u1) annotation (Line(
|
|---|
| 99 | points={{21,40},{40,40},{40,6},{58,6}},
|
|---|
| 100 | color={0,0,127},
|
|---|
| 101 | smooth=Smooth.None));
|
|---|
| 102 | connect(add.y, add1.u2) annotation (Line(
|
|---|
| 103 | points={{21,-50},{40,-50},{40,-6},{58,-6}},
|
|---|
| 104 | color={0,0,127},
|
|---|
| 105 | smooth=Smooth.None));
|
|---|
| 106 | connect(add1.y, integrator.u) annotation (Line(
|
|---|
| 107 | points={{81,0},{98,0}},
|
|---|
| 108 | color={0,0,127},
|
|---|
| 109 | smooth=Smooth.None));
|
|---|
| 110 | connect(integrator.y, add.u1) annotation (Line(
|
|---|
| 111 | points={{121,0},{180,0},{180,-30},{-20,-30},{-20,-44},{-2,-44}},
|
|---|
| 112 | color={0,0,127},
|
|---|
| 113 | smooth=Smooth.None));
|
|---|
| 114 | connect(integrator.y, hysteresis.u) annotation (Line(
|
|---|
| 115 | points={{121,0},{180,0},{180,140},{-260,140},{-260,90},{-222,90}},
|
|---|
| 116 | color={0,0,127},
|
|---|
| 117 | smooth=Smooth.None));
|
|---|
| 118 | connect(hysteresis.y, not1.u) annotation (Line(
|
|---|
| 119 | points={{-199,90},{-182,90}},
|
|---|
| 120 | color={255,0,255},
|
|---|
| 121 | smooth=Smooth.None));
|
|---|
| 122 | connect(not1.y, booleanToReal.u) annotation (Line(
|
|---|
| 123 | points={{-159,90},{-142,90}},
|
|---|
| 124 | color={255,0,255},
|
|---|
| 125 | smooth=Smooth.None));
|
|---|
| 126 | connect(booleanToReal.y, product.u1) annotation (Line(
|
|---|
| 127 | points={{-119,90},{-20,90},{-20,46},{-2,46}},
|
|---|
| 128 | color={0,0,127},
|
|---|
| 129 | smooth=Smooth.None));
|
|---|
| 130 | annotation (Diagram(coordinateSystem(preserveAspectRatio=true, extent={{
|
|---|
| 131 | -300,-200},{300,200}}), graphics={
|
|---|
| 132 | Rectangle(
|
|---|
| 133 | extent={{-80,60},{160,-100}},
|
|---|
| 134 | lineColor={0,0,255},
|
|---|
| 135 | fillColor={170,255,213},
|
|---|
| 136 | fillPattern=FillPattern.Solid),
|
|---|
| 137 | Rectangle(
|
|---|
| 138 | extent={{-240,-20},{-100,-100}},
|
|---|
| 139 | lineColor={0,0,255},
|
|---|
| 140 | fillColor={170,213,255},
|
|---|
| 141 | fillPattern=FillPattern.Solid),
|
|---|
| 142 | Rectangle(
|
|---|
| 143 | extent={{-240,120},{-100,60}},
|
|---|
| 144 | lineColor={0,0,255},
|
|---|
| 145 | fillColor={255,213,170},
|
|---|
| 146 | fillPattern=FillPattern.Solid),
|
|---|
| 147 | Text(
|
|---|
| 148 | extent={{-244,70},{-168,66}},
|
|---|
| 149 | lineColor={0,0,255},
|
|---|
| 150 | fillColor={170,213,255},
|
|---|
| 151 | fillPattern=FillPattern.Solid,
|
|---|
| 152 | textString="Heater controller"),
|
|---|
| 153 | Text(
|
|---|
| 154 | extent={{-232,-92},{-172,-92}},
|
|---|
| 155 | lineColor={0,0,255},
|
|---|
| 156 | fillColor={170,213,255},
|
|---|
| 157 | fillPattern=FillPattern.Solid,
|
|---|
| 158 | textString="Outside weather"),
|
|---|
| 159 | Text(
|
|---|
| 160 | extent={{-68,-90},{-18,-92}},
|
|---|
| 161 | lineColor={0,0,255},
|
|---|
| 162 | fillColor={170,213,255},
|
|---|
| 163 | fillPattern=FillPattern.Solid,
|
|---|
| 164 | textString="Heated room")}), Icon(coordinateSystem(
|
|---|
| 165 | preserveAspectRatio=true, extent={{-300,-200},{300,200}})));
|
|---|
| 166 | end HeatedRoom_BlockDiagramStructured;
|
|---|
| 167 |
|
|---|
| 168 | model HeatedRoom_Equational
|
|---|
| 169 |
|
|---|
| 170 | HeatedRoom heatedRoom
|
|---|
| 171 | annotation (Placement(transformation(extent={{20,-6},{60,14}})));
|
|---|
| 172 | HeaterController heaterController
|
|---|
| 173 | annotation (Placement(transformation(extent={{-86,18},{-42,38}})));
|
|---|
| 174 | OutsideWeather outsideWeather
|
|---|
| 175 | annotation (Placement(transformation(extent={{-64,-20},{-20,0}})));
|
|---|
| 176 | Heater heater
|
|---|
| 177 | annotation (Placement(transformation(extent={{-22,18},{-2,38}})));
|
|---|
| 178 | equation
|
|---|
| 179 | connect(heatedRoom.RoomTemperature, heaterController.RoomTemperature)
|
|---|
| 180 | annotation (Line(
|
|---|
| 181 | points={{62,4},{80,4},{80,60},{-98,60},{-98,28},{-90.4,28}},
|
|---|
| 182 | color={0,0,127},
|
|---|
| 183 | smooth=Smooth.None));
|
|---|
| 184 | connect(outsideWeather.Outside_Temperature, heatedRoom.Outside_Temperature)
|
|---|
| 185 | annotation (Line(
|
|---|
| 186 | points={{-17.8,-10},{0,-10},{0,-2},{16,-2}},
|
|---|
| 187 | color={0,0,127},
|
|---|
| 188 | smooth=Smooth.Bezier));
|
|---|
| 189 | connect(heaterController.HeaterControl, heater.u) annotation (Line(
|
|---|
| 190 | points={{-39.8,28},{-24,28}},
|
|---|
| 191 | color={0,0,127},
|
|---|
| 192 | smooth=Smooth.None));
|
|---|
| 193 | connect(heater.y, heatedRoom.HeaterControl) annotation (Line(
|
|---|
| 194 | points={{-1,28},{6,28},{6,10},{16,10}},
|
|---|
| 195 | color={0,0,127},
|
|---|
| 196 | smooth=Smooth.Bezier));
|
|---|
| 197 | annotation (Diagram(graphics),
|
|---|
| 198 | experiment(StopTime=1000),
|
|---|
| 199 | __Dymola_experimentSetupOutput);
|
|---|
| 200 | end HeatedRoom_Equational;
|
|---|
| 201 |
|
|---|
| 202 | model HeatedRoom
|
|---|
| 203 | parameter Real CoeffOutsideTemperature = 0.1
|
|---|
| 204 | "Coefficient to take into account the outside temperature (-)";
|
|---|
| 205 | parameter Real CoeffHeaterController = 5
|
|---|
| 206 | "Coefficient to take into account the heater controller (-)";
|
|---|
| 207 | parameter Real RoomTemperatureInit = 17
|
|---|
| 208 | "Initial temperature of the room (°C)";
|
|---|
| 209 | Real T(start=RoomTemperatureInit) "Room temperature";
|
|---|
| 210 |
|
|---|
| 211 | Real MeanTemperature[10]( start = 17* ones(10)); //creates bad results
|
|---|
| 212 | // Real MeanTemperature[10];
|
|---|
| 213 | Real temper[10];
|
|---|
| 214 | Integer k(start=0);
|
|---|
| 215 | Integer i;
|
|---|
| 216 |
|
|---|
| 217 | Modelica.Blocks.Interfaces.RealInput HeaterControl
|
|---|
| 218 | annotation (Placement(transformation(extent={{-140,40},{-100,80}}),
|
|---|
| 219 | iconTransformation(extent={{-140,40},{-100,80}})));
|
|---|
| 220 | Modelica.Blocks.Interfaces.RealInput Outside_Temperature
|
|---|
| 221 | annotation (Placement(transformation(extent={{-140,-80},{-100,-40}})));
|
|---|
| 222 | Modelica.Blocks.Interfaces.RealOutput RoomTemperature
|
|---|
| 223 | annotation (Placement(transformation(extent={{100,-10},{120,10}})));
|
|---|
| 224 |
|
|---|
| 225 | equation
|
|---|
| 226 | der(T)= CoeffOutsideTemperature*(Outside_Temperature - T) + CoeffHeaterController*HeaterControl;
|
|---|
| 227 | RoomTemperature = T;
|
|---|
| 228 |
|
|---|
| 229 | algorithm
|
|---|
| 230 |
|
|---|
| 231 | when sample(0,100) then
|
|---|
| 232 | reinit( T,RoomTemperatureInit);
|
|---|
| 233 | k:=1+integer(time/100);
|
|---|
| 234 | end when;
|
|---|
| 235 |
|
|---|
| 236 | when sample(0,10) then
|
|---|
| 237 | i:=1+integer((time-(k-1)*100)/ 10);
|
|---|
| 238 | temper[i]:=T + temper[i];
|
|---|
| 239 | MeanTemperature[i]:=temper[i]/k;
|
|---|
| 240 | end when;
|
|---|
| 241 |
|
|---|
| 242 | annotation (Diagram(graphics={Rectangle(extent={{-100,100},{100,-100}},
|
|---|
| 243 | lineColor={0,0,255})}), Icon(graphics={Rectangle(extent={{-100,100},
|
|---|
| 244 | {100,-100}}, lineColor={0,0,255}), Text(
|
|---|
| 245 | extent={{-62,22},{54,-18}},
|
|---|
| 246 | lineColor={0,0,255},
|
|---|
| 247 | fillPattern=FillPattern.Solid,
|
|---|
| 248 | textString="%name")}),
|
|---|
| 249 | experiment(StopTime=1000),
|
|---|
| 250 | __Dymola_experimentSetupOutput);
|
|---|
| 251 | end HeatedRoom;
|
|---|
| 252 |
|
|---|
| 253 | model HeaterController
|
|---|
| 254 | parameter Real TemperatureMin = 15
|
|---|
| 255 | "Minimal temperature from which the heater starts (°C)";
|
|---|
| 256 | parameter Real TemperatureMax = 20
|
|---|
| 257 | "Maximal temperature from which the heater stops (°C)";
|
|---|
| 258 | Modelica.Blocks.Interfaces.RealInput RoomTemperature
|
|---|
| 259 | annotation (Placement(transformation(extent={{-140,-20},{-100,20}})));
|
|---|
| 260 | Modelica.Blocks.Interfaces.RealOutput HeaterControl
|
|---|
| 261 | annotation (Placement(transformation(extent={{100,-10},{120,10}})));
|
|---|
| 262 | Modelica.Blocks.Logical.Hysteresis hysteresis(uLow=TemperatureMin, uHigh=
|
|---|
| 263 | TemperatureMax)
|
|---|
| 264 | annotation (Placement(transformation(extent={{-60,-10},{-40,10}})));
|
|---|
| 265 | Modelica.Blocks.Logical.Not not1
|
|---|
| 266 | annotation (Placement(transformation(extent={{-20,-10},{0,10}})));
|
|---|
| 267 | Modelica.Blocks.Math.BooleanToReal booleanToReal
|
|---|
| 268 | annotation (Placement(transformation(extent={{20,-10},{40,10}})));
|
|---|
| 269 | equation
|
|---|
| 270 | connect(RoomTemperature, hysteresis.u) annotation (Line(
|
|---|
| 271 | points={{-120,0},{-62,0}},
|
|---|
| 272 | color={0,0,127},
|
|---|
| 273 | smooth=Smooth.None));
|
|---|
| 274 | connect(hysteresis.y, not1.u) annotation (Line(
|
|---|
| 275 | points={{-39,0},{-22,0}},
|
|---|
| 276 | color={255,0,255},
|
|---|
| 277 | smooth=Smooth.None));
|
|---|
| 278 | connect(not1.y, booleanToReal.u) annotation (Line(
|
|---|
| 279 | points={{1,0},{18,0}},
|
|---|
| 280 | color={255,0,255},
|
|---|
| 281 | smooth=Smooth.None));
|
|---|
| 282 | connect(booleanToReal.y, HeaterControl) annotation (Line(
|
|---|
| 283 | points={{41,0},{110,0}},
|
|---|
| 284 | color={0,0,127},
|
|---|
| 285 | smooth=Smooth.None));
|
|---|
| 286 | annotation (Diagram(graphics={Rectangle(extent={{-100,100},{100,-100}},
|
|---|
| 287 | lineColor={0,0,255})}), Icon(graphics={Rectangle(extent={{-100,100},
|
|---|
| 288 | {100,-100}}, lineColor={0,0,255}), Text(
|
|---|
| 289 | extent={{-62,22},{54,-18}},
|
|---|
| 290 | lineColor={0,0,255},
|
|---|
| 291 | fillPattern=FillPattern.Solid,
|
|---|
| 292 | textString="%name")}));
|
|---|
| 293 | end HeaterController;
|
|---|
| 294 |
|
|---|
| 295 | model OutsideWeather
|
|---|
| 296 | parameter Real OutsideTemperature = 13 "Outside temperature (°C)";
|
|---|
| 297 | Modelica.Blocks.Interfaces.RealOutput Outside_Temperature
|
|---|
| 298 | annotation (Placement(transformation(extent={{100,-10},{120,10}})));
|
|---|
| 299 | Modelica.Blocks.Sources.Constant Outside_Temperature1(k=OutsideTemperature)
|
|---|
| 300 | annotation (Placement(transformation(extent={{-20,-10},{0,10}})));
|
|---|
| 301 | equation
|
|---|
| 302 | connect(Outside_Temperature1.y, Outside_Temperature) annotation (Line(
|
|---|
| 303 | points={{1,0},{110,0}},
|
|---|
| 304 | color={0,0,127},
|
|---|
| 305 | smooth=Smooth.None));
|
|---|
| 306 | annotation (Diagram(graphics={Rectangle(extent={{-100,100},{100,-100}},
|
|---|
| 307 | lineColor={0,0,255})}), Icon(graphics={Rectangle(extent={{-100,100},
|
|---|
| 308 | {100,-100}}, lineColor={0,0,255}), Text(
|
|---|
| 309 | extent={{-62,22},{54,-18}},
|
|---|
| 310 | lineColor={0,0,255},
|
|---|
| 311 | fillPattern=FillPattern.Solid,
|
|---|
| 312 | textString="%name")}));
|
|---|
| 313 | end OutsideWeather;
|
|---|
| 314 |
|
|---|
| 315 | model Heater
|
|---|
| 316 |
|
|---|
| 317 | extends Modelica.Blocks.Interfaces.SISO;
|
|---|
| 318 |
|
|---|
| 319 | Boolean working(start = true);
|
|---|
| 320 | Real starttime_working( start = 0);
|
|---|
| 321 | Real starttime_notworking( start = 0);
|
|---|
| 322 |
|
|---|
| 323 | // In fact the 3 following parameters are integers, but they must be declared as real numbers because
|
|---|
| 324 | // the maximum value of an integer is 2^31 (?)
|
|---|
| 325 | // parameter Real m(start = 4294967296); // m = 2^32, parameter of the pseudo-random generator
|
|---|
| 326 | // parameter Real a(start=214013); // parameter of the pseudo-random generator
|
|---|
| 327 | //parameter Real c(start=2531011); // parameter of the pseudo-random generator
|
|---|
| 328 | Real x;
|
|---|
| 329 | Real x1;
|
|---|
| 330 | parameter Real lambda = 0.03;
|
|---|
| 331 | parameter Real mu = 0.1;
|
|---|
| 332 |
|
|---|
| 333 | //parameter Real seed( start = 1973272912);
|
|---|
| 334 |
|
|---|
| 335 | //Real F; //The successive values of F will be a suite of pseudo-random numbers with a uniform distribution on [0,1]
|
|---|
| 336 | Real X;
|
|---|
| 337 | Real Y;
|
|---|
| 338 | parameter Integer[3] seed_vector( start={1,15,3});
|
|---|
| 339 | Integer[3] rand_vector;
|
|---|
| 340 | Integer[3] pre_rand_vector;
|
|---|
| 341 | algorithm
|
|---|
| 342 |
|
|---|
| 343 | //when initial() then
|
|---|
| 344 | // F := seed;
|
|---|
| 345 | //end when;
|
|---|
| 346 | when initial() then
|
|---|
| 347 | rand_vector:=seed_vector;
|
|---|
| 348 | end when;
|
|---|
| 349 | // Attention: the two following rules must not be merged in a single one!
|
|---|
| 350 | //when initial() then //calculating the first random working time
|
|---|
| 351 | // F := mod(a*F+c, m);
|
|---|
| 352 | // x := F / m;
|
|---|
| 353 | // X:= (-log(1-x))/lambda;
|
|---|
| 354 | //end when;
|
|---|
| 355 |
|
|---|
| 356 | when working then //random draw of the next working time
|
|---|
| 357 | //F := mod(a*F+c, m);
|
|---|
| 358 | pre_rand_vector:=pre(rand_vector);
|
|---|
| 359 | (x,rand_vector):=trials.GoodRandom(pre_rand_vector);
|
|---|
| 360 | //x := F / m;
|
|---|
| 361 | X:= (-log(1-x))/lambda;
|
|---|
| 362 | end when;
|
|---|
| 363 |
|
|---|
| 364 | when (not working) then //random draw of the next failure time
|
|---|
| 365 | //F:= mod(a*F+c, m);
|
|---|
| 366 | //x1 := F / m;
|
|---|
| 367 | pre_rand_vector:=pre(rand_vector);
|
|---|
| 368 | (x1, rand_vector):=trials.GoodRandom(pre_rand_vector);
|
|---|
| 369 | Y:= (-log(1-x1))/mu;
|
|---|
| 370 | end when;
|
|---|
| 371 |
|
|---|
| 372 | // X is the working time
|
|---|
| 373 | when working and (time - starttime_working) > X then
|
|---|
| 374 | working := false;
|
|---|
| 375 | starttime_notworking := time;
|
|---|
| 376 | end when;
|
|---|
| 377 |
|
|---|
| 378 | // Y is the failure time
|
|---|
| 379 | when (not working) and (time - starttime_notworking) > Y then
|
|---|
| 380 | working := true;
|
|---|
| 381 | starttime_working := time;
|
|---|
| 382 | end when;
|
|---|
| 383 |
|
|---|
| 384 | // Reinitialization every 100 hours
|
|---|
| 385 | when sample(0, 100) then
|
|---|
| 386 | working:=true;
|
|---|
| 387 | starttime_working := time;
|
|---|
| 388 | end when;
|
|---|
| 389 |
|
|---|
| 390 | // Input-output relation
|
|---|
| 391 | equation
|
|---|
| 392 | if working then
|
|---|
| 393 | y = u;
|
|---|
| 394 | else
|
|---|
| 395 | y = 0.;
|
|---|
| 396 | end if;
|
|---|
| 397 |
|
|---|
| 398 | annotation (experiment(StopTime=1000, NumberOfIntervals=10),
|
|---|
| 399 | __Dymola_experimentSetupOutput,
|
|---|
| 400 | Icon(graphics={
|
|---|
| 401 | Text(
|
|---|
| 402 | extent={{-14,-8},{-18,2}},
|
|---|
| 403 | lineColor={0,0,255},
|
|---|
| 404 | textString="%name"),
|
|---|
| 405 | Rectangle(extent={{-68,68},{-14,34}}, lineColor={0,0,255}),
|
|---|
| 406 | Text(
|
|---|
| 407 | extent={{-84,20},{92,-16}},
|
|---|
| 408 | lineColor={0,0,255},
|
|---|
| 409 | textString="%name")}),
|
|---|
| 410 | Diagram(graphics));
|
|---|
| 411 | end Heater;
|
|---|
| 412 |
|
|---|
| 413 | package trials
|
|---|
| 414 |
|
|---|
| 415 | function rand "rand"
|
|---|
| 416 | output Integer y;
|
|---|
| 417 | external "C" y = rand(0);
|
|---|
| 418 | annotation (
|
|---|
| 419 | Coordsys(
|
|---|
| 420 | extent=[-100, -100; 100, 100],
|
|---|
| 421 | grid=[2, 2],
|
|---|
| 422 | component=[20, 20]),
|
|---|
| 423 | Window(
|
|---|
| 424 | x=0.45,
|
|---|
| 425 | y=0.01,
|
|---|
| 426 | width=0.35,
|
|---|
| 427 | height=0.49),
|
|---|
| 428 | Icon(
|
|---|
| 429 | Text(
|
|---|
| 430 | extent=[-84, 18; 84, -30],
|
|---|
| 431 | string="fonction",
|
|---|
| 432 | style(color=45)),
|
|---|
| 433 | Text(extent=[-134, 104; 142, 44], string="%name"),
|
|---|
| 434 | Ellipse(extent=[-100, 40; 100, -100], style(color=45, fillPattern=0)),
|
|---|
| 435 | Text(
|
|---|
| 436 | extent=[-82, -22; 86, -70],
|
|---|
| 437 | string="externe",
|
|---|
| 438 | style(color=45))),
|
|---|
| 439 | Documentation(info="<html>
|
|---|
| 440 | <p><b>Version 1.0</b></p>
|
|---|
| 441 | </HTML>
|
|---|
| 442 | "));
|
|---|
| 443 | end rand;
|
|---|
| 444 |
|
|---|
| 445 | function srand "rand"
|
|---|
| 446 | input Integer u;
|
|---|
| 447 | external "C" srand(u);
|
|---|
| 448 | annotation (
|
|---|
| 449 | Coordsys(
|
|---|
| 450 | extent=[-100, -100; 100, 100],
|
|---|
| 451 | grid=[2, 2],
|
|---|
| 452 | component=[20, 20]),
|
|---|
| 453 | Window(
|
|---|
| 454 | x=0.26,
|
|---|
| 455 | y=0.28,
|
|---|
| 456 | width=0.6,
|
|---|
| 457 | height=0.6),
|
|---|
| 458 | Icon(
|
|---|
| 459 | Text(extent=[-134, 104; 142, 44], string="%name"),
|
|---|
| 460 | Ellipse(extent=[-100, 40; 100, -100], style(color=45, fillPattern=0)),
|
|---|
| 461 | Text(
|
|---|
| 462 | extent=[-84, 18; 84, -30],
|
|---|
| 463 | string="fonction",
|
|---|
| 464 | style(color=45)),
|
|---|
| 465 | Text(
|
|---|
| 466 | extent=[-82, -22; 86, -70],
|
|---|
| 467 | string="externe",
|
|---|
| 468 | style(color=45))),
|
|---|
| 469 | Documentation(info="<html>
|
|---|
| 470 | <p><b>Version 1.0</b></p>
|
|---|
| 471 | </HTML>
|
|---|
| 472 | "));
|
|---|
| 473 | end srand;
|
|---|
| 474 |
|
|---|
| 475 | function fmod "fmod"
|
|---|
| 476 | input Real u1;
|
|---|
| 477 | input Real u2;
|
|---|
| 478 | output Real y;
|
|---|
| 479 | external "C" y = fmod(u1, u2);
|
|---|
| 480 | annotation (Icon(
|
|---|
| 481 | Text(extent=[-134,104; 142,44], string="%name"),
|
|---|
| 482 | Ellipse(extent=[-100,40; 100,-100], style(color=45, fillPattern=0)),
|
|---|
| 483 | Text(
|
|---|
| 484 | extent=[-84,18; 84,-30],
|
|---|
| 485 | string="fonction",
|
|---|
| 486 | style(color=45)),
|
|---|
| 487 | Text(
|
|---|
| 488 | extent=[-82,-22; 86,-70],
|
|---|
| 489 | string="externe",
|
|---|
| 490 | style(color=45))), Documentation(info="<html>
|
|---|
| 491 | <p><b>Version 1.6</b></p>
|
|---|
| 492 | </HTML>
|
|---|
| 493 | "));
|
|---|
| 494 | end fmod;
|
|---|
| 495 |
|
|---|
| 496 | function random
|
|---|
| 497 | annotation (DymolaStoredErrors(thetext="function random
|
|---|
| 498 |
|
|---|
| 499 | algorithm
|
|---|
| 500 |
|
|---|
| 501 | parameter Integer seed=1 \"Source du générateur aléatoire\";
|
|---|
| 502 | parameter Real SampleOffset=0 \"Instant de départ de l'échantillonnage (s)\";
|
|---|
| 503 | parameter Real SampleInterval=0.01 \"Période d'échantillonnage (s)\";
|
|---|
| 504 |
|
|---|
| 505 | equation
|
|---|
| 506 |
|
|---|
| 507 | when initial() then
|
|---|
| 508 | Commun.srand(seed);
|
|---|
| 509 | end when;
|
|---|
| 510 |
|
|---|
| 511 | when sample(SampleOffset, SampleInterval) then
|
|---|
| 512 | y.signal = Commun.fmod(Commun.rand()/32768*10, 1);
|
|---|
| 513 | end when;
|
|---|
| 514 |
|
|---|
| 515 |
|
|---|
| 516 | end random;
|
|---|
| 517 | "));
|
|---|
| 518 | end random;
|
|---|
| 519 |
|
|---|
| 520 | model test_states
|
|---|
| 521 | Modelica.StateGraph.InitialStep initialStep
|
|---|
| 522 | annotation (Placement(transformation(extent={{-82,16},{-62,36}})));
|
|---|
| 523 | Modelica.StateGraph.Step step
|
|---|
| 524 | annotation (Placement(transformation(extent={{-68,-34},{-48,-14}})));
|
|---|
| 525 | Modelica.StateGraph.Transition transition(
|
|---|
| 526 | enableTimer=true,
|
|---|
| 527 | condition=true,
|
|---|
| 528 | waitTime=-10)
|
|---|
| 529 | annotation (Placement(transformation(extent={{-38,16},{-18,36}})));
|
|---|
| 530 | Modelica.StateGraph.Alternative alternative
|
|---|
| 531 | annotation (Placement(transformation(extent={{-16,-72},{52,-4}})));
|
|---|
| 532 | Modelica.StateGraph.Step step1
|
|---|
| 533 | annotation (Placement(transformation(extent={{-74,-80},{-54,-60}})));
|
|---|
| 534 | equation
|
|---|
| 535 | connect(transition.outPort, step.inPort[1]) annotation (Line(
|
|---|
| 536 | points={{-26.5,26},{12,26},{12,4},{-86,4},{-86,-24},{-69,-24}},
|
|---|
| 537 | color={0,0,0},
|
|---|
| 538 | smooth=Smooth.None));
|
|---|
| 539 | connect(initialStep.outPort[1], transition.inPort) annotation (Line(
|
|---|
| 540 | points={{-61.5,26},{-32,26}},
|
|---|
| 541 | color={0,0,0},
|
|---|
| 542 | smooth=Smooth.None));
|
|---|
| 543 | connect(step.outPort[1], alternative.inPort) annotation (Line(
|
|---|
| 544 | points={{-47.5,-24},{-34,-24},{-34,-38},{-17.02,-38}},
|
|---|
| 545 | color={0,0,0},
|
|---|
| 546 | smooth=Smooth.None));
|
|---|
| 547 | connect(step1.outPort[1], alternative.inPort) annotation (Line(
|
|---|
| 548 | points={{-53.5,-70},{-32,-70},{-32,-38},{-17.02,-38}},
|
|---|
| 549 | color={0,0,0},
|
|---|
| 550 | smooth=Smooth.None));
|
|---|
| 551 | annotation (Diagram(graphics));
|
|---|
| 552 | end test_states;
|
|---|
| 553 |
|
|---|
| 554 | function MyRandom
|
|---|
| 555 | "Attempt to define a \"global\" function that could be called from various classes"
|
|---|
| 556 |
|
|---|
| 557 | parameter Integer m(start = (2^31)-1);
|
|---|
| 558 | parameter Integer a(start=214013);
|
|---|
| 559 | parameter Integer c(start=2531011); /// Microsoft Visual/Quick C/C++
|
|---|
| 560 | Integer x;
|
|---|
| 561 | Integer xiplus;
|
|---|
| 562 | Boolean first( start = true);
|
|---|
| 563 | output Real u; // pseudo random number in [0,1]
|
|---|
| 564 | parameter Integer seed( start = 12345);
|
|---|
| 565 |
|
|---|
| 566 | // the instructions below do not work because algorithm
|
|---|
| 567 | // is repeatedly executed !!
|
|---|
| 568 | algorithm
|
|---|
| 569 | if first then
|
|---|
| 570 | xiplus := seed;
|
|---|
| 571 | first := false;
|
|---|
| 572 | else
|
|---|
| 573 | xiplus := mod(a*x+c, m);
|
|---|
| 574 | end if;
|
|---|
| 575 |
|
|---|
| 576 | x := xiplus;
|
|---|
| 577 | u := xiplus / m;
|
|---|
| 578 |
|
|---|
| 579 | end MyRandom;
|
|---|
| 580 |
|
|---|
| 581 | block MyHysteresis
|
|---|
| 582 | "Transform Real to Boolean signal with Hysteresis and periodic reinitialization"
|
|---|
| 583 |
|
|---|
| 584 | extends Modelica.Blocks.Interfaces.partialBooleanBlockIcon;
|
|---|
| 585 | parameter Real uLow(start=0) "if y=true and u<=uLow, switch to y=false";
|
|---|
| 586 | parameter Real uHigh(start=1) "if y=false and u>=uHigh, switch to y=true";
|
|---|
| 587 | parameter Boolean pre_y_start=false "Value of pre(y) at initial time";
|
|---|
| 588 |
|
|---|
| 589 | Modelica.Blocks.Interfaces.RealInput u annotation (Placement(
|
|---|
| 590 | transformation(extent={
|
|---|
| 591 | {-140,-20},{-100,20}}, rotation=0)));
|
|---|
| 592 | Modelica.Blocks.Interfaces.BooleanOutput y
|
|---|
| 593 | annotation (Placement(transformation(extent={{100,-10},{120,10}},
|
|---|
| 594 | rotation=0)));
|
|---|
| 595 |
|
|---|
| 596 | //initial equation
|
|---|
| 597 | // pre(y) = pre_y_start;
|
|---|
| 598 |
|
|---|
| 599 | equation
|
|---|
| 600 | when sample(0, 100) then
|
|---|
| 601 | reinit(y, pre_y_start);
|
|---|
| 602 | end when;
|
|---|
| 603 | y = u > uHigh or pre(y) and u >= uLow;
|
|---|
| 604 | annotation (
|
|---|
| 605 | Diagram(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{
|
|---|
| 606 | 100,100}}), graphics={
|
|---|
| 607 | Polygon(
|
|---|
| 608 | points={{-65,89},{-73,67},{-57,67},{-65,89}},
|
|---|
| 609 | lineColor={192,192,192},
|
|---|
| 610 | fillColor={192,192,192},
|
|---|
| 611 | fillPattern=FillPattern.Solid),
|
|---|
| 612 | Line(points={{-65,67},{-65,-81}}, color={192,192,192}),
|
|---|
| 613 | Line(points={{-90,-70},{82,-70}}, color={192,192,192}),
|
|---|
| 614 | Polygon(
|
|---|
| 615 | points={{90,-70},{68,-62},{68,-78},{90,-70}},
|
|---|
| 616 | lineColor={192,192,192},
|
|---|
| 617 | fillColor={192,192,192},
|
|---|
| 618 | fillPattern=FillPattern.Solid),
|
|---|
| 619 | Text(
|
|---|
| 620 | extent={{70,-80},{94,-100}},
|
|---|
| 621 | lineColor={160,160,164},
|
|---|
| 622 | textString="u"),
|
|---|
| 623 | Text(
|
|---|
| 624 | extent={{-65,93},{-12,75}},
|
|---|
| 625 | lineColor={160,160,164},
|
|---|
| 626 | textString="y"),
|
|---|
| 627 | Line(
|
|---|
| 628 | points={{-80,-70},{30,-70}},
|
|---|
| 629 | color={0,0,0},
|
|---|
| 630 | thickness=0.5),
|
|---|
| 631 | Line(
|
|---|
| 632 | points={{-50,10},{80,10}},
|
|---|
| 633 | color={0,0,0},
|
|---|
| 634 | thickness=0.5),
|
|---|
| 635 | Line(
|
|---|
| 636 | points={{-50,10},{-50,-70}},
|
|---|
| 637 | color={0,0,0},
|
|---|
| 638 | thickness=0.5),
|
|---|
| 639 | Line(
|
|---|
| 640 | points={{30,10},{30,-70}},
|
|---|
| 641 | color={0,0,0},
|
|---|
| 642 | thickness=0.5),
|
|---|
| 643 | Line(
|
|---|
| 644 | points={{-10,-65},{0,-70},{-10,-75}},
|
|---|
| 645 | color={0,0,0},
|
|---|
| 646 | thickness=0.5),
|
|---|
| 647 | Line(
|
|---|
| 648 | points={{-10,15},{-20,10},{-10,5}},
|
|---|
| 649 | color={0,0,0},
|
|---|
| 650 | thickness=0.5),
|
|---|
| 651 | Line(
|
|---|
| 652 | points={{-55,-20},{-50,-30},{-44,-20}},
|
|---|
| 653 | color={0,0,0},
|
|---|
| 654 | thickness=0.5),
|
|---|
| 655 | Line(
|
|---|
| 656 | points={{25,-30},{30,-19},{35,-30}},
|
|---|
| 657 | color={0,0,0},
|
|---|
| 658 | thickness=0.5),
|
|---|
| 659 | Text(
|
|---|
| 660 | extent={{-99,2},{-70,18}},
|
|---|
| 661 | lineColor={160,160,164},
|
|---|
| 662 | textString="true"),
|
|---|
| 663 | Text(
|
|---|
| 664 | extent={{-98,-87},{-66,-73}},
|
|---|
| 665 | lineColor={160,160,164},
|
|---|
| 666 | textString="false"),
|
|---|
| 667 | Text(
|
|---|
| 668 | extent={{19,-87},{44,-70}},
|
|---|
| 669 | lineColor={0,0,0},
|
|---|
| 670 | textString="uHigh"),
|
|---|
| 671 | Text(
|
|---|
| 672 | extent={{-63,-88},{-38,-71}},
|
|---|
| 673 | lineColor={0,0,0},
|
|---|
| 674 | textString="uLow"),
|
|---|
| 675 | Line(points={{-69,10},{-60,10}}, color={160,160,164})}),
|
|---|
| 676 | Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100,
|
|---|
| 677 | 100}}), graphics={
|
|---|
| 678 | Polygon(
|
|---|
| 679 | points={{-80,90},{-88,68},{-72,68},{-80,90}},
|
|---|
| 680 | lineColor={192,192,192},
|
|---|
| 681 | fillColor={192,192,192},
|
|---|
| 682 | fillPattern=FillPattern.Solid),
|
|---|
| 683 | Line(points={{-80,68},{-80,-29}}, color={192,192,192}),
|
|---|
| 684 | Polygon(
|
|---|
| 685 | points={{92,-29},{70,-21},{70,-37},{92,-29}},
|
|---|
| 686 | lineColor={192,192,192},
|
|---|
| 687 | fillColor={192,192,192},
|
|---|
| 688 | fillPattern=FillPattern.Solid),
|
|---|
| 689 | Line(points={{-79,-29},{84,-29}}, color={192,192,192}),
|
|---|
| 690 | Line(points={{-79,-29},{41,-29}}, color={0,0,0}),
|
|---|
| 691 | Line(points={{-15,-21},{1,-29},{-15,-36}}, color={0,0,0}),
|
|---|
| 692 | Line(points={{41,51},{41,-29}}, color={0,0,0}),
|
|---|
| 693 | Line(points={{33,3},{41,22},{50,3}}, color={0,0,0}),
|
|---|
| 694 | Line(points={{-49,51},{81,51}}, color={0,0,0}),
|
|---|
| 695 | Line(points={{-4,59},{-19,51},{-4,43}}, color={0,0,0}),
|
|---|
| 696 | Line(points={{-59,29},{-49,11},{-39,29}}, color={0,0,0}),
|
|---|
| 697 | Line(points={{-49,51},{-49,-29}}, color={0,0,0}),
|
|---|
| 698 | Text(
|
|---|
| 699 | extent={{-92,-49},{-9,-92}},
|
|---|
| 700 | lineColor={192,192,192},
|
|---|
| 701 | textString="%uLow"),
|
|---|
| 702 | Text(
|
|---|
| 703 | extent={{2,-49},{91,-92}},
|
|---|
| 704 | lineColor={192,192,192},
|
|---|
| 705 | textString="%uHigh"),
|
|---|
| 706 | Rectangle(extent={{-91,-49},{-8,-92}}, lineColor={192,192,192}),
|
|---|
| 707 | Line(points={{-49,-29},{-49,-49}}, color={192,192,192}),
|
|---|
| 708 | Rectangle(extent={{2,-49},{91,-92}}, lineColor={192,192,192}),
|
|---|
| 709 | Line(points={{41,-29},{41,-49}}, color={192,192,192})}),
|
|---|
| 710 | Documentation(info="<HTML>
|
|---|
| 711 | <p>
|
|---|
| 712 | This block transforms a <b>Real</b> input signal into a <b>Boolean</b>
|
|---|
| 713 | output signal:
|
|---|
| 714 | </p>
|
|---|
| 715 | <ul>
|
|---|
| 716 | <li> When the output was <b>false</b> and the input becomes
|
|---|
| 717 | <b>greater</b> than parameter <b>uHigh</b>, the output
|
|---|
| 718 | switches to <b>true</b>.</li>
|
|---|
| 719 | <li> When the output was <b>true</b> and the input becomes
|
|---|
| 720 | <b>less</b> than parameter <b>uLow</b>, the output
|
|---|
| 721 | switches to <b>false</b>.</li>
|
|---|
| 722 | </ul>
|
|---|
| 723 | <p>
|
|---|
| 724 | The start value of the output is defined via parameter
|
|---|
| 725 | <b>pre_y_start</b> (= value of pre(y) at initial time).
|
|---|
| 726 | The default value of this parameter is <b>false</b>.
|
|---|
| 727 | </p>
|
|---|
| 728 | </HTML>
|
|---|
| 729 | "));
|
|---|
| 730 | end MyHysteresis;
|
|---|
| 731 |
|
|---|
| 732 | function GoodRandom "Pseudo random number generator"
|
|---|
| 733 |
|
|---|
| 734 | input Integer seedIn[3]
|
|---|
| 735 | "Integer vector defining random number sequence, e.g., {23,87,187}" annotation (extent=[-85, 15; -15, 85]);
|
|---|
| 736 | output Real x "Random number between 0 and 1";
|
|---|
| 737 | output Integer seedOut[3]
|
|---|
| 738 | "Modified seed to be used for next call of random()"
|
|---|
| 739 | annotation (extent=[15, 15; 85, 85]);
|
|---|
| 740 | algorithm
|
|---|
| 741 | seedOut[1] := rem((171*seedIn[1]), 30269);
|
|---|
| 742 | seedOut[2] := rem((172*seedIn[2]), 30307);
|
|---|
| 743 | seedOut[3] := rem((170*seedIn[3]), 30323);
|
|---|
| 744 | // zero is a poor seed, therfore substitute 1;
|
|---|
| 745 | if seedOut[1] == 0 then
|
|---|
| 746 | seedOut[1] := 1;
|
|---|
| 747 | end if;
|
|---|
| 748 | if seedOut[2] == 0 then
|
|---|
| 749 | seedOut[2] := 1;
|
|---|
| 750 | end if;
|
|---|
| 751 | if seedOut[3] == 0 then
|
|---|
| 752 | seedOut[3] := 1;
|
|---|
| 753 | end if;
|
|---|
| 754 | x := rem((seedOut[1]/30269.0 + seedOut[2]/30307.0 + seedOut[3]/30323.0), 1.0);
|
|---|
| 755 |
|
|---|
| 756 | annotation (
|
|---|
| 757 | Coordsys(
|
|---|
| 758 | extent=[-100, -100; 100, 100],
|
|---|
| 759 | grid=[2, 2],
|
|---|
| 760 | component=[20, 20]),
|
|---|
| 761 | Window(
|
|---|
| 762 | x=0.45,
|
|---|
| 763 | y=0.01,
|
|---|
| 764 | width=0.35,
|
|---|
| 765 | height=0.49),
|
|---|
| 766 | Documentation(info="<HTML>
|
|---|
| 767 | <p>
|
|---|
| 768 | <i>Random</i> generates a sequence of uniform distributed
|
|---|
| 769 | pseudo-random numbers. The algorithm is a variant of the
|
|---|
| 770 | multiplicative congruential algorithm, known as the
|
|---|
| 771 | Wichmann-Hill generator:
|
|---|
| 772 | <pre> x(k) = (a1*x(k-1)) mod m1
|
|---|
| 773 | y(k) = (a2*y(k-1)) mod m2
|
|---|
| 774 | z(k) = (a3*z(k-1)) mod m3
|
|---|
| 775 | U(k) = (x(k)/m1 + y(k)/m2 + z(k)/m3) mod 1
|
|---|
| 776 | </pre>
|
|---|
| 777 | This generates pseudo-random numbers U(k) uniformly distributed
|
|---|
| 778 | in the interval (0,1). There are many forms of generators depending
|
|---|
| 779 | on the parameters m (prime numbers) and a. The sequence needs an
|
|---|
| 780 | initial Integer vector {x,y,z} known as the seed. The use of the same
|
|---|
| 781 | seed will lead to the same sequence of numbers.
|
|---|
| 782 | </p>
|
|---|
| 783 | <p>
|
|---|
| 784 | <b>Remarks</b>
|
|---|
| 785 | </p>
|
|---|
| 786 | <p>Random number generators (RNG) are pseudo-functions which are not true
|
|---|
| 787 | functions but algorithms which deliver a fixed sequence of (usually Integer) numbers
|
|---|
| 788 | which should have a very large period before they repeat itself and
|
|---|
| 789 | appropriate statistic properties such that the sequence appears to be
|
|---|
| 790 | a random draw. For real-valued random numbers, the integers are scaled to
|
|---|
| 791 | the real interval 0.0-1.0. They result in a uniformly distributed random variate
|
|---|
| 792 | between 0-1, which has to be tranformed to give a random variate of a wanted
|
|---|
| 793 | distribution. There are two types of techniques for transforming random variates:
|
|---|
| 794 | </p>
|
|---|
| 795 | <ul>
|
|---|
| 796 | <li>Acceptance-Rejection techniques</li>
|
|---|
| 797 | <li>Transformation techniques</li>
|
|---|
| 798 | </ul>
|
|---|
| 799 | <p>Acceptance-Rejection techniques throw away some of the generated variates and are thus less efficient. They can not be avoided for all distributions. A good summary about random number generation and most of the transformation techniques used below is given in:</p>
|
|---|
| 800 | <address> Discrete Event Simulation <br>
|
|---|
| 801 | Jerry Banks and John S. Carson II<br>
|
|---|
| 802 | Prentice Hall Inc.<br>
|
|---|
| 803 | Englewood Cliffs, New Jersey<br>
|
|---|
| 804 | </address>
|
|---|
| 805 | <p>Some of the other references are quoted below.</p>
|
|---|
| 806 | <pre>
|
|---|
| 807 | WICHMANN-HILL RANDOM NUMBER GENERATOR
|
|---|
| 808 | Wichmann, B. A. & Hill, I. D. (1982)
|
|---|
| 809 | Algorithm AS 183:
|
|---|
| 810 | An efficient and portable pseudo-random number generator
|
|---|
| 811 | Applied Statistics 31 (1982) 188-190
|
|---|
| 812 | see also:
|
|---|
| 813 | Correction to Algorithm AS 183
|
|---|
| 814 | Applied Statistics 33 (1984) 123
|
|---|
| 815 | McLeod, A. I. (1985)
|
|---|
| 816 | A remark on Algorithm AS 183
|
|---|
| 817 | Applied Statistics 34 (1985),198-200
|
|---|
| 818 | In order to completely avoid external functions, all seeds are
|
|---|
| 819 | set via parameters. For simulation purposes this is almost
|
|---|
| 820 | always the desired behaviour.
|
|---|
| 821 | Translated by Hubertus Tummescheit from Python source provided by
|
|---|
| 822 | Guido van Rossum translated from C source by Adrian Baddeley.
|
|---|
| 823 | http://www.python.org/doc/current/lib/module-random.html
|
|---|
| 824 | R A N D O M V A R I A B L E G E N E R A T O R S
|
|---|
| 825 | distributions on the real line:
|
|---|
| 826 | ------------------------------
|
|---|
| 827 | normal (Gaussian) 2 versions
|
|---|
| 828 | </pre>
|
|---|
| 829 | <h4>Reference Literature:</h4>
|
|---|
| 830 | <ul>
|
|---|
| 831 | <li>function random: Wichmann, B. A. & Hill, I. D. (1982), Algorithm AS 183:
|
|---|
| 832 | <br>
|
|---|
| 833 | An efficient and portable pseudo-random number generator, Applied Statistics 31 (1982) 188-190<br>
|
|---|
| 834 | see also: Correction to Algorithm AS 183, Applied Statistics 33 (1984) 123 <br>
|
|---|
| 835 | McLeod, A. I. (1985), A remark on Algorithm AS 183, Applied Statistics 34 (1985),198-200</li>
|
|---|
| 836 | <li>function normalvariate: Kinderman, A.J. and Monahan, J.F., 'Computer generation of random
|
|---|
| 837 | variables using the ratio of uniform deviates', ACM Trans Math Software, 3, (1977),
|
|---|
| 838 | pp257-260.</li>
|
|---|
| 839 | <li>function gaussianvariate: Discrete Event Simulation, Jerry Banks and John S. Carson II,
|
|---|
| 840 | <br>
|
|---|
| 841 | Prentice Hall Inc. Englewood Cliffs, New Jersey, page 315/316</li>
|
|---|
| 842 | </ul>
|
|---|
| 843 | <p>
|
|---|
| 844 | Copyright © Hubertus Tummescheit and Department of Automatic Control, Lund University, Sweden.
|
|---|
| 845 | </p>
|
|---|
| 846 | <p>
|
|---|
| 847 | <i>This Modelica function is <b>free</b> software; it can be redistributed and/or modified
|
|---|
| 848 | under the terms of the <b>Modelica license</b>, see the license conditions
|
|---|
| 849 | and the accompanying <b>disclaimer</b>
|
|---|
| 850 | <a href=\"Modelica://Modelica.UsersGuide.ModelicaLicense\">here</a>.</i>
|
|---|
| 851 | </p>
|
|---|
| 852 | </HTML>
|
|---|
| 853 | "));
|
|---|
| 854 | end GoodRandom;
|
|---|
| 855 |
|
|---|
| 856 | model testGoodRandom
|
|---|
| 857 |
|
|---|
| 858 | parameter Integer[3] seed_vector( start={1,2,3});
|
|---|
| 859 | Integer[3] rand_vector;
|
|---|
| 860 | Integer[3] pre_rand_vector;
|
|---|
| 861 | output Real x;
|
|---|
| 862 |
|
|---|
| 863 | algorithm
|
|---|
| 864 | when initial() then
|
|---|
| 865 | rand_vector:=seed_vector;
|
|---|
| 866 | end when;
|
|---|
| 867 |
|
|---|
| 868 | when sample(0, 1) then
|
|---|
| 869 |
|
|---|
| 870 | pre_rand_vector:=pre(rand_vector);
|
|---|
| 871 | (x,rand_vector):=GoodRandom(pre_rand_vector);
|
|---|
| 872 |
|
|---|
| 873 | end when;
|
|---|
| 874 | end testGoodRandom;
|
|---|
| 875 | annotation (
|
|---|
| 876 | Coordsys(
|
|---|
| 877 | extent=[0, 0; 313, 206],
|
|---|
| 878 | grid=[2, 2],
|
|---|
| 879 | component=[20, 20]),
|
|---|
| 880 | Icon(
|
|---|
| 881 | Rectangle(extent=[-100, -100; 80, 50], style(fillColor=30, fillPattern=1)),
|
|---|
| 882 | Polygon(points=[-100, 50; -80, 70; 100, 70; 80, 50; -100, 50], style(
|
|---|
| 883 | fillColor=30, fillPattern=1)),
|
|---|
| 884 | Polygon(points=[100, 70; 100, -80; 80, -100; 80, 50; 100, 70], style(
|
|---|
| 885 | fillColor=30, fillPattern=1)),
|
|---|
| 886 | Text(
|
|---|
| 887 | extent=[-90, 40; 70, 10],
|
|---|
| 888 | string="Unites",
|
|---|
| 889 | style(
|
|---|
| 890 | color=9,
|
|---|
| 891 | fillColor=0,
|
|---|
| 892 | fillPattern=1)),
|
|---|
| 893 | Rectangle(extent=[-32, -6; 16, -35], style(color=0)),
|
|---|
| 894 | Rectangle(extent=[-32, -56; 16, -85], style(color=0)),
|
|---|
| 895 | Line(points=[16, -20; 49, -20; 49, -71; 16, -71], style(color=0)),
|
|---|
| 896 | Line(points=[-32, -72; -64, -72; -64, -21; -32, -21], style(color=0)),
|
|---|
| 897 | Text(
|
|---|
| 898 | extent=[-120, 135; 120, 70],
|
|---|
| 899 | string="%name",
|
|---|
| 900 | style(color=1))),
|
|---|
| 901 | Window(
|
|---|
| 902 | x=0.05,
|
|---|
| 903 | y=0.26,
|
|---|
| 904 | width=0.25,
|
|---|
| 905 | height=0.25,
|
|---|
| 906 | library=1,
|
|---|
| 907 | autolayout=1),
|
|---|
| 908 | Documentation(info="<html>
|
|---|
| 909 | <p><b>Version 1.1</b></p>
|
|---|
| 910 | </HTML>
|
|---|
| 911 | "));
|
|---|
| 912 | end trials;
|
|---|
| 913 |
|
|---|
| 914 | annotation (uses(Modelica(version="3.2")));
|
|---|
| 915 | end HeatedRoom;
|
|---|