Close
About
FAQ
Home
Collections
Login
USC Login
Register
0
Selected
Invert selection
Deselect all
Deselect all
Click here to refresh results
Click here to refresh results
USC
/
Digital Library
/
University of Southern California Dissertations and Theses
/
Automotive engine model linearization
(USC Thesis Other)
Automotive engine model linearization
PDF
Download
Share
Open document
Flip pages
Contact Us
Contact Us
Copy asset link
Request this asset
Transcript (if available)
Content
Automotive Engine Model Linearization by Kinping Lee A Thesis Submitted to the School of Engineering in Partial Fulfillment of the Requirements for the Degree of Master of Science in Mechanical Engineering December 1995 © Kinping Lee, December 1995 This thesis, written by ......^.pliM. f ...L.et/. under the guidance of Faculty Committee and approved by all its members, has been presented to and accepted by the School of Engineering in partial fulfillment of the re quirements for the degree of M^Ter e?£ Sct^liUAe. Date.. SL£E13ZL Faculty Committee (jEhairmap-~. £..SUk. Automotiv e Engine Model Linearization by Kinping, Lee Submitted to the Department of Mechanical Engineering on May 13, 1995, in partial fulfillment of the requirements for the degree of Master of Science Abstrac t A model of an automotive engine system is built through the study of the physical pro cesses involved in the operation of the engine. This engine model aims to reconstruct the characteristics of engine speed by changing the throttle angle. The engine system is divided into subsystems and is modeled by mathematical equations representing the operation of the subsystem. The construction and simulation of this nonlinear engine model are done on MATLAB SIMULINK. The speed characteristics of the engine is then estimated by three simple linear models: a first order model, a second order model and a second order model with transport delay. The parameters of the linear models are obtained through the frequency response analysis of the nonlinear engine model. By comparing the simulation result of the linear models with that of the nonlinear model, the second order model with transport delay is found to be the best estimation of the nonlinear engine model. Either a Proportional-plus-Integral (PI) or a Proportional-plus-Integral-plus-Derivative (PID) controller is designed for each of the three linear models. The controllers are then used in the nonlinear engine model. The simulation result of the controlled systems shows that the second order model with transport delay describes the actual response of the controlled nonlinear engine model best. Thesis Supervisor: Dr. Henryk Flashner Title: Associate Professor ii Contents 1 Introduction 1 1.1 Background 1 1.2 Objective 3 1.2.1 Engine Modeling 3 1.2.2 Model Evaluation 7 2 Formulation of Physically Based Engine Model 8 2.1 Intake Manifold 8 2.2 Fuel Delivery 12 2.3 Torque Production 13 2.4 Rotational Dynamics 16 3 Non-linear Engine Model 17 3.1 Model Structure 17 3.2 Engine Data and Parameters 18 3.2.1 Intake Manifold 18 3.2.2 Torque Production 22 iii 3.2.3 Rotational Dynamics 24 3.3 Simulation 24 4 Linear Engine Model 29 4.1 Linearization 29 4.1.1 Model Definition 29 4.1.2 Determination of the Operating Range 29 4.1.3 Determination of the Frequency Range 31 4.1.4 Frequency Response Analysis 37 4.1.5 Linear Model Estimation 41 4.2 First Order Model 43 4.3 Second Order Model 46 4.4 Second Order Model with Transport Delay 48 5 Controller Design 53 5.1 PI Control 53 5.2 PID Control 55 5.3 Testing 61 5.4 Design Guidelines 66 6 Discussion and Recommendations 69 7 Conclusions 75 A Program Code (C) 80 B SIMULINK Representation of the of the Engine Subsystems 102 iv C Operating Procedure 105 D M-file of the Engine Model 108 E MATLAB Program to Perform Spectral Analysis 137 v Chapter 1 Introduction 1.1 Background Automotive engine 1 modeling is important to the study of the problems of drivability, ex haust emission and fuel consumption. It is also useful for understanding the physical process involving in the operation of an engine. Therefore, it is desirable to have a comprehensive model which can precisely describe the engine operation. The. study of automotive engine system may include the analysis of the cooling system, the intake air system, the fueling system, the ignition system, the thermodynamics processes, the exhaust system and other engine management control such as idle speed control, emission control and exhaust gas recirculation control [2]. Different engine modeling methods have been studied and sophisticated models have been developed by many researchers. These models can be divided into two categories - the physically based models and the identification models. The physically based models 'Throughout this report, the terms "automotive engine" and "engine" are referred to the fuel injection spark ignition internal combustion engine. 1 (or dynamics models) are obtained by analyzing the physical processes involved in the engine operation. There are two common ways to define this model. One of these is to describe the induction process, the engine pumping characteristics and the torque output [5, 7, 11, 12, 13]. The other is similar but to capture the thermodynamics processes of the combustion instead of describing the characteristics of the engine pumping[l, 14, 16]. The identification models are obtained by applying identification techniques to construct the engine models. The constructed model can be a linear perturbation model [3, 9] or a non-linear model [10]. In general, both the physically based models and the identification models will have large and complex structures, and validation of model is required. As mentioned above, the problems related to the automotive engine are drivability, exhaust emission and fuel consumption. The control system of the engine is used to regulate these quality and quantities according to the specifications. Simply speaking, the functions of the control system are to keep the engine torque and speed in compliance with the driver's command, to minimize the exhaust emission as to reduce the pollution and to maintain a low fuel consumption rate. Control law have been developed for the four common engine control systems - throttle control [3, 9, 17], spark control [3, 9, 15], fuel control [3, 4, 6, 9, 15]and exhaust gas recirculation control [3]. The various control actions can be done by either separated control laws or combined control laws. The need of a dependable engine model for the control law development process is of great importance for a successful control system design. 2 1.2 Objective It is a common practice in control system development to approximate a complex non-linear model by a linear model. Linearization allows a convenient way to study the characteristics of complex systems such as engines. Also, with a large number of hand-on techniques, design of control law becomes easier. The aim of this study is to develope and evaluate the linear model approximations of a physically based non-linear engine model, of the relationship between the throttle angle and the engine speed. Then, simple control laws will be implemented on various linear models and their performance is evaluated using the non-linear engine model. The results will serve to establish guidelines as of linear model development of engines for control system design. 1.2.1 Engine Modeling A typical engine model usually has four inputs - throttle angle, spark command, fuel com mand and exhausted gas recirculation. The number of states and outputs depends on the information that the model is providing. Figure 1.1 shows a block diagram of a typical multi-input multi-output engine model. ^^â„¢ c i r> A r- 1 S* t k 'â„¢ rv-Ti J 1 ENGINE MODEL Speed Torque m • • Emission i i i Figure 1.1 : A Typical Engine Model 3 These inputs and outputs are related either by static equations and/or by dynamic equa tions. Physically based engine model is a complex non-linear model describing these rela tionships. Through the modeling of the physical processes involved in the engine operation, it is easier to understand the engine operation and to trace the error in the model. As a matter of fact, the number of processes involved is very large, and therefore, the engine model is divided into submodels. Chapter 2 gives the formulation of a physically based engine model and its submodels. This engine model is divided into four submodels - intake manifold, fuel delivery, torque production and rotational dynamics. A filling and emptying air flow model is used to described the intake manifold dynamics. This is a simplified model of the intake manifold [8]. It gives the characteristics of the change of intake manifold pressure with respect to the change in throttle angle, but no information concerning the pressure variation associated with the flow pulsation at the intake stroke of each cylinder. There are two major types of fuel injection systems - single-point throttle-body fuel injection system and multipoint port fuel injection system [8]. In the single-point fuel injection system, one or two injectors are used to inject the fuel into the air flow directly above the throttle body. In the multipoint port fuel injection system, each cylinder of the engine requires one injector to inject fuel into the intake port of the cylinder. There are also three different injection timings used in multipoint port fuel injection system - continuous injection, simultaneous double-firing injection and sequential injection [8]. For the continuous injection timing, the injection system injects fuel continuously in front of the intake valves with the spray directed toward the valves. For the simultaneous double-firing injection timing, all injectors are operated simultaneously and fuel is injected to the intake 4 port of each cylinder twice per cycle. For the sequential injection timing, the start time and duration of each injection is the same as the lift profile of the corresponding intake valve. The fuel delivery processes are complex and varying among different fuel injection systems and injection timings. In Chapter 2, only the formulation of an estimated model of the sequential port fuel injection system is presented [5]. The torque production model is a steady-state model with process delays. It describes the characteristics of the indicated torque production of the engine. Another torque related to the engine is the friction torque. A model, which is linear in engine speed is used to represent this torque. Other models used to represent the friction torque, include quadratic model [8] and the parabolic parameter model [12] The rotational dynamics of the engine is modeled by Newtons's Second Law. This can be done because of the use of constant inertia estimation in the engine model. Although the performance in prediction at high speed engine operation is not very accurate [12], the determination of the inertia is simple. Time-varying engine inertia can be also employed in some engine models [16]. However, although variable engine inertia models give more accurate prediction of engine operation, the complexity of the model is greatly increased. As the focus of this study is on the relationship between throttle and engine speed, fur ther simplification can be made to the above engine model. It is assumed that independent control systems are capable of keeping a good air fuel ratio and a proper spark timing. Therefore, the dynamics and controls of these two quantities are not necessary to include in the engine model. Furthermore, the exhaust gas recirculation is not considered in this model. 5 Simulation of the non-linear engine model is done by MATLAB SIMULINK. The data and parameters of this engine model are given in Chapter 3. The description of simulation and the simulated results are also given in the same chapter. Three linear models are used to approximate the relationship of the throttle angle and engine speed. Each model can be used as a representation of the engine operation within a given operating range. The linear models are developed based on steady-state response data and a response data of the two-state non-linear engine model responsed to harmonic excitation. The response data are obtained through simulations in MATLAB. In Chapter 4, the method used to determine the linear models and the model structure, as well as error analysis of the frequency response based modeling are presented. 6 1.2.2 Model Evaluation To assess the viability of the three linear model representations of the non-linear engine model, controllers are designed using the linear models. The performance of the control laws is tested using simulation that implements on the non-linear model. Proportional-plus- Integral (PI) and Proportional-plus-Integral-plus-Derivative (PID) controller are designed for each of the three linear models. The controllers are used to perform speed control for the engine model. The design criteria are set according to the usage of speed control system depend on the application. For example, different criteria are set for ordinary accelerator pedal input from driver, automatic cruise control and control feedback from the fuel system microcomputer. The parameters of the controllers are obtained by direct calculation and Ziegler-Nichols tuning rules. This simple type of controller provides a gauge for performance assessment and is commonly used in engine control. The details of the design are given in Chapter 5. The test result obtained is then analyzed and used to provide guideline on the use of linear model for the design of throttle controller. This guideline is given at the end of Chapter 5. Chapter 6 analyses the accuracy of the proposed linear model for approximation. Rec ommendation of model improvement are also given. The conclusions of this study are given in Chapter 7. 7 Chapter 2 Formulation of Physically Based Engine Model 2.1 Intake Manifold The intake manifold is used to control the flow of air and exhaust gas recirculation (E.G.R.). The intake air provides oxygen for the combustion in the engine cylinders and the exhaust gas is recycled to the intake for control of nitrogen oxides (NO x ) emission. Inside the intake manifold, the following conditions are assumed [12] : 1. Uniformly distributed pressure and temperature at any given time. 2. Air mixture obeys the Ideal Gas Law and Dalton's Law of Nonreacting Mixtures. 3. Complete mixing of air and E.G.R. A filling and emptying model is adopted to describe the air flow dynamics. The mass rate of air entering (filling) the intake manifold through the throttle, rn a i (kg/s), depends 8 on the throttle geometry and the pressure ratio across the throttle body. It is given by the product of three characteristics functions of the throttle body [12] : that = MAX • PRI • TC (2.1) and PRI = PRI(-^-) (2.2) TC = TC(a) (2.3) where MAX (kgfs) is the maximum possible air flow through the throttle. It is constant for a particular engine. PRI is the normalized throttle flow as a function of the pressure ratio, p^"-, where P m (kPa) and P a tm (kPa) denote the intake manifold pressure and the atmospheric pressure respectively. This function assumes the inlet pressure of the throttle is equal to that of the atmosphere. TC is the normalized throttle flow as a fimction of the throttle angle, a (degree). The mass rate of E.G.R. entering (filling) the intake manifold, m egr i (kg/s), is controlled by the E.G.R. valve. The amount of exhaust gas being recycled is given as a function of the pressure ratio, ^p- : m egr i = Thegrii-jP-) (2.4) where P e (kPa) denotes the exhaust manifold pressure. 9 The mass rate of air leaving (emptying) the manifold into the cylinders, m ao (kg/s), is averaged by a quasi-steady approximation [8] : Vv Pm Vd N . â„¢oo = ~ â„¢> egro (l-a) where T] V is the volumetric efficiency of the engine, which is usually determined from exper imental data, p m (kg/m?) is the density of gas mixture inside the manifold, Vd (m 3 ) ii; the displaced cylinder volume and N (rpm) is the engine speed. The mass rate of E.G.R. leaving (emptying) the manifold into the cylinders, m egro (kg/s), is estimated with a time varying first order lag filter [12] : in e g ro = 0.095 T) v U> e (m e gri — m e g ro ) (2.6) where w e is the engine speed in rad/s. The Ideal Gas Law for the intake manifold states that : PmVm = mmRTm where V m (TTI 3 ) is the intake manifold volume, mm (kg) is the mass of gas mixture remaining in the manifold, R (kJ/(kg • K))'\s the universal gas constant of the mixture inside the manifold, and T m (K) is the manifold temperature. By the Ideal Gas Law, the above formulae and the assumption of uniform temperature across the intake manifold, the continuity equation for air flow into and out of the intake 10 manifold : can be written as : mm = rh a i + megri — moo — m egro (2-7) - * m — OT , -*m T „ V T '' , at ^ ln egn) "Vm "m Rewrite the equation in SI unit RT Pm = ~KT] v io e P m + -—^(rriai + m egri ) (2.8) M71 where K is a constant for a particular engine and is equal to : -• & < 2 - 9) The two states associated with this filling and emptying model are the mass rate of E.G.R. out of intake manifold, m egro , and the intake manifold pressure, P m . The state equations are given by equations (2.6) and (2.8). It should be noted that the above air flow model doesn't provide information for pressure variations associated with the flow pulsation at the intake stroke of each cylinder. 11 2.2 Fuel Delivery The dynamics of the fuel in the sequential port fuel injection system can be represented by the combination of a first order lag and a transport delay [5]. The lag is caused by the liquid fuel film produced by a fraction of fuel deposited on the intake port walls. The transport delay is a result of the delay from the fuel command to the activation of injectors, the delay from the start of injection to the close of the intake valve and the extra delay for the fuel injected while the intake valve is closed. The determination of the lag, the delays and other dynamic fuel parameters (e.g. the fraction of fuel being deposited on the port wall) is difficult. A complete formulation of this injection system is given by Moskwa [12]. However, the effects of the liquid fuel film lag and the transport delay can be averaged and combined into one first order lag, and the form of the fuel injection model is reduced to [5] m fi = "/'-*/ « (2.10) where rhj c (kg/s) is the commanded mass rate of fuel, rhfi (kg/s) is the actual mass rate of fuel entering the engine cylinders, TJ (sec) represents the effective time constant of the combined first order lag model and is modeled as : r, = 0.05 0 + i^-S | (2.11) J u> e MAX where (3 is the desired air fuel ratio (A/F). The expression A/F is a very important quantity in an engine. It affects the emission, the fuel consumption and the torque production. The 12 definition of A/F is [8] A/F=â„¢^ (2.12) rn.fi There is usually a tradeoff between the low exhaust emission and the best fuel economy. In general, the most desired value for the A/F is 14.7, which is at the maximum of the overall catalytic converter efficiency [4], i.e. the lowest pollution produced. However, at this A/F value, the fuel consumption is usually higher than the that at the best fuel economy. The state associates with this fuel injection model is the actual mass rate of fuel entering the engine cylinders, rh/i and the state equation is Equation (2.10). 2.3 Torque Production The torque production is described by a steady-state model with process delays associated with the four-stroke combustion process [12]. It gives the indicated torque produced by an engine at specific speed (u> e ), air fuel ratio (A/F) and spark angle (SA). The SA (degree) is the crank angle at which an electrical discharge across the spark plug starts the combustion process. Traditionally, cam-operated spark ignition systems have been used, but in modern automobiles, the process is done electronically. The process delays are parameterized by the engine speed at any given time. Generally, two delays are used in the model : 1. Intake valve closing to torque time delay, Aft (sec), Aft = ^ (2.13) 13 2. Spark to torque time delay, A s t (sec), A s t = ^ (2.14) where Ku and K a t are constants for a particular engine. The produced indicated torque, T{ (Nm), is given by [5] : T . = c™™-^ 1 | t _ Au .SI \ t _ A , t (2.15) w e and AFI = AFI(A/F) SI = SI(SA) where CT (Nm/kg) is the maximum torque capacity of an engine under a specific fuel conversion efficiency, which is a function of intake manifold pressure and engine speed. The notation AFI is the air/fuel influence and SI is the spark influence. These two influences are normalized functions, representing respectively the reduction in indicated torque production of an engine due to non-ideal air fuel ratio and the difference between spark angle and the MBT timing. The quantites AFI and SI are functions of A/F and SA respectively. In the ideal situation, the values of both influence are equal to 1, i.e. no reduction in torque production. Otherwise, the values will be less than 1. The values of these influence for a particular engine can be obtained from experimental data, and generally, empirical formulae are used to estimate these influence. m ao and w e are the mass rate of air going into the 14 engine cylinders and the engine speed, respectively, which are the same quantities given in Chapter 2.1. Another torque related to the operation of an engine is the friction torque, Tj (Nm). In general, it is modeled as [5] : T f = K n + K f2 -u>e (2.16) where Kj\ and Kpi are constant for a particular engine. Torques such as accessory torque and torque converter pump torque are included in a single parameter, TL (Nm), which can be arbitrarily added to the model according to any required loading specification. 15 2.4 Rotational Dynamics The engine inertia, J e (kgm 2 ), is modeled as a constant inertia. The effects of torsional vibration of the crankshaft and the cyclically change in the moment of inertia of the moving parts in the engine are excluded from the model. Instead, a rigid body is modeled with a mean effective inertia reflecting the crankshaft, connecting rod, piston and valve train inertia. This lumped parameter approach greatly reduced the complexity of the dynamics model. The result is simply given by Newton's second law : J e uj e = Ti-T f -T L (2.17) where Ti, Tf and TJJ are respectively the indicated torque, friction torque and loading torque given in the previous section. The state associates with the rotational dynamics is the engine speed, u> e , and the state equation is Equation (2.17). 16 Chapter 3 Non-linear Engine Model 3.1 Model Structure The physically based engine model used in this study represents the relationship between the throttle angle and the engine speed. This is a simplified version of the physically based model discussed in Chapter 2. A block diagram of this engine model is given in Figure 3.1. The model consists of an air flow model representing the dynamics in intake manifold, a static torque production model and the rotational dynamics of the engine. There are two states in this engine model - the intake manifold pressure and the engine speed. 17 Throttle Input \ Incut ». 1—• 1—* Torque Production Intake Manifold Dynamics Rotational Dynamics Maaufold Pressure 1 State Engine Speed 1 State fOutDutt Figure 3.1 : A Two State Engine Model 3.2 Engine Data and Parameters The data and parameters of this physically based engine model are taken from Cho [5]. They are summarized in the following sections. In addition, the simplifications made to this model are stated and evaluated. 3.2.1 Intake Manifold In this submodel, data of the E.G.R. is not available, hence it is assumed that no exhausted gas is being recycled, i.e. m e g r i — m e g TO — u 18 Consequently, Equation (2.6) becomes m/egro — ^ and the number of state is reduced to one. The remained state is the intake manifold pressure, P m , and the corresponding state equation, Equation (2.8), is modified as : ryp Pm = -K%UJ e P m + -rr^Thai (3.1) M7l The intake manifold volume ,V m , is V m = 0.0027 m 3 and the engine displacement volume, Vd, is : V d = 0.0038 m 3 hence Equation (2.9) gives : K = 0.112 The volumetric efficiency, r] v , is given by the following empirical expression : r] v = (24.5 uj e - 3.1 x lO^ml + (-0.167 w e + 222)m a + (8.1 x 10 - 4 u> e + 0.352) where m a denotes the mass of air remaining in the intake manifold. As no exhausted gas is 19 •. recycled, m a can be calculated by Ideal Gas Law : P m V m = m a RT m R is the universal gas constant for air and is equal to R = 0.288292 U/(kg • K) and the manifold temperature, T m , is : T m = 310 K The mass rate of air entering (filling) the manifold through the throttle, m a t> is given by Equation (2.1) : m ai = MAX • PRI • TC where MAX = 0.1843 kg/s and the normalized air flow characteristic functions are modeled as : Pi?/=l-exp(9.(-^-)-l) "aim TC={ 1 - cos(1.14459 • a - 1.06) a ^ 79.46° 1 a > 79.46° 20 The plots of these two characteristic functions are given in Figure 3.2 and Figure 3.3. 0.8 2 Q- 0.6 0.4 0.2 "T I I I I T" _1 I 1_ 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 Pressire ratio (PrrVPatm ) Figure 3.2 : Normalized Pressure ratio Influence, PRI 0 10 20 30 40 50 60 70 80 90 Throttle Angle (deg.) Figure 3.3 : Normalized throttle characteristic, TC 21 3.2.2 Torque Production The indicated torque, Ti (Nm), is given by Equation (2.15) m ao • AFI . li - O r \t-A u -ol |t-A„t where CT is estimated as a constant : C T = 498636 Nm/kg and the value m ao of is given by Equation (2.5). The two normalized influence functions, AFI and SI, are given by empirical expressions : AFI = cos(7.3834 • (A/F - 13.5)) and SI = (cos(SA - MBT))â„¢ 75 The plots of these two influence functions are given in Figure 3.4 and Figure 3.5. 22 10 11 12 13 14 15 16 17 18 Air Fuel Ratio. A/F Figure 3.4 : Normalized Air Fuel Influence, AFI -20 -10 0 10 20 Spark Advance/Retard fromMBT, SA-MBT 30 Figure 3.5 : Normalized Spark Influence, SI 23 The parameters, Ku and K a t, of the time-varying process delays given in Equation (2.13) and (2.14) are estimated as : Ki t = 5.48 and K at = 1.30 The friction torque, Tf, is modeled as : T f = 15.1 + 0.1Q56 w e 3.2.3 Rotational Dynamics The rotational dynamics of an engine without external loading can be easily obtained from Equation (2.17) and is : J e w e = Ti-T f (3.2) This is the state equation for the second state, w e , of the engine model. The engine inertia is : J e - 0.1454 kgm 2 3.3 Simulation A C program is written to perform the simulation of this two-state non-linear engine model in high speed. The 4th order Runge-Kutta method is used for numerical integration. The source code of the program is given in Appendix A. In addition, the two-state non-linear 24 engine model is simulated using MATLAB. The representation of the model in the MATLAB SIMULINK Toolbox is given in Figure 3.6. The detailed block diagrams of the subsystems are given in Appendix B. This approach gives a much more convenient way for manipulating the model structure, changing engine parameters, as well as adding subsystems to represent other engine dynamics or even making a complete powertrain model. The procedures in performing simulation of the engine model are given in Appendix C. The MATLAB m-file of the model is given in Appendix D. Throttle Angle Mass Rate of Input Air in alpha [d/dt]mai Air Fuel Ratio ua- Spark Angle Mass Rate of Air leaving Manifold [d/dt]mao : > Intake Manifold Dynamics Indicated Torque Ti •QD" Friction Torque Tf - H Pm H Manifold Pressure Pm S Engine Dynamics w < Engine Speed w Figure 3.6 : SIMULINK Representation of the Two-State Engine Model 25 Simulations are done with the following conditions : 1. The air fuel ratio (A/F), which is kept constant, is set at a value of 15. 2. The spark angle (SA), which is kept constant, is set at an angle of 10° retarded from the MBT, i.e. 5,4 - MBT = 10° As mentioned before, these conditions reduce the complexity of the engine model (the modelling of fuel injection system and spark ignition system becomes unnecessary). The creditability can be assessed from the two normalized functions, Air Fuel Influence (AFI) and Spark Influence (SI). In many automobiles, the desired value of A/F is usually equal to 14.7 for the lowest emission control, and control law has been developed to maintain the A/F within the boundary of 14.7 ± 0.2 [4]. From Figure 3.4, setting the value of A/F at 15 will cause a less than 1% error in the value of AFI, and so the error in the indicated torque produced will also be less than 1%. It is also suggested that the nitric oxide (NO) emission is reduced when the spark is retarded from the MBT [8]. Although emission data of the engine is not available to this study, the spark retard is chosen to be 10°. From Figure 3.5, the decrease in the value of SI is less than 5% for such spark retard. This would be a good tradeoff between exhaust emission and fuel consumption. In the simulations, throttle steps 1 of 5° and 10° are used as the inputs to the engine model. The plot of these throttle steps versus time are given in Figure 3.7. 'Th e input throttle step is relative to an initial value of the throttle angle, in this case, we are using 25° as an initial throttle setting. 26 38 36 34 D) (D 2-32 .9J -3 2 g 28 26 24 22 - / tf . < < — 5deg. Step — 10deg. Step • • 2 3 Time (sec) Figure 3.7 : Input Throttle Step of 5° and 10° Simulations of the manifold pressure, P m , at an engine speed of 240 rad/s, subjected to the throttle steps are performed. The manifold pressure outputs are plotted in Figure 3.8. 60 55 TO §2 50 | 45 aL 3 2 •S 14 0 (0 35 30 1 1 •'" •• 1 1 • •• / 1 * / / / // I I — 5 deg. Step —1 0 deg. Step • < • _ 2 3 Time (sec) 27 Figure 3.8 : Simulated Manifold Pressure for Throttle Step of 5° and 10° Simulations of the engine speed, w e , with the same throttle input as in the previous case are also done, and the engine speed outputs are plotted in Figure 3.9. 380 360 - — 340 jn •a 2 ^32 0 (D <D a. < e 300 '5> c 11 1 280 260 240 / 1 / if > ^ , i , 5 deg. Step 10 deg. Step _ _ 2 3 Time (sec) Figure 3.9 : Simulated Engine Speed for Throttle Step of 5° and 10° 28 Chapter 4 Linear Engine Model 4.1 Linearization 4.1.1 Model Definition The first step of the linearization is to define a model to be approximated. This is a simple but important step. Different definitions of model will result in different procedures for obtaining the linearized model. For this non-linear engine model, a single-input-smgle output (SISO) linear model is suggested. The input for the linear model is the throttle angle, a, and the output is the engine speed, o> e . 4.1.2 Determination of the Operating Range In general, it is impossible t o estimate a non-linear model as a linear model with an unlimited input range. Therefore, an operating range for the linear model has to be determined. One of the basic criteria required for a possible linearization is that the steady output of the non-linear model is linear within a certain range of input. This range can then be chosen 29 as the operating range of the linear model. Figure 4.1 shows the steady state engine speed at different throttle angle. 8001 1 . . . 1 0 i 1 1 , , 1 0 20 40 60 80 100 Throttle Angle (deg.) Figure 4.1 : Steady State Engine Speed against Throttle Angle A straight line is being fitted to the simulation data in the range of 10° to 40° throttle angle. The line fitting and the corresponding error are shown in Figure 4.2a and Figure 4.2b respectively. It is observed that within this range, the non-linear engine model would have a nearly linear steady-state output. According to this, a throttle angle of 25° is chosen to be the nominal operating point and the operating range is from 10° to 40° throttle angle. fuu • 600 2,500 •o C D 2.400 CO CD 130 0 uj 200 100 30 25 30 35 Throttle Angle (deg.) 50 Figure 4.2a : Steady State Engine Speed fitted with Straight Line 25 30 35 Throttle Angle (deg.) 50 Figure 4.2b : Error Plot for Linear Steady State Approximation 4.1.3 Determination of the Frequency Range Besides the operating range, it is also required to determine a frequency range in which the linearization is valid. Non-linear systems usually produce multi-frequency output even when the input contains only a single frequency. In linear systems, on the other hand, the output has the same frequency as the input. Therefore, it is necessary to find out the range of frequency in which the frequency, or the dominant frequency, of the output of the 31 non-linear engine model is the same or nearly the same as that of the input. In addition, the determined frequency range has to be coincided or overlapped with the working frequencies of the applications with which the linearized model is used, otherwise, it is not suitable to use estimated linear model in the applications. The first step is to estimate the working frequencies of the applications. The frequency range of the input throttle is chosen to be from 0 to 100 rad/s (~ 16 Hz). This range is suitable for many applications, such as ordinary accelerator pedal input from driver, auto matic cruise control and control feedback from the fuel system microcomputer. Simulations are then performed using input with frequency throughout this range. The next step is to validate this chosen frequency range on the non-linear system using FFT (Fast Fourier Transform). To achieve this step, a sinusoidal wave with amplitude within the determined operating range to the non-linear engine model is introduced at the input. The output response, engine speed data, is then collected. Its frequency content is examined by obtaining the power spectrum of the output signal. The MATLAB function "FFT" is used to convert the time domain signal to frequency domain. A MATLAB program is written to obtain the power spectrum and is given in Appendix E. Throttle input at different frequencies is being tested. The following is an example of the spectral analysis for a throttle input at frequency 0.5 rad/s. Figure 4.3a shows a sinusoidal throttle input of magnitude 5° at frequency 0.5 rad/s, and Figure 4.3b shows the corresponding output engine speed. 32 10 15 Time (sec) 20 25 30 Figure 4.3a : Sinusoidal Throttle Input of magnitude 5° at frequency 0.5 rad/s 15 Time (sec) Figure 4.3b : The Corresponding Ouput Engine Speed minus Initial Engine Speed It should be noticed that the initial engine speed needs to be subtracted from the output engine speed data, before the power spectrum can be computed. This is done to avoid the influence of the D.C. gain due to the non-zero initial condition. The power spectrum of the 33 output signal is given in Figure 4.4. 2 3 frequency (rad/s) Figure 4.4 : FF T Spectral Analysis with Input Frequency = 0.5 rad/s The peak magnitude of the power spectrum is found at about 0.5 rad/s, i.e. the output signal contains frequencies mainly at 0.5 rad/s, which is the same as the input signal. Hence, it can be concluded that linearization is possible for this non-linear engine model at the particular frequency. Spectral Analysis is also done at other frequencies within the proposed range. Some of the results are given in Figure 4.5 to Figure 4.9 (input frequencies at 0.01, 0.05, 5 ,20 and 50 rad/s). 34 Tj Magnitude n > .£â€¢ O l TI TI H W *rj R n - i-l P P «< f 01 01 %. = + tT 5 s t i (3 c<- s ? (D if i e rt> 3 o *< II o o O t 1 o a. o o IO 3"° J3 4^ c CO 3 o •< - ^ fil Q. O CO OJ O 00 - i to o u o o en o 05 o ^rr- —,_ ..,,. . , , I~^> J -a > n \ ° \ b ) CO rad/s i i i i i • • • TJ C D Cn k w T3 r p cn •— • S3* 5 1 • 3 O b -3 » a. Magnitude ro o o o CJ1 o o o o CD XI c C D 3 O ° I* --L oi -n 0) a 3 r o to ^ == == ==; l / ^ II - 1 ° - 0096 rad/s i i i i I I CO cn C D " I £Z O) C O 2 .t o 20 15 10 5 n I Wp = - I • "W ^ V 1 1 1 1 = 5 rad/s • - 0 5 10 15 20 25 30 frequency (rad/s) Figure 4.7 : FFT Spectral Analysis with Input Frequency = 5 rad/s 20 40 60 frequency (rad/s) 100 Figure 4.8 : FFT Spectral Analysis with Input Frequency = 20 rad/s 36 2 1.5 CD -o rj E 1 CO 5 0.5 20 40 60 80 100 frequency (rad/s) Figure 4.9 : FFT Spectral Analysis with Input Frequency = 50 rad/s From these figures, it is observed that in each the peak frequency, tv p , of the output signal is very close to the corresponding input signal frequency. This is also true for the responses to harmonic inputs with other frequencies. From the above analysis, it can be concluded that linearity can be assumed in the above suggested "operating range, and the proposed range of frequencies. 4.1.4 Frequency Response Analysis Sinusoidal input throttle of magnitude 5° is used to obtain the frequency response for the non-linear engine model. Simulations are then carried out with input at frequencies throughout the frequency range determined above. The magnitudes and phases of the out put for different input frequencies are carefully recorded. This is a crucial step in obtaining the frequency response. The number of cycle of the input signal used in the simulations is varying from 4 for the lowest input frequency to over 120 for the highest input frequency, 37 i.e. the number of samples to be used in determining the magnitudes and phases is varying from 4 to over 120. For high frequency input, the first few samples are usually discarded as it requires a few cycles to attain the steady state. The calculation used is as follows : 1. To obtain the magnitude, to e ,mag, the maximum, oJ e ,max, an d minimum, u> et mi n , values of the output signal are recorded for each sample. The magnitude is calculated by : Ue,mag — ~ At each particular frequency, /», the magnitude of the output signal is calculated for each sample, and the average of these magnitudes is the magnitude of the output signal at that particular frequency, fi. 2. To obtain the phase, 9, the time i 0 ,max and t 0im i n , corresponding to each maximum and minimum of the output signal, are recorded. In addition, the time it.max and *t,min) corresponding to each maximum and minimum of the input signal, are also recorded. The phase is calculated by : 0: "max T cVmin where e = W fi,max x 360 o 9^ = *°- min * i|min x 360° 38 and p denotes the period of the input signal. It should be noted that the time £ 0 ,max (£o,min) and if,max (^i.min) have to be a corresponding pair of input and output max imum (minimum), otherwise, one or more periods may be added or subtracted from the results. Again, the average of the phases obtained for each sample is the phase of the output signal at that particular frequency, fi. The magnitudes and phases of the simulation output at different input frequencies are given in Table 4.1. The Bode plot of the non-linear engine model can then be constructed from the data, and is given in Figure 4.10. fi (rad/s) 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.1 0.2 w e , ma <7 (rad/s) 60.10 60.09 60.09 60.08 60.08 60.07 60.06 60.05 60.04 60.03 59.81 9 (deg) 0.3 0.6 0.9 1.2 1.5 1.8 2.2 2.5 2.6 3.1 6.3 fi (rad/s) 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 1.2 1.5 1.7 We,mag (rad/s) 59.47 58.98 58.37 57.61 •56.77 55.84 54.84 53.77 51.72 48.25 45.94 9 (deg) 9.4 12.5 15.6 18.4 21.3 24.2 26.9 29.6 35.1 42.1 46.4 Table 4.1 : The Magnitudes and Phases of the Output at given Frequency, fi 39 fi (rad/s) 2 2.3 2.7 3 4 5 6 7 8 9 u e ,mag (rad/s) 42.61 39.50 35.78 33.31 26.70 21.84 19.38 15.86 13.78 12.12 9 (deg) 52.2 57.3 63.2 67.1 79.1 86.4 93.3 101.3 106.4 111.6 fi (rad/s) 10 20 30 40 50 60 70 80 90 100 Ue,mag (rad/s) 10.77 4.38 2.32 1.41 0.94 0.67 0.50 0.39 0.31 0.25 9 (deg) 116.3 152.3 178.9 199.7 218.4 235.3 250.8 265.4 280.2 293.8 Table 4.1 (Continued) 40 10 10 10 Frequency (rad/s) 10 |-10 0 jn-200 Q. •300 r.i i—i i i 11 -i—i i i n 10 .-2 10" 10" Frequency (rad/s) 10' 10' Figure 4.10 : Bode Plot of the Non-Linear Engine Model 4.1.5 Linear Model Estimation Several linear models are suggested to be used in the estimation of the non-linear engine model. These includes a first order model, three different second order models, a third order model and a fourth order model. The MATLAB function "invfreqs" is used to obtain the parameters of these linear models. This is done by minimizing the error : |G*0'a;)-G„(>)| s 41 over a specific set of frequency points, w. Gi(ju>) and G n (ju)) denote the complex frequency response of the suggested linear model and the non-linear engine model, at the frequency points specified in w, respectively. A summary of the parameters obtained for each suggested linear model is given in Table 4.2. <*M = S $ First Order, Gi(s) Second Order, C?2(s) Second Order, Gi 2 (s) Second Order, G 2 d(s) Third Order, G 3 (s) Fourth Order, G 4 (s) M*) Ai(s) = 0.5793s + 1 A 2 (s) = 0.0344s 2 + 0.5515s + 1 A 12 (s) = 0.0266s 2 + 0.5413s + 1 A 2d (s) = 0.0344s 2 + 0.5515s + 1 A 3 (s) = 0.0005s 3 + 0.0341s 2 +0.5566s + 1 A A (s) = 5 x 10- V + 0.0005s 3 +0.0344s 2 + 0.5564s + 1 Bi(s) Bi(s) = 12.2160 B 2 (s) = 12.0065 Bn(s) = -0.1761s +12.004 B 2d (s) = 12.0065 B 3 (s) = 12.0091 B 4 (s) = 12.0065 e -0.0213s Table 4.2 : Parameters of the Linear Models The linear models, C?i(s), G 2 (s), and G 2 d(s) were selected for further analyses. The others three models are not used because : 1. Gi 2 (s) has a non-minimum phase zero at s = 68.1658. 2. Gs(s) and Gn(s) have poles larger than ten times the smallest poles, and generally, these large poles can be ignored. Further discussion of the model poles will be given in Chapter 6. 42 More detailed analysis of the three selected models, and their accuracy compared to the non-linear engine model are given in the next three sections. 4.2 First Order Model The first order model has the form of : where G\(s) denotes the transfer function from throttle angle to engine speed, K and T are the gain and time constant of the first order linear model respectively. Both K and T are determined from the frequency response data of the non-linear system, and are equal to 12.2160 and 1.7263 respectively (refer to Table 4.2). The error is minimized by the least square method. The Bode plot of the approximated first order system and the corresponding error are given in Figure 4.11a and Figure 4.11b. 43 ff-IOOh CD 10 -200 -300 10 frequency (rad/s) 1st Order Model Non-Linear Model 10"' 10 10 frequency (rad/s) 10 Figure 4.11a : Bode Plot of the First Order Approximated Model Gi(s) 44 C O 10 £ 0 LU CD 1-10 co 5 -20 10' 200 O) c u •o g ai 8! -200 h (0 -400 10- 10" frequency (rad/s) 10 frequency (rad/s) 10 10 Figure 4.11b : Error Plot for the First Order Model The error of the linearized model is defined as Magnitude Error = 20 X (log 10 (|G„0'w)|) - log 10 (|Gi(jw)|)) or Magnitude Error = |G,0HI dB for the model magnitude error, and : Phase Error = /.G n (jui) — ZGI(JUJ) degree 45 for the model phase error. The same definition is used for the error calculation of the Bode plots in the next two sections. 4.3 Second Order Model The second order model has the form of : G 2 (s)= K (£ + !)( A+ i) where G2(s) denotes the transfer function from throttle to engine speed, K is the gain of the model, T\ and T 2 are the two time constants of the second order system. K, T\ and T 2 are determined from the frequency response data of the non-linear system, and are equal to 12.0065, 2.0839 and 13.9568 respectively (refer to Table 4.2). The error is minimized by the least square method. The Bode plot of the approximated second order system and the corresponding error are given in Figure 4.12a and Figure 4.12b. . 46 10 frequency (rad/s) 10' • ' •2nd Order Model •Non-Linear Model 10" 10 10' frequency (rad/s) Figure 4.12a : Bode Plot of the Second Order Approximated Model G2(s) 47 100 CD Q) s 0 g UJ g-100 (0 x: 0_ -200 10" 10 frequency (rad/s) i i i • i i i i i i 10- 10" frequency (rad/s) 10' 10 i i i i i i i 10' Figure 4.12b : Error Plot For the Second Order Model 4.4 Second Order Model with Transport Delay The previous two models have large phase error at high frequencies region. Therefore a model that includes additional phase lag at high frequencies is proposed. The model includes a second order transfer function and a transport delay, of the following form : G 2d (s) = e" K (*+ !)(*+!) 48 where Gid(s) denotes the transfer function from throttle to engine speed, K is the gain of the model, T\ and T 2 are the two time constants of the second order system, r is the transport delay imposed on the second order system. The parameters K, T\ and T 2 are determined from the frequency response data of the non-linear system. These three parameters are essentially the same as that in the previous case due to the nature of the factor e _ST : \G u (s)\ = \G 2 (s)\ ZG 2d (s) = ZG 2 (s)-T-w and therefore, K, Ti and T 2 are equal to 12.0065, 2.0839 and 12.9568 respectively. The transport delay, r, is determined by comparing the phase difference of the second order system (without transport delay) with the non-linear system and is given by: - r • u = ZG 2 (s) - ZG n where ZG n denotes the phase of the non-linear system. The phase difference between the non-linear engine model and the approximated second order linear model, ZG 2 (s) — ZG n , is plotted in Figure 4.13. 49 0.5 -2.5 1 ' ' ' ' ' 0 20 40 60 80 100 frequency (rad/s) Figure 4.13 : Phase Difference Plot Used to Determine r A straight line is fitted to the phase difference data and the transport delay, r, is estimated from the slope of the line : r = —Slope of the fitted line = —0.0213 s The error of the parameters is minimized by the least square method. The Bode plot of the approximated second order model with transport delay and the corresponding error are given in Figure 4.14a and Figure 4.14b. 50 10 0 10 frequency (rad/s) §M0G CD j?-200 D _ -300 — 2nd Order Model with Transport Delay Non-Linear Model 10 10- 10 u frequency (rad/s) 10' 10 10' Figure 4.14a : Bode Plot of the Second Order Approximated Model with Transport Delay Gzd(s) 51 10 frequency (rad/s) Figure 4.14b : Error Plot for Second Order Model with Transport Delay It is observed that all the three models predict the non-linear engine model character istics well in low frequency region. However, the phase error in the first two linear models, Gi(s) and G2(s), becomes significant in the high frequency region. In the third model, G2d(s), where a transport delay is introduced, the linear approximation matches the non linear model also at high frequencies. 52 Chapter 5 Controller Design 5.1 PI Control The PI control law is applied only to the first order model. This is done to avoid setting trivial criteria for the desired closed loop system response that would result in the applica tion of a PID control law to a first order system. Typically, the engine speed is expected to be insensitive to high frequency throttle input, which is normally the noises caused by air turbulence and engine vibration. In addition, it should not be oscillating, or having large overshoot, during an acceleration or a deceleration before reaching the desired speed. Therefore, the closed loop system should have large damping and small bandwidth. The closed loop specifications are : 1. a closed loop natural frequency, w n = 18.85 rad/s (~ 3 Hz) [3], 2. a closed loop damping ratio, £ = 1.25. 53 The PI controller, Gi(s), for the first order model, Gi(s), has the form of : Cl (s)=K p + ^ where K p and Ki are the proportional gain and the integral gain of the controller respec tively. Using the above performance criteria, the two gains are computed to be : K p = 2.153 Ki = 16.85 The unit step response of the unit feedback closed loop system is simulated and the output is plotted in Figure 5.1. It shows that the closed loop system has no oscillation, less than 8% overshoot and zero steady state error. Time (sec) 54 Figure 5.1 : Unit Step Response of the Closed Loop Gi(s) with PI Control The Bode plot of the closed loop system is given in Figure 5.2, which shows that the bandwidth is about 50.77 rad/s (~ 8 Hz). 10 0 10 10 10 Frequency (rad/s) 10 10 10 10 Frequency (rad/s) Figure 5.2 : Bode Plot of the Closed Loop Gi(s) with PI Control 5.2 PID Control The parameters of the PID controller is determined primarily by the Ziegler-Nichols tuning rules. Fine tuning is then made for the controller to achieve an overshoot of less than 10% for the closed loop system. The PID controller, G2(s) and C 2 d(s), are designed for the linear 55 models, G2(s) and G2d(s), respectively. Both controllers have the same form of : C(s) = K p + K d s + -f The Ziegler-Nichols tuning rules give : K - 6 T K d = \T where K p , Ki and Kd, are the proportional, Integral and derivative gain respectively. For any given system, T and L can be obtained from the open loop unit step response of the plant. Figure 5.3 shows the way to obtain the value of T and L from the open loop unit step response of a plant. 56 K Q . O O —I e 03 a. P. o a. to a. a > W /Tangent Line at / Inflection Point 0 L T+L Time (sec) Figure 5.3 : Open Loop Unit Step Response For the model G2(s), these values are : L ~ 0.04 T ^ 0.66 and for the model G2d(s), these values are : L ~ 0.07 T sf 0.65 57 Hence, the controllers are found as : C 2 (s) = 19.8 + 0.396s + ^ ^ and 79.593 G2d(s) = 11.143 + 0.39s + With the use of these controller gains, the closed loop step response of the two models give about 30% overshoot. Fine tuning is necessary as our goal is to be less than 10% overshoot. The final parameters of the controllers are determined as : C 2 (s) = 20 + 0.4s + — s and C 2d (s) = 1.2 + 0.1s + - s • The closed loop unit step response of the model G2(s) with the controller G2(s) is given in Figure 5.4, and the closed loop unit step response of the model G2d(s) with the controller G 2 d(s) is given in Figure 5.5. 58 Figure 5.4 : Unit Step Response of Closed Loop G2(s) with PID Control Figure 5.5 : Unit Step Response of Closed Loop G2d(s) with PID Control 59 The Bode plots of the closed loop systems are given in Figure 5.6 and Figure 5.7 respec tively. 10 m S 0 CD §>_10 CO -20 T—I—I I I I I 1 1 1—II I III •i i i i i | i— - i i—i—n-rr 10" 10 10 u 10' Frequency (rad/s) 10 10 Frequency (rad/s) 10' 10° Figure 5.6 : Bode Plot of Closed Loop G 2 (s) with PID Control 60 10 10 Frequency (rad/s) « -500 a ) jl-1000r -1500 _i i • 10' 10" 10" 10' Frequency (rad/s) 10 Figure 5.7 : Bode of Closed Loop G 2d (s) with PID Control 5.3 Testing 10 10 The three sets of controller parameters obtained above are used to demonstrate their ca pability in regulating the non-linear engine model without further tuning. The closed loop system block diagram is given in Figure 5.8. The symbols Gi(s), C 2 (s) and C 2d (s) denote the controllers obtained for the first order model, Gi(s), the second order model, G2(s) and the second order model with transport delay, G 2d (s), respectively. 61 Input Command Controller (PI/PID) Non-Linear Engine Model < w Engine Speed w Figure 5.8 : Block Diagram of Closed Loop System with Controller Gi(s) / C 2 (s) / C 2d (s) The closed loop system is subjected to an input command corresponding to a 5° throttle step as shown in Figure 3.7 (Chapter 3.3). The output engine speed of closed loop system with the three different controllers are plotted in Figure 5.9, Figure 5.10 and Figure 5.11 respectively. 62 1 1.5 Time (sec) Figure 5.9 : The Output of the Closed Loop System using Controller Ci(s) Figure 5.10 : The Output of the Closed Loop System using Controller G2(s) 63 310 5.5 Time (sec) Figure 5.11 : The Output of the Closed Loop System using Controller C 2 d(s) It is clear that the controllers Gi(s) and C 2 (s) are not capable of stabilizing the non linear engine model, instead, limit cycle is resulted. Furthermore, the controllers C\(s) and G2(s) are used to regulate the model G2d(s). The response to the same input are given in Figure 5.12 and Figure 5.13 respectively. 64 0.4 0.6 Time (sec) Figure 5.12 : The Output of Closed Loop G2d(s) using Controller Gi(s) 2000 -4000 0.1 Time (sec) Figure 5.13 : The Output of Closed Loop G2d(s) using Controller G2(s) 65 Neither Gi(s) nor G2(s) can stabilize the model G2d(s). The increasing oscillation amplitude in these outputs are analog to the limit cycles in the non-linear case (refer to Figure 5.9 and Figure 5.10). Hence the model G2d(s) gives better prediction on the behavior of the non-linear engine model and is suitable to use in controller design. 5.4 Design Guidelines By comparing the three controllers, Gi(s), G2(s) and G2d(s), it is observed that with similar design criteria, the proportional and integral gains of the first two controllers are higher than that of the third one. These large gains give a faster closed loop unit step response than the relative small gain controller in the third case (refer to Figure 5.1, Figure 5.4 and Figure 5.5). However, the first two estimated linear systems do not predict instability as the third system does when the controller gains are large (refer to Figure 5.12 and Figure 5.13). In fact, this can be seen by comparing the Bode plots of the non-linear engine model and the estimated linear models. From the Bode plots of the first two linear models, Gi(s) and G2(s) (Figure 4.11a and Figure 4.12a), no gain margin exists because these two models are a pure first order model and a pure second order model. On the other hand, a gain margin does exists in the third model, G2d(s) (Figure 4.14a), due to the added transport delay, as-in the non-linear engine model (Figure 4.10). This suggests an upper limit to the system gain, and therefore instability is resulted if the gains of the controller are too large. To avoid over determining the PID controller gains, it is suggested to use the model G2d(s) for controller design purpose. Although this does not guarantee a stabilizing con troller (because this model is an estimated one, in fact), it gives a better start for fine 66 tuning the controller. In the case that a pure first order model or a pure second order model has to be used in designing the controller, there is no strict rules determined for finding a stabilizing controller. As the controller gains are usually over estimated in such case, it is better to reduce the calculated gains as soon as the step response of the closed loop system starts oscillating. In other words, the controller gains must be big enough to provide enough closed loop system damping to avoid output oscillation. For example, a PID controller with a proportional gain which is 10% of that in the stabilizing controller G2d(s), while the integral and derivative gains remain the same as in C 2 d(s), is used in regulating the model G2(s) and the non-linear engine model. This controller is considered to be a "over reduced" gain controller. The step response of the model G%(s) with this controller is given in Figure 5.14. 1.81 , . 1 • 1 1.6 - A 1.4- / \ 1.2 - / \ /\ • S 1 - / I / \ /~\_/-~"- O 0.8 -1 \ / 0.6 - J ^ 0.4 -I 0.2 J rji 1 1 1 1 0 2 4 6 8 10 Time (sec) Figure 5.14 : Step Response of G2(s) with the Reduced Gain Controller An oscillating output is observed in Figure 5.14. The same controller is used with the 67 non-linear engine model and the closed loop response to a 5° throttle input is given in Figure 5.15. Time (sec) Figure 5.15 : Output of the Engine Model with a Reduced Gain Controller Again, an oscillating output is observed. This serves as a good prediction on the lower limit of the controller gains to avoid output oscillation. The same situation is observed when the model G2d(s) is used instead of the model G2(s). Therefore, the model G 2 d(s) can be used to estimate both upper and lower limit of the controller gains. 68 Chapter 6 Discussion and Recommendations In this study, it is proposed to use a constant transport delay with a second order linear model to re-gain the phase characteristics of an engine at high frequency. There are two reasons to use a transport delay with a second order model instead of a higher order model. First, for a model of order higher than 2, the extra poles are usually large compared with the first or the second pole. By neglecting these large poles, the model can be remained as a second order one. A plot of the poles for the second order model G2(s), third order model Gs(s) and fourth order model Gs(s) used to approximate the engine model in this study is given in Figure 6.1. The transfer functions of these models are given previously in Table 4.2. The values of these poles are given in Table 6.1. It is clearly that the third and fourth order models have poles which are much larger than their smallest pole. 69 60 40 20 -20 -40 -60 ~i T i i 1 1 1 1 1 r x 2nd Order Poles + adCrderPoles o 4thOrder Poles -50 -45 -40 -35 -30 -25 -20 -15 -10 Figure 6.1 : Poles of Approximated 2nd, 3rd and 4th Order Models Linear Model G 2 (s) G 3 (s) G A (s) Poles s = -2.0839, -13.9568 s = -2.0437, -26.3739, -33.9824 s =-2.0490, -19.4443, -42.2524 ± 56.6203i Table 6.1 : Poles of the Approximated Models Second, there are actual process delays presented in a four stroke internal combustion engine [12]. These varying process delays are related to the four stroke combustion process and are parameterized by the engine speed (refer to Equation (2.13) and Equation (2.14)). The constant transport delay in model, G2d(s) can be thought of as an average of the varying process delays over the engine operating range. However, there is an important 70 drawback on this approach to represent the varying process delay. From equations (2.13) and (2.14), it is noticed that the process delay will be smaller when the engine speed becomes higher. Hence, if a throttle step input is applied to the approximated model and the non-linear engine model, the error between the outputs will be large at the beginning but getting smaller as the engine speed increases. In Figure 6.2, the errors of the outputs of the three linear models, Gi(s), G2(s) and G2d(s), are plotted against time. The corresponding non-linear model output is given in Figure 6.3. The input throttle is applied when time t = 0.5 sec. It shows that the model G 2 d(s) has the smallest error at the beginning of the simulation, while model G2(s) has the lowest overall error magnitude. Although after about 1 sec (engine speed at about 83% of the final steady state value), the error in model G2d(s) drops back to the lowest among the three models, this is still a disadvantage for using model G2d(s) in transient response analysis. 2.5 2 1.5 1 | 0.5 if 0 UJ 1-0.5 ex CO -1 -1.5 -2 -2.5 •1st Model Error • 2nd Model Error • 3rd Model Error 2 2.5 3 Time (sec) Figure 6.2 : Speed Error of models Gi(s), G2(s) and G 2d (s) 71 310 300 ^29 0 ^28 0 % 2 270 cu cu OT 260 250 - - - 0 1 1 1 1 2 3 Time (sec) 1 - - - 4 5 Figure 6.3 : Speed Output of Non-Linear Engine Model In addition, although the constant transport delay in the model G2d(s) makes up the extra phase lag needed for approximating the non-linear model at high frequency region, it adds extra delay to the system at low frequency input. In Figure 6.4 and Figure 6.5, the error of outputs of the three linear models are plotted for sinusoidal input frequency of 10 rad/s and 30 rad/s respectively (noted that the transport delay is much smaller than the periods of the chosen input signals). 72 -1st Model Error - 2nd Model Error - 3rd Model Error 1 Time (sec) Figure 6.4 : Speed Error of Models with Input at 10 rad/s 10 8 6 •s 2 •5 t 0 o •S .2 CD a. W -4 -6 -8 -10 1 1 AM y n v U \ i — 1st Model Error — 2nd Model Error — 3rd Model Error , - • 0.5 1 Time (sec) 1.5 Figure 6.5 : Speed Error of Models with Input at 30 rad/s These figures show that the error of the model G2(s) is higher than that of model G2d(s) for input frequency at 30 rad/s, while the reverse holds for the input frequency at 10 rad/s. The equality is found at around 20 rad/s. From Figure 4.12a & b and Figure 4.14a & b (Chapter 4.3), it is found that the second order model G 2 (s) has a better approximation for the phase angle in low frequency range than the model G2d(s). In Figure 4.13 (Chapter 4.4), it is observed that the slope of the fitted line is smaller (more negative) than that of the phase different data in low frequency region, and is about the same at frequency C=L 20 rad/s. Therefore, the above observation can be explained by extra delay being added to model G 2d (s) in low frequency region. Finally, it is recommended to use a second order model for application with low frequency perturbation Otherwise, a second order model with transport delay should be used. If the application consists of a wide range of frequency, a second order model with varying transport delay may be considered. 74 Chapter 7 Conclusions A two-state non-linear model is used to represent the relationship between the throttle angle and the engine speed of an internal combustion engine. Equations (3.1) and (3.2) are the state equations used in this model. The input throttle angle can be the gas pedal command from the driver, the automatic cruise control and the fuel command feedback control. The output engine speed is the speed under no external loading. Three different linear models, first order, second order and second order with transport delay, are used to approximate this non-linear engine system with an operating range of 25° ± 5° throttle input and a frequency range of 100 rad/s (~ 16 Hz). It is found that the second order model with transport delay gives the best overall approximation, in both system gain and phase, among the others. It is further noticed that a stabilizing controller for such model will also stabilize, or give a better guess of the controller gain for, the non-linear engine system. Moreover, this model can also be used to estimate the upper and lower limit of the controller gains. On the other hand, controllers designed for the first order model and second order model do not guarantee to give a stable 75 closed loop system when being applied to the non-linear engine model. Although with extra effort on finding the control constraints, a stable closed loop system can be obtained with such controller, there is no specific rule to determine these constraints. The use of a second order model with constant transport delay introduces extra delay at low engine speed and extra phase lag in low frequency region. Time-varying transport delay is recommended to use in application with wide frequency range. This requires further study on the determination of such transport delay. 76 Bibliography [1] Amelio, M., Belli, M., and Danieli, G. A., "A Multidimensional Performance Model of a Spark Ignition Engine Characterized by a Single Step Reaction to Equilibrium," Combust. Sci. and Tech., Vol. 45, 1986, pp. 115-128. [2] Bosch, Automotive Handbook, Robert Bosch GmbH, 1993. [3] Cassidy, J. F. JR., Athans, M., and Lee, W. H., "On the Design of Electronic Automo tive Engine Controls Using Linear Quadratic Control Theory," IEEE Trans. Automatic Control, Vol. AC-25, No. 5, Oct. 1980. [4] Cho, D., and Hedrick, J. K., "A Nonlinear Controller Design Method for Fuel-Injected Automotive Engines," ASME Journal of Engineering for Gas Turbines and Power, Vol. 110, No. 3, July 1988, pp. 313-320. [5] Cho, D., and Hedrick, J. K., "Automotive Powertrain Modeling for Control," ASME Journal of Dynamic Systems, Measurement, and Control, Vol. Ill , No. 4, Dec. 1989, pp. 568-576. [6] Cho, D. D., and Oh, H. K , "Variable Structure Control Method for Fuel-Injected Systems," ASME Journal of Dynamic Systems, Measurement, and Control, Vol. 115, Sept. 1993, pp. 475-481. 77 [7] Gambino, M., Pianese, C , and Rizzo, G., "Identification of a Dynamic Model for Transient Mixture Formation in a Multi-Point Spark Ignition Engine," ASME Trans portation Systems, DSC-Vol.54/DE-Vol. 76, Nov. 1994, pp. 189-204. [8] Heywood, J. B., Internal Combustion Engine Fundamentals, McGraw-Hill, 1988. [9] Kamei, E., Namba, H., Osaki, K., and Ohba, M., "Application of Reduced Order Model to Automotive Engine Control System," ASME Journal of Dynamic Systems, Measurement, and Control, Vol. 109, Sept. 1987, pp. 232-237. [10] Luh, G. C , and Rizzoni, G., "Identification of a Nonlinear MIMO Internal Combustion Engine Model," ASME Transportation Systems, DSC-Vol.54/DE-Vol. 76, Nov. 1994, pp. 141-174. [11] McMahon, D. H., and Hedrick, J. K., "Longitudinal Model Development for Automated Roadway Vehicles," Program on Advanced Technology for the Highway, Institute of Transportation Studies, UC Berkeley, Oct. 1989. [12] Moskwa, J. J., and Hedrick, J. K., "Modeling and Validation of Automotive Engines for Control Algorithm Development," ASME Journal of Dynamic Systems, Measurement, and Control, Vol. 114, June 1992, pp. 278-285. [13] Powell, B. K., "A Dynamic Model for Automotive Engine Control Analysis," Proc. of IEEE Conf. on Decision and Control, 1979, pp. 120-126. [14] Powell, B. K., Lawson, G. P., and Hogh, G., "Advanced Real-Time Powertrain System Analysis," ASME Journal of Engineering for Gas Turbines and Power, Vol. 110, July 1988, pp. 325-333. [15] Powell, J. D., "Engine Control Using Cylinder Pressure: Past, Present, and Future," ASME Journal of Dynamic Systems, Measurement, and Control, Vol. 115, June 1993, pp. 343-350. 78 [16] Shiao, Y., and Moskwa, J. J., "Cylinder Pressure and Combustion Heat Release Esti mation for SI Engine Diagnostics Using Nonlinear Sliding Observers," ASME Trans portation Systems, DSC-Vol.54/DE-Vol. 76, Nov. 1994, pp. 127-140. [17] Won, M., Choi, S. B., and Hedrick, J. K, "An Adaptive Sliding Mode Control of Automobile Engine Speed Under Unknown Loads," ASME Transportation Systems, DSC-Vol.54/DE-Vol. 76, Nov. 1994, pp. 175-188. 79 Appendix A Program Code (C) /* MAIN.C - This file contains the menu of the simulation program. */ /* */ /* Kinping Lee */ /* 12/3/94 +/ /••A****************************************************************/ tfinclude <stdio.h> #include "simulate.h" main(unsigned int argc, char **argv) { char choice; int end_program=0; while (! end_jprogram) { puts("\n\n\n *** SIMULATION PACKAGE ***\n\n"); puts(" (1) Engine\n"); puts(" (2) Transmission\n"); puts(" (3) Drive Train\n"); puts(" (4) Overall Powertrain\n"); puts(" (0) Exit Program\n\n\n"); printf(" Enter Choice <0> : ") ; gets(fichoice); switch(choice) { case '1' : printf("engine part\n"); engine_simu(); break; case '2' : printf("transmission part\n"); break; case '3' : printf("drive train part\n"); break; case '4' : printf("overall\n"); break; default : /* Exit program */ end_program = 1; ); }; printf("Program exited normally\n"); /•••••a**************************************************/ /* MAIN.H - This is a header file for the main function */ /* */ /* Kinping Lee */ /* 12/3/94 */ /********************+*+****************++**+******•**++** / tfdefine BELL 0x007 81 /•A***************************************************************/ /* SIMULATE.C - This file contains the functions engine_simu() */ and eng_integrating(), which are used to manage the execution logic of the simulation and perform the numerical integration. /* /* /* /* /* /* / Kinping Lee 12/3/94 */ */ */ */ */ */ ••A**************************************************************/ #include <stdio.h> #include <math.h> ^include "main.h" #include "enginel.h" #include "mathfunc.h" #include "simulate.h" #include "get.h" extern extern extern extern extern extern extern extern extern double double double int int int int double double start; stop; step; pstep; cycles; current; current item; alpha; alphastep; /* /* /* /* /* /* /* /* /* simulation start time */ simulation stop time */ iintegration step time */ data storage step */ total no. of integration cycles */ current cycle number */ current index of the variables */ current throttle angle */ /* throttle step size */ /* default output filename */ static char out_filename[30]="engout.dat"; /* function used to manage the execution logic of the simulation */ void engine_simu(void) i double *states_val, *states_init; int i,j, continuing=l, new=l; FILE *out_fptr; char choice,t_outfile[30]; /* input simulation parameters from user */ if (!get_simu_data()) return; if (current==0) ( /* input engine parameters from user */ if (!get_eng_data()) return; states_val = (double *)calloc(ENGSTATES, sizeof(double)); states_init = (double *)calloc(ENGSTATES,sizeof(double)); /* input engine initial status */ if (!get_eng_init(states init)) return; for (i=0;i<ENGSTATES;i++) states val[i] = states initfi]; 82 ) else new = 0; /* the main integrating and outputing loop */ while (continuing) { i /* get the output data filename */ printf("Enter output data file name : [%s] ",out_filename); gets(t_outfile); /* this segment can be modified to a function for */ /* clear spaces in a char array */ switch (t_outfile[0] ) ( case '\0' : case '\n' : sprintf(t_outfile,"%s",out_filename); break; case ' ' : i = 0; j = 0; do { i++; if ((isalpha(t_outfile[i]))|| (t_outfile[i]=='\0')) { t_outfile[j] = t_outfile[i] ; j++; } ) while (t_outfile[i]!='\0 I ); if (t_outfile[0]=='\0 r ) sprintf(t_outfile,"%s",out_filename) ; break; default : break; ) /* open the output data file */ out_fptr = fopen(t_outfile,"a+"); if (out_fptr==NULL) { printf("%s : open file error!!%c\n", t_outfile,BELL); continue; ) /* simulation start confirmation */ printf("\nOutput data will be printed in \"%s\".\n",t_outfile); printf("Enter \"q\" to quit or press return to start...\n"); gets(Schoice); switch (choice) { case 'q' : case 'Q' : continuing =0; continue; default : sprintf(out_filename,"%s",t_outfile); printf("Start simulating....\n"); break; 1 /* simulation execuation */ if (new) put_out_data(out_fptr, states_val, ENGSTATES); eng_integrating(states_val, out_fptr); 83 fclose(out_fptr); printf("Simulation completed!%c\n\n",BELL); printf("Continue with this settings ? [n] "); gets(fichoice); switch- (choice) { case 'y 1 : case 'Y 1 : if (!get_simu_data()) return; continuing =1 ; if (current==0) { for (i=0;i<ENGSTATES;i++) states_val[i] = states_init[i]; new = 1; ) else new = 0; break; default : continuing = 0; break; ) 1 /* function used to perform numerical integration using Runge Kutta */ void eng_integrating(double *states, FILE *out_fptr) { int i, j, print_item=0; double *states_out; states_ou t = (double *)calloc(ENGSTATES,sizeof(double)); for (i=current;i<cycles;i++) { runge_kutta4(step * current, states, states_out, ENGSTATES, step, state_deriv); current_item++; current++; print_item++,- if ((current_item)>=ITEMSTORE) current_item = 0; for (j=0;j<ENGSTATES;j++) states[j] = states_out[j]; if ((print_item==pstep)||(current==cycles)) ( put_out_data(out_fptr, states, ENGSTATES); print_item =0 ; } /* SIMULATE.H - This is a header file for the simulation */ /* functions */ /* */ /* Kinping Lee */ /* 12/3/94 */ /•A**************************************************************/ tfdefine ITEMSTORE 2500 84 void engine_simu(void); void eng_integrating(double *, FILE *); 85 /* ENG_EQT1.C - This file contains the functions used to describe */ /* the dynamics of the engine and calculate the */ /* necessary parameters. */ /* The engine model described in this file is a */ /* four state engine model. However only two of the */ /* states are being simulated, the mdotegro and */ /* mdotfi are ignored. */ /* In addition, user can replace this file by */ /* another engine model file, hence different engine */ /* models can be simulated using this program */ /* */ /* Kinping Lee */ /* 12/3/94 */ /****+*** + *+++****************************************-k+***++*-k* + *+/ tfinclude <math.h> #include <stdio.h> #include "main.h" #include "simulate.h" iinclude "enginel.h" #include "mathfunc.h" /* the followings are global variables which controls the flow */ /* of the simulation program */ extern double step; /* integration step size */ extern int current; /* current cycle number */ extern int current_item; /* current index of the variables */ extern double alpha; /* current throttle angle */ extern int test_run; extern int test_period; /* the following function contains the set of first order */ /* differential equations for a particular engine, basically, */ /* the name of the function - "state_deriv" should be used in */ /* other kind of engine equations in order to reduce the */ /* modification needed in the simulation program when it is */ /* used to simulate other kinds of engines, such as electrical */ /* engine */ void state_deriv(double time, double *xn, double *deriv) { static int i=0; double dTm, Tm, ma, nv, mdotegri; double den, TC, PR, PRI, mdotai; double MAX = 0.1843; /* obtain throttle angle, alpha, at specific time */ switch (test_run) { case 1 : if (current==0) test_period = 0; if (!get_alpha_tl(i,time)) { printf("Throttle angle calculation error!!%c\n",BELL); exit(2); } break; case 2 : if (current==0) test period = 0; 86 if (!get_alpha_t2(i,time)) ( printf("Throttle angle calculation error!!%c\n",BELL); exit(2); ) break; case 3 : if (current==0) test_period = 0; if (!get_alpha_t3(i,time)) { printf("Throttle angle calculation error!!%c\n",BELL); exit(2); 1 break; default : if (!get_alpha(time) ) { printf("Throttle angle calculation error!!%c\n",BELL); exit(2); ) break; i++; if (i==4) i = 0; /* Tm - manifold temperature */ /* asssume the manifold pressure to be constant throughout */ /* the manifold volume, and set to 310K */ Tm = 310.0; /* dTm - rate of change of temperature inside intake manifold */ /* this value is set to zero as in the engine assumption, */ /* however if data is possible, this can be any function */ /* of time and/or the state variables */ dTm =0.0; /* ma - mass of air inside intake manifold */ • /* use ideal gas equation to estimate from manifold pressure */ ma = 28.84 * xn[0] * 0.0027 / (Ridealm * Tm); /* PR - pressure ratio of intake manifold pressure and */ /* atmospheric pressure */ PR = xn[0] / Patm; /* TC - throttle flow characteristics - function of alpha */ /* this is an empirical equation, the characteristic of this */ /* equation can be found in documentation */ if (alpha<=79.46) TC = 1.0 - cos(DEG2RAD((1.14459 * alpha - 1.06))); else TC = 1.0; /* PRI - throttle flow characteristics - function of PR */ /* this is also an empirical equation, the characteristic of */ /* this equation can be found in documentation */ if (PR<=1.0) PRI = 1.0 - exp(9.0 * (PR - 1.0)); else PRI = 0.0; /* mdotai - mass flow of air into intake manifold */ /* this parameter is charactered by the value TC and PRI */ /* basically, another detail model is found in reference [8], */ /* but the drag coefficiency of the throttle is needed */ 87 mdotai = MAX * TC * PRI; /* nv - volumetric efficiency */ nv = ma * ma * (24.5 * xn[2] - 0.00031) + (222.0 - 0.167 * xn[2]) * ma +( 0.00081 * xn[2] + 0.352); /* this second model is a parabola fit according to normal */ /* sense */ /* get_nv(xn[2], &nv); */ /* mdotegri - mass flow of EGR into intake manifold */ /* at this moment, no solid information on this is available */ mdotegri = 0.0; /* calculation of the derivates of the states from the state */ /* equations (this equations can be found in documentation */ /* at this moment, only two states are implementing due to the * /* lack of information on two variables, modtegri (refer to */ /* above) and mdotfc (refer to the function - cal_dmdotfi) */ deriv[0] = cal_dPm(time, xn, dTm, Tm, nv, mdotai, mdotegri); deriv[l] = cal_dmdotegro(time, xn, nv, mdotegri); deriv[2] = cal_dwe(time, xn, nv, ma, mdotai, mdotegri, deriv[0], Tm) ; deriv[3] = cal dmdotfi(time, xn); ) /* function used to calculate the derivative of Pm */ double cal_dPm(double time, double *xn, double dTm, double Tm, double nv, double mdotai, double mdotegri) { double dPm; double MAX=0.1843; /* maximum flow thru throttle valve */ /* obtain from engine data file */ /* dPm - the derivative of intake manifold pressure */ /* refer to equation (1.1) */ dPm = -0.112 * xn[2] * nv * xn[0] + Ridealkg * Tm * (mdotai + mdotegri) / 0.0027; return dPm; ) /* function used to calculate the derivative of mdotegro */ double cal_dmdotegro(double time, double *xn, double nv, double mdotegri) { double dmdotegro; dmdotegro = 0.095 * nv * xn[2] * (mdotegri - xn[l]); return dmdotegro; 88 /* function used to calculate the derivative of we */ double cal_dwe(double time, double *xn, double nv, double ma, double mdotai, double mdotegri, double dPm, double Tm) { static double mdotao[4][ITEMSTORE]; static double AFI[ITEMSTORE], SI[ITEMSTORE]; static double we[4][ITEMSTORE]; static int j=0; double dwe, deltit, deltst, AF, t_mdotao, t_AFI, t_SI, t_we, tt; double xrst, xrit; double Ti, Tf; int it_d, st_d, it_dl, st_dl, i; double Ct=498636.0; /* maximum torque production */ /* mdotao - mass flow of air out of intake manifold */ /* from reference [4], equation (21) */ mdotao[j][current_item] = mdotai + mdotegri - xn[l] - 0.0027 * dPm / (Ridealkg * Tm); we[j][current_item] = xn[2]; /* AF - air fuel ratio */ AF = 15.0; /* AFI - normalized air fuel influence */ /* this is an empirical equation, the characteristics of this */ /* equation is given in documentation */ AFI[current_item] = cos(DEG2RAD(7.3834 * (AF - 13.5))); /* SI - normalized spark influence */ /* this is an empirical equation, the characteristics of this */ /* equation is given in documentation */ SI[current_item] = pow(cos(DEG2RAD(10)), 2.875); /* initialize the three variables, mdotao, AFI and SI, if */ /* this is the first run of the integration */ /* this has the effect of assuming static states for time less */ /* than zero */ if (current==0) for (i=l;i<ITEMSTORE;i++) { we[j][i] = we[j][0]; mdotao[j][i] = mdotao[j] [0] ; AFI[i] = AFI[0]; SI[i] = SI[0]; ) /* deltit - delay from fuel injection to torque production */ /* reference [5] */ deltit = 5.48 / xn[2]; /* deltst - delay from spark to torque production */ /* reference [5] */ deltst = 1.3 / xn[2]; /* it_d - discretized deltit */ /* st_d - discretized deltst */ /* conversion of the continue delay to discrete index, as the */ 89 /* parameters are stored in discrete manner. */ it_d = (int)(deltit / step); if ((it_d>=ITEMSTORE) I I (it_d<0)) { printf("Error in delay : deltit = %lf%c\n\n",deltit,BELL); exit(1); ) else it_d = current_item - it_d; if (it_d<0) it_d = it_d + ITEMSTORE; if ((current_item-it_d)==0) it_dl = it_d; else it_dl = it_d + 1; if (it_dl>=ITEMSTORE) it_dl = it_dl - ITEMSTORE; st_d = (int)(deltst / step); if ((st_d>ITEMSTORE)||(st_d<0)) { printf("Error in delay : deltst = %lf%c\n\n",deltst,BELL); exit(1); } else st_d = current_item - st_d; if (st_d<0) st_d = st_d + ITEMSTORE; if ((current_item-st_d)==0) st_dl = st_d; else st_dl = st_d + 1; if (st_dl>=ITEMSTORE) st_dl = st_dl - ITEMSTORE; /* if the discretized delay is not an integer, use linear */ /* interpolation to find the appropriated values */ xrit = modf(deltit/step,&tt); xrst = modf(deltst/step,&tt); t_mdotao = interpolat(mdotao[j][it_d], mdotao[j][it_dl], xrit); t_AFI = interpolat(AFI[it_d] , AFI[it_dl], xrit); t_SI = interpolat(SI[st_d], SI[st_dl], xrst); t_we = interpolat(we[j][it_d], we[j][it_dl], xrit); /* Ti - indicated torque */ /* reference [5] */ Ti = Ct * t_mdotao * t_AFI * t_SI / t_we; /* Tf - friction torque */ /* this is an empirical equation */ Tf = 15.1 + 0.1056 * xn[2]; dwe = (Ti - Tf) / 0.1454; if (j==4) j=0; return dwe; ) /* function used to calculate the derivative of mdotfi */ double cal_dmdotfi(double time, double *xn) { double tf, mdotfc, dmdotfi; double MAX=0.1843; mdotfc = xn[3] + (xn[3] - xn[3]); tf = 0.05 + 1.5 * PI * mdotfc * 14.7 / (xn[2] * MAX); dmdotfi = (mdotfc - xn[3]) / tf; 90 retur n dmdotfi; ) 91 / ********* ******************************************************/ /* ENGINEl.H - This is the header file for the engine model /* description functions /* /* Kinping Lee /* 12/3/94 /***************************************************************/ */ */ */ */ */ #define ENGSTATES 4 fdefine Ridealm 8.31434 #define Ridealkg 0.288292 #define Patm 100.0 /* no of states of engine model */ /* ideal gas constant (kmole) */ /* ideal gas constant (kg) */ /* atmospheric or stagnation */ /* pressure */ void state_deriv(double, double *, double *); double cal_dPm(double, double *, double, double, double, double, double); double cal_dmdotegro(double, double *, double, double); double cal_dwe(double, double *, double, double, double, double, double, double); double cal dmdotfi(double, double *); 92 /******************************************************************* /* GET.C - This file contains functions used to obtain simulation */ /* data from user */ /* */ /* Kinping Lee */ /* 12/3/94 */ / ******************************************************************* / ^include <stdio.h> #include <math.h> #include "main.h" #include "get.h" #include "mathfunc.h" double double double int int int int start=0.0; stop=0.0; step=0.0; pstep=l; cycles=0; current=0; current item=0; /* /* /* /* /* /* /* double alphainit; double alphastep; double stepdura; double alpha; double eng_speed; int test_run=0; int test_period=0; simulation start time */ simulation stop time */ integration step time */ data storage step */ /* total no. of integration cycles */ current cycle number */ current index of the variables */ /* initial throttle angle */ /* throttle step size */ /* throttle step duration */ /* current throttle angle */ /* engine speed in rad/s */ /* boolean variable indicated a test run * /* no. of periods in a sinusoidal input */ /* function used to get simulation parameters from user */ int get_simu_data(void) { int confirm=0; int get_ok=0; char choice, choicel, dump, multi[10]; double t_start=0.0, t_stop=0.0, t_step, t_cycles=0.0; int t_pstep = 0; t_step = step; /* ask if the user want to continue a simulation and *> /* get the necessary information */ while (!confirm) { /* if this is a continue command */ if (stop!=0.0) { printf("(last stop at %10.51f sec)\n",stop); printf("(R)estart or (C)ontinue ? "); gets(&choice); switch (choice) ( case 'r' : case 'R' : t_start =0.0; printf("Reset start time = %10.51f sec\n", t_start); break; case 'c' : case 'C : t_start = stop; printf("Continue at %10.51f sec\n", t_start); break; default : printf("Invalid choice!!%c\n\n",BELL); continue; ) ) else printf("Simulation starts at %10.51f sec\n",t_start); /* get the stop time */ printf("Enter the stop time for the simulation : "); /* check for input syntax and logic errors */ if (Iscanf("%lf%c",St_stop, sdump)) { printf("Stop time input error!!%c\n\n",BELL); gets(Sdump); continue; ) if ( (t_stop<=t_start) | | ((t_stop-t_start)<MINSTEP)) { printf("Stop time value error!!%c\n\n",BELL); continue; } /* if a new cycle, get the integration step size */ if (t_start==0.0) { printf("Enter the integration step size (in sec) : "); if ( Iscanf("%lf%c",St_step, Sdump) | | (t_step<MINSTEP) || (t_step>(t_stop-t_start))) { printf("Step size error!!%c\n\n",BELL); continue; } } /* calculate the total number of cycles */ t_cycles = (t_stop - t_start) / t_step; if (modf(t_cycles, St_cycles)) { printf("Warning : Incomplete last cycle!%c\n",BELL); printf("\nModifying the stop time....\n"); t_cycles += 1.0; t_stop = t_start + t_cycles * t_step; printf("New stop time = %10.51f sec\n",t_stop); printf("Press return to continue..."); gets(Sdump); } /* enter the data storage step (multiples of integration */ /* step) */ printf("\nSample step size can be choosen at multiples of "); printf("integration step.\n"); printf("Enter the multiples : [%d] ",pstep); gets(multi); /* check if the multiple is an integer */ /* The following part can be written */ /* as a function */ switch (multi[0]) ( 94 case '\0' : case ' ' : case '\n' : t_pstep = pstep; break; case 'q' : case 'Q' : confirm =1 ; get_ok = 0; continue; default : t_pstep = atoi(multi); if (t_pstep==0) [ printf("An positive integer is required!!%c\n", BELL); continue; ) if (t_pstep>(int)t_cycles) { printf("Multiple larger than integration \ cycles!!%c\n",BELL); continue; ) break; } /* confirmation of input data */ printf(" Simulation will start at %10.51f sec\n",t_start); printf(" and end at %10.51f sec\n",t_stop); printf(" with integration step S10.51f sec\n",t_step); printf(" and integrating %10d cyc\n", (int)t_cycles) ; printf(" Output data at every %10d integrations\n", t_pstep); printf("\nConfirm data ? [y] "); gets(Schoice); switch (choice) { case 'N 1 : case 'n' : printf("Return to Main Menu ? [n] "); gets(Schoicel); switch (choicel) { case 'Y' : case 'y' : confirm =1 ; break; default : confirm =0 ; break; ) break; default : start = t_start; stop = t_stop; step = t_step; if (start==0.0) { cycles = (int)t_cycles; current =0 ; current_item =0 ; ) else cycles += (int)t_cycles; pstep = t_pstep; 95 } confirm =1 ; get_ok =1 ; break; } } return get_ok; /* function used to get engine parameters */ /* a function used to read data is required, but since */ /* this is only one set of parameter available, this */ /* function is left to be implemented later */ int get_eng_data(void) { char filename[30]; FILE *fptr; int get_ok=0, confirm=0; char choice, choicel; while (!confirm) { /* the engine parameters are expected to be stored in /* a data file */ /* get the engine data file name and open the file */ printf("\nEnter engine data file name : "); gets(filename); fptr = fopen(filename, "r"); if (fptr==NULL) { printf("File open error!!%c\n",BELL); printf("Return to Main Menu ? [n] "); gets(Schoice); switch (choice) ( case *y' : case 'Y' : return get_ok; default : continue; } } /* ask confirm */ printf("\nConfirm data ? [y] ") ; gets(Schoice); switch (choice) { case 'N' : case 'n' : printf("Return to Main Menu ? [n] "); gets(Schoicel); switch (choicel) { case 'Y* : case •y' : confirm = 1; break; default : confirm = 0; break; 1 break; default : /* do assignment here */ confirm = 1; } get_ok = l; break; ) ) return get_ok; /* function used to get the initial engine condition */ /* this function requires the user to input the initial condition, */ /* but this can also be done through calculation */ /* Basically, only engine speed is required to be input */ int get_eng_init(double *xn) { int confirm=0, get_ok=0; char choice, choicel, dump; double t_speed, t_alphastep, t_stepdura; while (!confirm) { /* this portion is only for testing of eng_eqtl.c !!!! */ printf("Initial Pm (xn[0]) = "); scanf("%lf%c",S(xn[0]), Sdump); printf("Initial mdotegro (xn[l]) = "); scanf("%lf%c",S(xn[l]), Sdump); printf("Initial we (xn[2]) = "); scanf("%lf%c",S(xn[2]), Sdump); printf("Initial mdotfi (xn[3]) = "); scanf("%lf%c",S(xn[3]), Sdump); printf("Initial alpha = "); scanf("%lf%c",Salphainit, Sdump); /* end of testing portion !!!!!!!!!!!!! */ /* get the intial engine speed */ printf("Enter the initial engine speed (in rpm) : "); if ((Iscanf("%lf%c",St_speed, Sdump))|| (t_speed<=MINSPEED)) ( printf("Speed error, positive number expected!!%c\n", BELL); continue; ) /* get the throttle step size */ /* at this stage, assume positive step input throttle */ printf("Enter throttle step value (in degree) : "); /* check input error */ if ((iscanf("%lf%c",St_alphastep, Sdump))|| ((alphainit+t_alphastep)<=MINALPSTEP)) { printf("Throttle step error!!%c\n", BELL); continue; } /* get the step duration time */ printf("Enter step duration (in sec) : "); /* check input error */ if (Iscanf("%lf%c",St_stepdura, Sdump)) { printf("Ste p duration error!!%c\n", BELL); 97 ) continue; } /* ask if a test run is expected */ printf("Perform a specific test (0, 1, 2 or 3) ? "); if (Iscanf("%d%c",stest_run, Sdump)) { printf("Input Error!!%c\n", BELL); continue; } /* input confirmation */ printf("\n Engine is running at %10.51f rpm,\n",t_speed); printf(" apply throttle step of %10.51f deg,\n", t_alphastep); printf(" within %10.51f sec.\n",t_stepdura); printf("\nConfirm data ? [y] "); gets(Schoice); switch (choice) ( case 'N' : case 'n' : printf("Return to Main Menu ? [n] "); gets(Schoicel); switch (choicel) ( case 'Y' : case 'y' : confirm = 1; break; default : confirm =0 ; break; } break; default : eng_speed = t_speed * 2.0 * PI / 60.0; alphastep = t_alphastep; stepdura = t_stepdura; alpha = alphainit; confirm = 1; get_ok =1 ; break; ) ) return get__ok; /* function used to calculate the throttle angle at specific time */ int get_alpha(double time) { double a2, a3; if (alphastep==0) return 1; if (((0.1*stepdura)=stepdura) alpha = alphainit + alphastep; if (alpha>(alphainit+alphastep)) return 0; return 1; } /* function used to calculate the throttle angle if test 1 is */ /* expected */ int get_alpha_tl(int i, double time) { double act_time=0.0; if (time<=0.1) return 1; act_time = time - 0.1 - 6.0 * test_period * stepdura; if ((act_time>=(6.0*stepdura))SS(i==0)) test_period++; if (act_time<=stepdura) alpha = alphainit + alphastep * act_time / stepdura; if ((act_time>stepdura)SS(act_time<=(2.0*stepdura))) return 1; if ((act_time>(2.0*stepdura))SS(act_time<=(4.0*stepdura))) alpha = alphainit + alphastep - alphastep * (act_time - 2.0*stepdura) / stepdura; if ((act_time>(4.0*stepdura))SS(act_time<=(5.0*stepdura))) return 1; if ((act_time>(5.0*stepdura))SS(act_time<=(6.0*stepdura))) alpha = alphainit - alphastep + alphastep * (act time - 5.0*stepdura) / stepdura; return 1; 1 /* function used to calculate the throttle angle if test 2 is */ /* expected */ int get_alpha_t2(int i, double time) { double act_time=0.0; if (time<=0.1) return 1; act_time = time - 0.1 - test_period * stepdura; if ((act_time>=stepdura)SS(i==0)) test_period++; alpha = alphainit + alphastep * sin(2.0 * PI * act_time / stepdura); return 1; 1 /* function used to calculate the throttle angle is test 3 is */ /* expected */ int get_alpha_t3(int i, double time) { double act_time=0.0; if (time<=0.1) return 1; act_time = time - 0.1 - test_period * stepdura; if ((act_time>=stepdura)SS(i==0)) test_period++; if (act_time<(0.l*stepdura)) alpha = alphainit + alphastep; else alpha = alphainit; return 1; 99 ) /* function used to calculate the volumetric efficiency of the engine /* using an empirical equation */ /* this equation gives a general value of volumetric efficiency, it */ /* is not obtained for a particular engine */ int get_nv(double we, double *nv) { double a, b, c, slope; a = -2.0e-6; b = 1.6e-3; c = 0.54; slope = 1.51e-4; if (we<362.25) nv[0] = 0.81 + slope * (we - 50.0); else nv[0] = a * we * we + b * we + c; /****************************************************************/ /* GET.H - This is a header file for the get* functions */ /* */ /* Kinping Lee */ /* 12/3/94 */ /****************************************************************/ tfdefine MINSTEP 0.0001 tfdefine MINSPEED 0.0 #define MINALPSTEP 0.0 int get_simu_data(void); int get_eng_data(void); int get_eng_init(double *); int get_alpha(double); int get_alpha_tl(int, double); int get_alpha_t2(int, double); int get_alpha_t3(int, double); int get nv(double, double *) ; /*****************************************'**********************/ /* PUT.C - This file contains the function put_out_data(), */ /* which is used to print the output data on to a file */ /* */ /* Kinping Lee */ /* 12/3/94 */ /***************************************************************/ #include <stdio.h> #include "put.h" extern double step; extern int current; extern int current_item; /* function used to print the output data on to a file */ void put_out_data(FILE *fptr, double *data, int no_data) { double time; int i ; time = step * current; fprintf(fptr,"%4d %8.41f ",current, time); for (i=0;i<no_data;i++) fprintf(fptr,"%8.41f ",data[i]); fprintf(fptr,"\n"); /* this flush only for debugging, later can use one fclose */ /* instead */ fflush(fptr); /********************************************************/ /* PUT.H - This is a header file for the put* functions */ /* */ /* Kinping Lee */ /* 12/3/94 */ /********************************************************/ void put out data(FILE *, double *, int); 101 Appendix B SIMULINK Representation of the of the Engine Subsystems Atmospheric Pressure Patm (kPa) •QEJh Inverse a e - Maximum Flow Rate thru' Throttle MAX (kg/s) —fcQ—H33—HPMCPR)!- Manifold Pressure Pm(kPa) Product Pressure Ratio Pressure Ratio Constraint Influence fen EJ •Si—• a'= Fc(o) TC(o') Throttle Angle Throttle Angle ^ „, A , alpha (deg) Saturation cSSSwS Throttle Flow Characteristics fen Q—*ta Productl Mass Rate of Air in [d/dt]mai (kg/s) Figure A.l : SIMULINK Representation of the Subsystem - Mass Rate of Air in 102 Q Mass of Air in Manifold ma (kg) a- Engine Speed w (rad/s) : * Volumetric Efficiencj nv & Speed Density Constant rd Product 1 •El Mass Rate of Air leaving Manifold [d/dt]mao (kg/s) Figure A.2 : SIMULINK Representation of Subsystem - Mass Rate of Air leaving Manifold & Mass Rate of Air leaving Manifold [d/dt]mao (kg/s) Eh -H AFI Air Fuel A/F Influence Ratio EH- Engine Speed w(rad/s) -H 1/u Inverse Ct Spark to Torque Delay Constant G Maximum Torque Capacity Product Intake to torque Delay Constant t Q 3fU- a- Productl Intake to Torque Delay -H SI Spark Angle Spark Influence Q 3^H Product2 •C D Indicated Torque Ti(Nm) Product3 Spark to Torque Delay Figure A.3 : SIMULINK Representation of Subsystem - Indicated Torque 103 Q Mass Rate of Air entering Manifold [d/dt]mai (kg/s) a ,—. |—KU Integrator L —J Pm (kPz & Mass Rate of Air leaving Manifold [d/dt]mao (kg/s) Continuity Equation Ideal Gas Equation Intake Manifold Pressure Pm (kPa) •m Mass of Air in Manifold ma (kg) Figure A.4 : SIMULINK Representation of Subsystem - Intake Manifold Dynamics a Indicated Torque Ti (Nm) a Friction Torque Tf(Nm) Z^ Q • l/J ^ ^j •|TJ Sum T-.£C^T c Integrator Engine Speed I C ntertk ngme â„¢ (rad ^ Figure A. 5 : SIMULINK Representation of Subsystem - Engine Dynamics 104 Appendix C Operating Procedure The procedures required to perform a simulation of the engine model in MATLAB are as follows : 1. Define the initial conditions - This procedure can be done manually or automatically using lookup table or computation function. There are five initial conditions needed to be defined : • init_Pm - Initial intake manifold pressure, P m . • init_w - Initial engine speed, w e . • init_AFI - Initial value of the air/fuel influence, AFI. • init-SI - Initial value of the spark influence, SI. • init-mdotao - Initial mass flow rate of air leaving intake manifold, m ao . 2. Load the engine parameter file - The engine parameter file contains the values of the engine variables. Different engines are described by different parameter files. 105 These parameters have to be grouped into a single vector namely "eng_param". The description and order of the parameters are as follows : • eng_param(l) - Intake manifold volume, V m . • eng_param(2) - Intake manifold temperature, Tu rn eng_param(3) to eng_param(5) - Parameters used to calculate the throttle characteristic, TC. • eng_param(6) - Maximum possible air flow through the throttle, MAX. • eng_param(7) to eng_param(13) - Parameters used to calculate the volumet ric efficiency, T] v . • eng_param(14) - Speed density constant, K. • eng_param(15) to eng_param(16) - Parameters used to calculate the air/fuel influence, AFI. • eng_param(17) to eng_param(18) - Parameters used to calculate the spark influence, SI. • eng_param(19) - Intake valve closing to torque time delay, A,{. • eng_param(20) - Spark to torque time delay, A S £. • eng_param(21) - Maximum torque capacity, Cx- • eng_param(22) to eng_param(23) - Parameters used to calculate the friction torque, Tf. • eng_param(24) - Engine inertia, J e . 106 3. Define the throttle input - The throttle input can be defined using tools in MATLAB SIMULINK. In this engine model, there are three different kinds of input available - step, ramp and sinusoidal. Any combination of these inputs can be used in the simulation. Figure C.l shows the representation of the throttle input in SIMULINK. a Throttle Angle Sine Input UJ Throttle Angle Step Input (deg) Throttle Angle Limited Ramp Input (deg) integrator • + r Sum •a Throttle Angle Input alpha (deg) Figure C.l : SIMULINK Representation of the Throttle Input The simulation is then ready to start. User can change the simulation parameters from the SIMULINK window menu. 107 Appendix D M-file of the Engine Model 108 function [ret,xO,str,ts,xts]=engn_Sl(t,x,u, flag); %ENGN_S1 is the M-file description of the SIMULINK system named ENGN_S1. % The block-diagram can be displayed by typing: ENGN_S1. % % SYS=ENGN_S1(T,X,U,FLAG) returns depending on FLAG certain % system values given time point, T, current state vector, X, % and input vector, U. % FLAG is used to indicate the type of output to be returned in SYS. % % Setting FLAG=1 causes ENGN_S1 to return state derivatives, FLAG=2 % discrete states, FLAG=3 system outputs and FLAG=4 next sample % time. For more information and other options see SFUNC. % % Calling ENGN_S1 with a FLAG of zero: % [SIZES]=ENGN_S1([],[],[] ,0) , returns a vector, SIZES, which % contains the sizes of the state vector and other parameters. % SIZES(1) number of states % SIZES(2) number of discrete states % SIZES(3) number of outputs % SIZES(4) number of inputs % SIZES(5) number of roots (currently unsupported) % SIZES(6) direct feedthrough flag % SIZES(7) number of sample times % % For the definition of other parameters in SIZES, see SFUNC. % See also, TRIM, LINMOD, LINSIM, EULER, RK23, RK45, ADAMS, GEAR. % Note: This M-file is only used for saving graphical information; % after the model is loaded into memory an internal model % representation is used. % the system will take on the name of this mfile: sys = mfilename; new_system(sys) simver(1.3) if (0 == (nargin + nargout)) set_param(sys,'Location',[20,56,726,531]) open_system(sys) end; set_param(sys,'algorithm', 'RK-45') set_param(sys,'Start time', '0.0') set_param(sys,'Stop time', '5') set_param(sys,'Min step size', '0.01') set_param(sys,'Max step size', '0.01') set_param(sys,'Relative error','le-4') set_param(sys,'Return vars', 't') set_param(sys, 'AssignWideVectorLines ', 'on') ; add_block(*built-in/Fen',[sys,'/',['Friction Torque',13,'Tf ']]) set_param([sys,'/',['Friction Torque',13,'Tf ']],... 'Font Name','Times New Roman', ... 'Font Size',12,... 'Drop Shadow',4,... 'Expr','K3+K4*u',... 'Mask Display','Tf, .. . 'Mask Type','Characteristics Equation') set_param([sys,'/',['Friction Torque',13,'Tf ']],... 109 'Mask Dialogue','Friction Torque (Empirical Equation)\nTf = K3 + K4 * w|K3:|K4:',... 'Mask Translate','K3=@1;K4=@2;•) set_param([sys,'/',['Friction Torque',13,'Tf ']],... 'Mask Help','Friction Torque Function - \nTf (Nm) = K3 + K4 * w\n\nK3 - eng_param(22), K4 - eng_param(23)\nw - engine speed (rad/s)',... 'Mask Entries','eng_param(22)\/engjparam(23)\/') set_param([sys,'/',['Friction Torque',13,'Tf ']],... 'position',[310,360,350,380]) add_block('built-in/To Workspace',[sys,'/',['Manifold Pressure',13,'Pm']]) set_param([sys,'/',['Manifold Pressure',13,'Pm']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'mat-name','Pm',... •buffer','100000*,... 'position',[515,121,590,139]) % Subsystem ['Engine',13,'Dynamics']. new_system([sys,'/',['Engine',13,'Dynamics']]) set_param([sys,'/',['Engine',13,'Dynamics']],'Location',[136,242,642,453 ]) add_block('built-in/Inport',[sys,'/',['Engine',13,'Dynamics/Indicated Torque',13,'Ti (Nm)']]) set_param([sys,'/',['Engine',13,'Dynamics/Indicated Torque',13,'Ti (Nm)']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'position',[65,20,85,40]) add_block('built-in/Inport',[sys,'/',['Engine', 13, 'Dynamics/Friction Torque',13,'Tf (Nm)']]) set_param([sys,'/',['Engine',13,'Dynamics/Friction Torque',13,'Tf (Nm)']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... •Port','2',... 'position',[65,125,85,145]) add_block('built-in/Sum',[sys,'/',['Engine',13,'Dynamics/Sum']]) set_param([sys,'/',['Engine',13,'Dynamics/Sum']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'inputs','+-',... 'position',[170,74,195,101] ) add_block('built-in/Gain',[sys,'/',['Engine' ,13, 'Dynamics/Effective Engine',13,'Intertia']]) 110 set_param( [sys,'/',['Engine',13,'Dynamics/Effective Engine',13,'Intertia']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Gain','1/Je*,... 'Mask Display','',... 'Mask Type','Engine Parameter') setjparam([sys,'/',['Engine',13,'Dynamics/Effective Engine',13,'Intertia']],... 'Mask Dialogue','Effective Engine Inertia - Ie|Ie (kgm A 2):',... 'Mask Translate','Je=@l;',... 'Mask Help','Effective Engine Inertia - eng_param(24)') set_param([sys,'/',['Engine',13,'Dynamics/Effective Engine',13,'Intertia']],... 'Mask Entries','eng_param(24)\/',... •position',[240,67,290,113]) add_block('built- in/Integrator' ,[sys,'/',['Engine',13,'Dynamics/Integrator']]) set_param([sys,'/',['Engine',13,'Dynamics/Integrator']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'Initial','init_w',... •position',[345,80,365,100]) add_block('built-in/Outport',[sys,'/',['Engine' ,13, 'Dynamics/Engine Speed',13,'w (rad//s)']]) set_param([sys,'/',['Engine',13,'Dynamics/Engine Speed',13,'w (rad//s)•]],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'position',[435,80,455,100]) add_line([sys,'/',['Engine',13,'Dynamics']], [370, 90; 430, 90]) add_line([sys,'/*,['Engine',13,'Dynamics']],[295,90;340, 90]) add_line([sys,'/',['Engine',13,'Dynamics']] , [200, 90; 235, 90]) add_line([sys,•/',['Engine',13,'Dynamics']],[90,30;135,30;135,80;165,80] ) add_line([sys,'/',['Engine',13,'Dynamics']],[90,135;135,135;135, 95;165,9 53) % Finished composite block ['Engine', 13,'Dynamics']. set_param( [sys,'/',['Engine',13,'Dynamics']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'position',[475,266,505,319]) add_block('built-in/To Workspace',[sys,'/',['Engine Speed',13,'w ']]) set_param([sys,'/',['Engine Speed',13,'w ']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'mat-name','w', ... Ill 'buffer*,'100000',... 'position*,[585,286,650,304] ) % Subsystem ['Indicated Torque', 13,'Ti'] . new_system([sys,'/',['Indicated Torque',13,'Ti']]) set_param([sys,'/',['Indicated Torque',13,'Ti']],'Location',[29,88,737,536] ) add__block('built-in/Variable Transport Delay', [sys, '/',['Indicated Torque',13,'Ti/Intake to Torque',13,'Delay' ]]) set_param([sys,'/',['Indicated Torque',13,'Ti/Intake to Torque',13,'Delay']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'Maximum delay:','max_d',... 'Initial Input','init_cond') set_param([sys,'/',['Indicated Torque',13,'Ti/Intake to Torque',13,'Delay']3,... 'Maximum points:','buf',.. . 'Mask Display','',... 'Mask Type','Variable Delay') set_param([sys,'/',['Indicated Torque',13,'Ti/Intake to Torque',13,'Delay']],... 'Mask Dialogue','Intake to Torque Production DelayIMaximum Delay:|Initial [dot]mao:|Initial Engine Speed:|Initial AFI:|Initial Buffer:') set_param([sys,'/',['Indicated Torque',13,'Ti/Intake to Torque',13,'Delay']],... 'Mask Translate','max_d=@l;init_cond=@2*@4/@3;buf=@5;',... 'Mask Help','Intake to Torque Production Delay Time') set_param([sys,'/',['Indicated Torque',13,'Ti/Intake" to Torque',13,'Delay']],... 'Mask Entries','2\/init_mdotao\/init_w\/init_AFI\/4096\/',... 'position*,[430,207,470,238]) add_block('built-in/Outport',[sys,'/', ['Indicated Torque',13,'Ti/Indicated Torque',13,'Ti (Nm)'33) set_param([sys,'/',['Indicated Torque',13,'Ti/Indicated Torque',13,'Ti (Nm) ' ]] , . . . 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... •position*,[635,215,655,235]) add_block('built-in/Product',[sys,'/',['Indicated Torque',13,'Ti/Product2']]) set_param([sys,'/',['Indicated Torque',13,'Ti/Product2']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'inputs','3',... •position',[530,202,560,248]) 112 add_block('built-in/Product',[sys,'/', ['Indicated Torque',13,*Ti/Productl']]) set_param([sys,'/',['Indicated Torque',13,'Ti/Productl']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'position',[350,212,380,243]) add_block('built-in/Fcn',[sys,'/',['Indicated Torque',13,'Ti/Inverse']]) set_param([sys,'/',['Indicated Torque', 13,'Ti/Inverse']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'Expr*,'1/u',... 'position',[135,200,170,220]) add_block('built-in/Inport',[sys,'/', ['Indicated Torque',13,'Ti/Engine Speed',13,'w (rad//s)']3) set_param([sys,'/',['Indicated Torque',13,'Ti/Engine Speed',13,'w (rad//s)']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... •Port*,'4',... 'position',[60,200,80,220]) add_block('built-in/Constant',[sys,'/', ['Indicated Torque',13,'Ti/Maximum Torque',13,'Capacity']]) set_param([sys,'/',['Indicated Torque',13,'Ti/Maximum Torque',13,'Capacity']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... •Value',•Ct',... 'Mask Display','Ct', .. . 'Mask Type','Engine Parameter') set_param([sys,'/',['Indicated Torque',13,'Ti/Maximum Torque',13,'Capacity']],... 'Mask Dialogue','Maximum Torque Capacity (Ct)|Ct (Nm/kg):*,... 'Mask Translate','Ct=@l;',.. . 'Mask Help','Maximum Torque Capacity - eng_param(21)') setjparam([sys,'/',['Indicated Torque',13,'Ti/Maximum Torque',13,'Capacity']],... 'Mask Entries','eng_param(21)\/',... •position*,[310,45,330,65]) add_block('built-in/Product',[sys,'/', ['Indicated Torque',13,'Ti/Product']]) set_param([sys,'/',['Indicated Torque',13,'Ti/Product']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'inputs','3 *,... •position',[250,102,280,138]) add_block('built-in/Fcn',[sys,*/',['Indicated Torque',13,'Ti/A//F Influence*]]) 113 set_param([sys,'/',['Indicated Torque',13,'Ti/A//F Influence']],... 'Font Name','Times New Roman',... •Font Size',12,... 'Drop Shadow',4,... 'Expr','cos(Kl*(u-K2)*pi/180.0)',... 'Mask Display','AFI') set_param([sys,'/',['Indicated Torque',13,'Ti/A//F Influence']],... 'Mask Type','Characteristics Equation',... 'Mask Dialogue','A/F Influence (Empirical Equation)\nAFI = cos(Kl* (A/F - K2)) |K1:|K2: ', . . . 'Mask Translate','K1=@1;K2=@2;') set_param([sys,'/',['Indicated Torque',13,'Ti/A//F Influence']],... 'Mask Help','A/F Influence - \nAFI = cos(Kl * (A/F - K2)) \n\nKl - eng_param(15), K2 - eng_param(16)\nA/F - Air Fuel Ratio',... 'Mask Entries',*eng_param(15)\/eng_param(16)\/') set_param([sys,'/',['Indicated Torque',13,'Ti/A//F Influence']],... •position',[130,110,170,130]) add_block('built-in/Inport',[sys,'/',['Indicated Torque*,13,'Ti/Air Fuel',13,'Ratio']]) set_param([sys,'/',['Indicated Torque',13,'Ti/Air Fuel',13,'Ratio']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'position',[60,110,80,130]) add_block('built-in/Constant',[sys,'/',['Indicated Torque',13,'Ti/Intake to torque',13,'Delay Constant']]) set_param([sys,'/',['Indicated Torque',13,'Ti/Intake to torque',13,'Delay Constant']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'Value','it',... 'Mask Display','I -> T') set_param([sys,'/',['Indicated Torque',13,'Ti/Intake to torque',13,'Delay Constant']],... 'Mask Type','Engine Parameter',... 'Mask Dialogue','Intake to Torque Production Delay Constant|Delay Constant:',... •Mask Translate*,'it=@l;') set_param([sys,'/',['Indicated Torque',13,'Ti/Intake to torque',13,'Delay Constant']],... 'Mask Help','This constant together with the current engine speed produces the amount of time delay from intake stroke to torque production.\n- eng_param(19)') set_param([sys,'/',['Indicated Torque',13,'Ti/Intake to torque',13,'Delay Constant']],... 'Mask Entries','eng_param(19)\/',... 'position',[250,169,290,191] ) add_block('built-in/Variable Transport Delay',[sys,'/',['Indicated Torque',13,'Ti/Spark to Torque',13,'Delay*]]) set_param([sys,'/',['Indicated Torque',13,'Ti/Spark to Torque',13,'Delay']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 114 'Maximum delay:','max_d',... 'Initial Input','init_cond') set_param([sys,'/',['Indicated Torque',13,'Ti/Spark to Torque',13,'Delay']],... 'Maximum points:','buf',... 'Mask Display','',... •Mask Type','Variable Delay') set_param([sys,'/',['Indicated Torque',13,'Ti/Spark to Torque',13,'Delay']],... 'Mask Dialogue','Spark to Torque Production DelayIMaximum Delay:|Initial SI:|Initial Buffer:',... 'Mask Translate','max_d=@l;init_cond=@2;buf=@3;') set_param([sys,'/',['Indicated Torque',13,'Ti/Spark to Torque',13,'Delay']],... 'Mask Help','Spark to Torque Production Delay Time',... •Mask Entries','2\/init_SI\/4096\/', . . . 'position', [440,347,480,378]) add_block('built-in/Product',[sys,'/',['Indicated Torque',13,'Ti/Product3']]) set_param([sys,'/',['Indicated Torque',13,'Ti/Product3']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'position',[285,353,315,382] ) add_block('built-in/Constant',[sys,'/',['Indicated Torque',13,'Ti/Spark to Torque',13,'Delay Constant']]) set_param([sys,'/',['Indicated Torque',13,'Ti/Spark to Torque',13,'Delay Constant']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'Value','st', . . . 'Mask Display','S -> T') set_param([sys,'/',['Indicated Torque*,13,'Ti/Spark to Torque',13,'Delay Constant']],... 'Mask Type','Engine Parameter',... 'Mask Dialogue','Spark to Torque Production Delay Constant|Delay Constant:',... 'Mask Translate','st=@l;') set_param([sys,'/',['Indicated Torque',13,'Ti/Spark to Torque',13,'Delay Constant']],... 'Mask Help','This constant together with the current engine speed produces the amount of time delay from spark to torque production.\n- eng_param(20)') set_param([sys,'/',['Indicated Torque',13,'Ti/Spark to Torque',13,'Delay Constant']],... 'Mask Entries','eng_param(20)\/', ... •position',[100,363,145,387]) add_block('built-in/Fcn',[sys,'/',['Indicated Torque',13,'Ti/Spark Influence']]) set_param([sys,'/',['Indicated Torque',13,'Ti/Spark Influence']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'Expr','(cos((u-MBT)*pi/180.0)) A p',... 115 •Mask Display','SI') set_param([sys,'/',['Indicated Torque',13,'Ti/Spark Influence']],... 'Mask Type','Characteristics Equation',... 'Mask Dialogue','Spark Influence (Empirical Equation)\nSI (cos(SA - MBT)) A p|MBT:|p:',... 'Mask Translate','MBT=@l;p=@2;*) set_param([sys,'/',['Indicated Torque',13,'Ti/Spark Influence']],... 'Mask Help','Spark Influence -\nSI = (cos(SA - MBT)) A (power)\n\nSA - Spark Angle\nMBT - Minimum spark advanced from best torque\n - eng_param(17)\npower - a paramter of the empirical equation\n - eng_jparam(18) ') set_param([sys,'/',['Indicated Torque',13,'Ti/Spark Influence']],... 'Mask Entries','eng_param(17)\/eng_param(18)\/',... 'position',[320,280,360,300] ) add_block('built-in/Inport',[sys,'/',['Indicated Torque',13,'Ti/Spark Angle']]) set_param([sys,'/',['Indicated Torque',13,'Ti/Spark Angle']],... 'Font Name','Times New Roman',... •Font Size',12,... 'Drop Shadow',4,... 'Port','2',... •position',[230,280,250,300]) add_block('built-in/Inport',[sys,'/',['Indicated Torque',13,'Ti/Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao (kg//s)']]) set_param([sys,'/',['Indicated Torque',13,'Ti/Mass Rate of Air', 13,'leaving Manifold',13,'[d//dt]mao (kg//s)*]],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... •Port','3',... 'position',[75,20,95,40]) add_line([sys, '/ Torque',13,'Ti'] add_line([sys, '/ Torque',13,*Ti'] add_line([sys, '/ add_line([sys, '/ Torque',13,'Ti'] add_line([sys, ' / Torque',13,'Ti'] add_line([sys, '/ Torque',13,'Ti' ] add_line([sys, '/ Torque',13,'Ti' ] add_line([sys, '/ Torque',13,'Ti'] add_line([sys, ' / add_line([sys, '/ add_line([sys, ' / add_line([sys, '/ add_line([sys, '/ Torque',13,'Ti'] add_line([sys, '/ add_line([sys, '/ Torque',13,'Ti' ] add_line([sys,'/ 'Indicated 485,365;510,365;510,240;525,240]) 'Indicated 335,55;495,55;495,210;525,210]) 'Indicated Torque',13, 'Ti']],[150,375;280,375]) 'Indicated 100,30;195,30;195,110;245,110]) 'Indicated 175,210,-215,210;215,130;245,130] ) 'Indicated 185,210;185,235;345,235] ) 'Indicated 185,235;185,360;280,360]) 'Indicated 365,290;405,290;405,355;435,355]) 'Indicated Torque',13,'Ti']], [255,290;315,290]) 'Indicated Torque',13,'Ti']],[175,120;245,120]) •Indicated Torque',13,'Ti 1 ]],[85,210;130,210]) 'Indicated Torque',13,'Ti']],[475,225;525,225]) 'Indicated 285,120;395,120;395,215;425,215]) 'Indicated Torque',13,'Ti']],[85,120;125,120]) 'Indicated 295,180; 325,180; 325, 220,-345,220]) •Indicated Torque',13,'Ti']],[385,230;425,230]) 116 add_line([sys,'/',['Indicated Torque',13,'Ti']],[320,370;435,370]) add_line([sys,'/',['Indicated Torque',13,*Ti*]],[565,225;630,225]) % Finished composite block ['Indicated Torque',13,'Ti']. set_param([sys,'/',['Indicated Torque',13,'Ti']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... •position',[315,249,345,306]) % Subsystem ['Throttle Angle',13,'Input',13,'alpha']. new_system([sys,'/',['Throttle Angle',13,'Input',13,'alpha']]) set_param([sys,'/',['Throttle Angle',13,'Input',13,'alpha']],'Location', [4,55,522,330]) add_block('built-in/Step Fen',[sys,*/',['Throttle Angle',13,'Input',13,'alpha/Throttle Angle',13,'Ramp Input (deg)']]) set_param([sys,'/',['Throttle Angle',13,'Input',13,'alpha/Throttle Angle',13,'Ramp Input (deg)']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4, ... 'Time','0.5',... 'Before','-1',... •After','100') set_param([sys,'/',['Throttle Angle',13,'Input',13,'alpha/Throttle Angle',13,'Ramp Input (deg)']],... •position',[90,185,110,205] ) % Subsystem ['Throttle Angle',13,'Input',13,'alpha/Limited', 13, 'Integrator']. new_system([sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited', 13, 'Integrator']]) set_param([sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited', 13, 'Integrator']], 'Location',[452,2 29,1117,789]) add_block('built-in/Saturation',[sys, '/', ['Throttle Angle',13,'Input',13,'alpha/Limited',13,'Integrator/Saturation']]) set_param([sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited',13,'Integrator/Saturation']],... 'Lower Limit','lower_limit', ... 'Upper Limit','upper_limit', . . . 'position',[325,110,350,130]) add_block('built-in/Switch',[sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited*, 13, 'Integrator/Switch']]) set_param([sys,'/',['Throttle Angle',13,"Input',13,'alpha/Limited',13, 'Integrator/Switch']3,... •Threshold','0.5',... 'position',[110,80,135,160]) 117 add_block('built-in/Integrator',[sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited',13,'Integrator/Integrator']]) set_param([sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited*,13,'Integrator/Integrator']],... 'Initial','XO',... 'position',[165,99,200,141]) add_block('built-in/Constant',[sys,'/', ['Throttle Angle',13,'Input',13,'alpha/Limited',13,'Integrator/Constant2']]) set_param([sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited',13,'Integrator/Constant2']],... •Value','0',... 'position',[20,135,40,155]) add_block('built-in/Inport',[sys,'/*,['Throttle Angle',13,'Input',13,'alpha/Limited',13,'Integrator/Inport']]) set_param([sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited',13,'Integrator/Inport']],... •position',[25,85, 45,105] ) add_block('built-in/Outport',[sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited',13,'Integrator/Outport']]) set_param( [sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited',13,'Integrator/Outport']],... 'position',[515,110,535,130] ) add_block('built-in/Constant',[sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited',13,'Integrator/Constant4']]) set_param([sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited',13,'Integrator/Constant4']],... 'hide name',0,... 'Value',*0',... •position',[355,425,375,445]) add_block('built-in/Constant',[sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited',13,'Integrator/Constant3']]) set_param([sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited',13,'Integrator/Constant3']],... 'hide name',0, . . . •Value','0',... •position',[355,260,375,280] ) add_block('built-in/Logical Operator',[sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited',13,'Integrator/Logical',13,'Operato r']]) set_param([sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited',13,'Integrator/Logical',13, 'Operato r']],... 'hide name',0, . . . •Operator', 'AND', . .. 'position',[570,280,605,315]) add_block('built-in/Logical Operator',[sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited',13,'Integrator/Logical',13,'Operato r2' ]] ) set_param([sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited',13,'Integrator/Logical',13,'Operato r2 ']3,. . . 118 'hid e name',0,... 'Operator','OR' , . . . •position',[490,360,525,395] ) add_block('built-in/Logica l Operator',[sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited ' ,13, 'Integrator/Logical',13,'Operato rl']] ) set_param([sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited', 13, 'Integrator/Logical',13,'Operato rl']],... 'hide name',0, ... 'Operator','OR',... •position*,[490,200,525,235]) add_block('built-in/Relational Operator',[sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited', 13, 'Integrator/Relational',13,'oper ator2']]) set_param([sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited', 13, 'Integrator/Relational',13,'oper ator2']],... 'hide name',0, ... 'Operator','<=',... 'position',[415,231,445,284] ) add_block('built-in/Relational Operator',[sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited' ,13, 'Integrator/Relational',13,'oper ator3']]) set_param([sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited', 13, 'Integrator/Relational',13,'oper ator3']],... 'hide name', 0, . . . •position',[415,396,445,449]) add_block('built-in/Constant',[sys, '/', ['Throttle Angle',13,'Input',13,'alpha/Limited*, 13, 'Integrator/Constantl']]) set_param([sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited', 13, 'Integrator/Constantl']],... 'hide name',0,... 'Value','lower_limit', . . . 'position',[325,345,390,365] ) add_block('built-in/Relational Operator',[sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited', 13, 'Integrator/Relational',13,'oper atorl']]) set_param([sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited' ,13, 'Integrator/Relational', 13,'oper atorl']],... 'hide name',0, .. . 'position',[415,312,445,368]) add_block('built-in/Constant',[sys,'/', ['Throttle Angle',13,'Input',13,'alpha/Limited',13,'Integrator/Constant']]) set_param([sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited', 13, 'Integrator/Constant']],... 'hide name',0,... 'Value','upper_limit',... •position',[325,179,395,201]) 119 add block('built-in/Relational Operator 1 Angle',13,'Input',13,'alpha/Limited ator']]) set_param([sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited ator']],... 'hide name',0,... 'Operator','<=',... •position 1 ,[415,151,445, add_line([sys,'/',['Throttle Angle',13,'Input' ) add_line([sys, '/' Angle',13,'Input' ) add_line([sys,'/' Angle',13,'Input' add_line([sys, '/ ' Angle',13,'Input' ,245]) add_line([sys, '/ ' Angle',13,'Input' 0,410]) add_line([sys, ' / ' Angle',13,'Input' ) add_line([sys, '/ ' Angle',13,'Input' ) add_line([sys, '/' Angle',13,'Input' ) add_line([sys, '/' Angle',13,'Input' 625,490;85,490;85 add_line([sys, '/ ' Angle',13,'Input' add_line([sys, '/ ' Angle',13,'Input* 465,210;485,210]) add_line([sys, ' / ' Angle',13,'Input* 465,225;485,225]) add_line([sys, '/ ' Angle',13,'Input' 540,290;565,290]) add_line([sys, '/ ' Angle',13,'Input' 460,370;485,370]) add_line([sys, ' / ' Angle',13,'Input' 460,385;485,385]) add_line([sys, '/ ' Angle',13,'Input' 540,305;565,305] ) add_line([sys, ' / ' Angle',13,'Input' ) 13,'alpha/Limited ['Throttle 13,'alpha/Limited ['Throttle 13,'alpha/Limited ['Throttle 13,'alpha/Limited ['Throttle 13,'alpha/Limited ['Throttle 13,'alpha/Limited ['Throttle 13,'alpha/Limited ['Throttle 13,'alpha/Limited ['Throttle 13,'alpha/Limited 120;105,120]) ['Throttle 13,'alpha/Limited ['Throttle 13,'alpha/Limited [•Throttle 13,'alpha/Limited ['Throttle 13,'alpha/Limited ['Throttle 13,'alpha/Limited ['Throttle 13,'alpha/Limited ['Throttle 13,'alpha/Limited ['Throttle 13,'alpha/Limited ,13, ,13, [sys,'/',['Throttle Integrator/Relational',13,'oper Integrator/Relational',13,'oper , [355,120;510,120] , [205,120;320,120] , [50,95;105,95]) ,[65,95;65,245;410 ,[65,245;65,410;4 1 , [140,120;160,120] , [400,190;410,190] , [395,355;410,355] ,[610,300;625,300; , [45,145;105,145] ) , [450,180;465,180; , [450,260;465,260; , [530,220;540,220; , [450,340;460,340; , [450,425;460,425; , [530,380;540,380; , [380,270;410,270] 204] ,13, ,13, ,13, ,13, ,13, ,13, ,13, ,13, ,13, ,13, ,13, ,13, ,13, ,13, ,13, ,13, ,13, 'Integrator'] ] 'Integrator' ] ] 'Integrator' ] ] 'Integrator']] 'Integrator']] 'Integrator']] 'Integrator']] 'Integrator']] 'Integrator']] 'Integrator']] 'Integrator']] 'Integrator']] 'Integrator']] 'Integrator']] 'Integrator']] 'Integrator']] 'Integrator']] 120 add_line([sys,'/',['Throttle Angle',13,'Input*,13,'alpha/Limited',13,'Integrator']],[380,435;410,435] ) add_line([sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited',13, 'Integrator']],[205,120;245,120; 245,165;315,165;315,325;410,325]) add_line([sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited', 13,'Integrator']], [315,165;410,165] ) set_param([sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited',13,'Integrator']],... 'Mask Display','plot(-1,- 0.2,3.5,1.2,[0.05,1,2,2.9],[0,0,1,1]); 1/s ',... 'Mask Type','Limited Integrator.') set_param([sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited', 13, 'Integrator']] , ... 'Mask Dialogue','Limited Integrator|Lower bound:|Upper bound:|Initial condition:', ... 'Mask Translate','lower_limit=@l;upper_limit=@2;X0=@3;') set_param( [sys,'/',['Throttle Angle',13,'Input',13,'alpha/Limited', 13, 'Integrator']], ... 'Mask Help','Implements a limited integrator with \nan expression of the form:\n\nif(x<=lb and u<0) or (x>=ub and u>0)\n xdot=0\nelse\n xdot=u') set_param([sys,'/',['Throttle Angle', 13,'Input',13,'alpha/Limited' ,13, 'Integrator']] , ... 'Mask Entries','25\/30\/25\/') % Finished composite block ['Throttle Angle',13,'Input',13,'alpha/Limited',13,'Integrator']. set__param( [sys, '/ ', [ 'Throttle Angle', 13,'Input',13,'alpha/Limited',13,* Integrator!]],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'position',[175,180,215,210]) add_block('built-in/Outport',[sys,'/',['Throttle Angle',13,'Input',13,'alpha/Throttle Angle',13,'Input',13,'alpha (deg)']]) set_param([sys,'/',['Throttle Angle',13, 'Input',13,'alpha/Throttle Angle',13,'Input',13,'alpha (deg)']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'position',[385,105,405,125]) add_block('built-in/Sum',[sys,*/*,["Throttle Angle',13,'Input',13,'alpha/Sum']]) set_param([sys,'/',['Throttle Angle',13,'Input',13,'alpha/Sum']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'inputs','+++',... 'position',[285,97,305,133]) 121 add_block('built-in/Step Fen',[sys,•/',['Throttle Angle',13,'Input*,13,'alpha/Throttle Angle",13,'Step Input (deg)']]) set_param([sys,'/',['Throttle Angle',13,'Input',13,'alpha/Throttle Angle',13,'Step Input (deg)']],... 'Font Name','Times New Roman',... •Font Size',12,... 'Drop Shadow',4,... 'Time','0', . . . 'After','0', . .. 'position',[90,105,110,125]) add_block('built-in/Sine Wave',[sys,'/',['Throttle Angle',13,'Input',13,'alpha/Throttle Angle',13,* Sine Input']]) set_param([sys,'/',['Throttle Angle',13,'Input',13,'alpha/Throttle Angle',13,'Sine Input']],... 'Font Name','Times New Roman',... 'Font Size',12,... 1 Drop Shadow',4,... 'amplitude','0',... 'frequency', '0') setjparam([sys,'/',['Throttle Angle',13,'Input',13,'alpha/Throttle Angle',13,'Sine Input']],... 'position',[90,25,110,45] ) add_line([sys,'/',['Throttle Angle',13,'Input*,13,'alpha']],[115,115;280,115]) add_line([sys,*/',['Throttle Angle*,13,'Input',13,'alpha'] add_line([sys,'/',['Throttle Angle',13,'Input',13,'alpha'] add_line([sys,'/',['Throttle Angle',13,'Input',13,'alpha'] add_line([sys,'/',['Throttle Angle',13,'Input',13,'alpha'] , [115,35;195,35;195,105;280,105] ) , [220,195;245,195;245,125;280,125]) , [115,195;170,195]) , [310,115;380,115]) % Finished composite block ['Throttle Angle',13,'Input',13, 'alpha set_param([sys,'/',['Throttle Angle',13,'Input',13,'alpha']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'position',[50,87,75,113]) % Subsystem ['Intake Manifold',13,'Dynamics']. new_system([sys,'/',['Intake Manifold',13,'Dynamics']]) set_param([sys,'/',['Intake Manifold',13,'Dynamics']],'Location',[119,97,630,354]) add_block('built-in/Inport',[sys,'/', ['Intake Manifold',13,'Dynamics/Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao (kg//s)']]) set_param([sys,'/',['Intake Manifold',13,'Dynamics/Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao (kg//s)']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'Port','2',... •position',[55,150,75,170]) add_block('built-in/Inport',[sys,'/',['Intake Manifold',13,'Dynamics/Mass Rate of Air',13,'entering Manifold',13,'[d//dt]mai (kg//s) ']] ) set_param([sys,'/',['Intake Manifold',13,'Dynamics/Mass Rate of Air',13,'entering Manifold',13,'[d//dt]mai (kg//s)']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'position',[55,20,75,40]) % Subsystem ['Intake Manifold',13,'Dynamics/Continuity',13,'Equation']. new_system([sys,'/',['Intake Manifold',13,'Dynamics/Continuity',13,'Equation']]) set_param([sys,'/',['Intake Manifold',13,'Dynamics/Continuity',13, 'Equation']j , 'Location',[243,363,6 92,576]) add_block('built-in/Inport',[sys,'/',['Intake Manifold',13,'Dynamics/Continuity',13,'Equation/Mass Rate of Air',13,'entering Manifold',13,'[d//dt]mai (kg//s)']]) set_param([sys,'/',['Intake Manifold',13,'Dynamics/Continuity',13,'Equation/Mass Rate of Air',13,'entering Manifold',13,*[d//dt]mai (kg//s)']],... •position',[80,25,100,45]) add_block('built-in/Sum',[sys,'/',['Intake Manifold',13,'Dynamics/Continuity',13,'Equation/Sum']]) set_param([sys,'/',['Intake Manifold',13,'Dynamics/Continuity',13,'Equation/Sum']],... 'inputs','+-',... 'position',[205,65,225,85]) add_block('built-in/Inport',[sys,'/',['Intake Manifold',13,'Dynamics/Continuity',13,'Equation/Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao (kg//s)']]) set_param([sys,'/',['Intake Manifold',13,'Dynamics/Continuity',13,'Equation/Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao (kg//s)']],... 'Port','2',... 'position',[80,105,100,125]) add_block('built-in/Outport',[sys,'/',['Intake Manifold',13,'Dynamics/Continuity',13,'Equation/Mass Rate of Air',13,'in Manifold',13,'[d//dt]ma (kg//s)']]) set_param([sys,'/',['Intake Manifold',13,'Dynamics/Continuity',13,'Equation/Mass Rate of Air',13,'in Manifold',13,'[d//dt]ma (kg//s)']],... 'position',[315,65,335,85] ) add_line([sys,'/',['Intake Manifold',13,'Dynamics/Continuity',13, 'Equation'] ], [105,115;150,115;150, 80;200,80]) 123 add_line([sys,'/',['Intake Manifold',13,'Dynamics/Continuity', 13, 'Equation']], [230,75;310,75]) add_line([sys,'/',['Intake Manifold*,13,'Dynamics/Continuity',13,'Equation']], [105,35;165,35;165,70 ,-200,70] ) % Finished composite block ['Intake Manifold',13,'Dynamics/Continuity',13,'Equation']. set_j?aram( [sys, '/ ', [ 'Intake Manifold',13,'Dynamics/Continuity',13,'Equation']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... •position',[155,67,185,123]) add_block('built-in/Integrator',[sys,'/', ['Intake Manifold',13,'Dynamics/Integrator']]) set_param([sys,'/',['Intake Manifold',13, 'Dynamics/Integrator']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'Initial','init_ma',... 'position',[230,82,255,108]) % Subsystem ['Intake Manifold',13,'Dynamics/Ideal Gas',13,'Equation']. new_system([sys,'/',['Intake Manifold',13,'Dynamics/Ideal Gas',13,'Equation']]) set_param([sys,'/',['Intake Manifold',13,'Dynamics/Ideal Gas',13,'Equation']],'Location', [86,248,585,580] ) add_block('built-in/Inport',[sys,'/',['Intake Manifold',13,'Dynamics/Ideal Gas',13, 'Equation/Mass of Air',13,'in Manifold',13,'ma (kg)']]) set_param([sys,'/',['Intake Manifold',13, 'Dynamics/Ideal Gas',13,'Equation/Mass of Air',13,'in Manifold',13,'ma (kg)']],... 'position',[75,10,95,30]) add_block('built-in/Constant',[sys,'/',['Intake Manifold',13,'Dynamics/Ideal Gas',13,'Equation/Ideal Gas Constant',13,'R (kJ//(kg*K))']]) set_param([sys,'/',['Intake Manifold',13,'Dynamics/Ideal Gas',13,'Equation/Ideal Gas Constant',13,'R (kJ//(kg*K))*]],... •Value*,'Rm', ... 'Mask Display','R',... 'Mask Type','Universal Constant') set_param([sys,'/',['Intake Manifold', 13, 'Dynamics/Ideal Gas',13,'Equation/Ideal Gas Constant',13,'R (kJ//(kg*K))']],... •Mask Dialogue',"Ideal Gas Constant = 8.31434 kJ/(kmole*K)\n = 0.288292 kJ/(kg*K)') setj>aram([sys,'/',['Intake Manifold',13,'Dynamics/Ideal Gas',13,'Equation/Ideal Gas Constant',13,*R (kJ//(kg*K))']],... •Mask Translate','Rn=8.31434;Rm=0.288292;') 124 set_param([sys,'/',['Intake Manifold', 13, 'Dynamics/Ideal Gas',13,'Equation/Ideal Gas Constant', 13,'R (kJ//(kg*K))']],... 'Mask Help','Ideal Gas Constant - Constant. \nR = 8.31434 kJ/(kmole*K) = 0.288292 kJ/(kg*K)*) set_param([sys,'/',['Intake Manifold', 13, 'Dynamics/Ideal Gas',13,'Equation/Ideal Gas Constant', 13, 'R (kJ//(kg*K))']],... •position',[75,90,95,110]) add_block('built-in/Constant',[sys,'/',['Intake Manifold',13,'Dynamics/Ideal Gas',13,'Equation/Intake Manifold',13,'Volume',13,'Vm (m A 3)*]]) set_param([sys,'/',['Intake Manifold',13,'Dynamics/Ideal Gas',13,'Equation/Intake Manifold',13, 'Volume',13,'Vm (m A 3)']],... 'Value','Vm',... 'Mask Display','Vm',... 'Mask Type','Engine Parameter') set_param( [sys,'/',['Intake Manifold',13,'Dynamics/Ideal Gas',13,'Equation/Intake Manifold',13,'Volume',13,'Vm (m A 3)']],... 'Mask Dialogue','Intake Manifold Volume|Volume:',... 'Mask Translate','Vm=@l;') set_param([sys,'/',['Intake Manifold', 13,'Dynamics/Ideal Gas',13,'Equation/Intake Manifold',13,'Volume',13,'Vm (m A 3)*]],... 'Mask Help','Intake Manifold Volume - eng_param(l)',... 'Mask Entries','eng_param(1)\/') set_param([sys,'/',['Intake Manifold',13,'Dynamics/Ideal Gas',13,'Equation/Intake Manifold',13,'Volume',13,'Vm (m A 3)']],... •position',[75,242,100,268]) add_block('built-in/Fcn',[sys,'/',['Intake Manifold',13, 'Dynamics/Ideal Gas',13,'Equation/Inverse']]) set_param([sys,'/',['Intake Manifold',13, 'Dynamics/Ideal Gas',13,'Equation/Inverse']],... 'Expr','1/u',... •position',[150,245,190,265]) add_block('built-in/Product',[sys,'/',['Intake Manifold',13,'Dynamics/Ideal Gas',13,'Equation/Product']]) set_param([sys,'/',['Intake Manifold',13,'Dynamics/Ideal Gas',13,'Equation/Product']],... 'inputs','4',... 'position',[225,81,255,129]) add_block('built-in/Constant',[sys,'/',['Intake Manifold',13,'Dynamics/Ideal Gas',13,'Equation/Intake Manifold',13,'Temperature',13,'Tm (K)']]) set_param([sys,'/',['Intake Manifold',13,'Dynamics/Ideal Gas',13,'Equation/Intake Manifold',13,'Temperature',13,'Tm (K)']],... 'Value','Tm',... 'Mask Display','Tm',... 'Mask Type','Engine Parameter') set_param([sys,'/',['Intake Manifold',13,'Dynamics/Ideal Gas',13,'Equation/Intake Manifold',13, 'Temperature',13,'Tm (K)*]],... 'Mask Dialogue','Intake Manifold Temperature|Temperature:', ... •Mask Translate','Tm=@l;') set_param([sys,'/',['Intake Manifold',13,'Dynamics/Ideal Gas',13,'Equation/Intake Manifold', 13,'Temperature',13,'Tm (K)']],... 125 'Mask Help','Intake Manifold Temperature - eng_param(2) \n(assumed to be constant)') set_param([sys,'/',['Intake Manifold', 13, 'Dynamics/Ideal Gas',13,'Equation/Intake Manifold',13,'Temperature',13,'Tm (K) ']],.. . •Mask Entries','eng_param(2)\/',... •position*,[75,153,100,177]) add_block('built-in/Outport',[sys,'/',['Intake Manifold',13,'Dynamics/Ideal Gas',13,'Equation/Intake . Manifold',13,'Pressure',13,'Pm (kPa)']]) set_param([sys,'/',['Intake Manifold',13, 'Dynamics/Ideal Gas',13,'Equation/Intake Manifold',13,'Pressure',13,'Pm (kPa)']],... 'position',[330,95,350,115]) add_line([sys,'/',['Intake Manifold',13,'Dynamics/Ideal Gas',13,'Equation']], [100,20;155,20;155, 90;220, 90]) add_line([sys,'/',['Intake Manifold',13,'Dynamics/Ideal Gas',13,'Equation']],[195,255;200,255;200,120;220,120]) add_line([sys,'/',['Intake Manifold',13, 'Dynamics/Ideal Gas',13,'Equation']],[105,165;155,165;155,110;220,110]) add_line([sys,'/ ', [ 'Intake Manifold',13,'Dynamics/Ideal Gas',13,'Equation']],[100,100;220,100]) add_line([sys,'/',['Intake Manifold',13,'Dynamics/Ideal Gas',13,'Equation']],[105,255;145, 255] ) add_line([sys,'/',['Intake Manifold',13,'Dynamics/Ideal Gas',13,'Equation']],[260,105;325,105]) % Finished composite block ['Intake Manifold',13,'Dynamics/Ideal Gas',13,'Equation']. set_param([sys,'/',['Intake Manifold',13, 'Dynamics/Ideal Gas',13,'Equation']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... •position',[315,70,345,120]) add_block('built-in/Outport',[sys,'/',['Intake Manifold',13,'Dynamics/Intake Manifold',13,'Pressure',13,'Pm (kPa)']]) set_param([sys,'/',['Intake Manifold',13,'Dynamics/Intake Manifold',13,'Pressure',13, 'Pm (kPa)']},... 'Font Name','Times New Roman',... •Font Size',12,... 'Drop Shadow 1 ,4,... •position',[435,55,455,75]) add_block('built-in/Outport',[sys,'/',['Intake Manifold',13,'Dynamics/Mass of Air',13,'in Manifold',13,'ma (kg)']]) set_param([sys,'/',['Intake Manifold',13,'Dynamics/Mass of Air',13,'in Manifold',13,'ma (kg)']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... •Port','2',... 'position',[435,160,455,180]) add_line([sys,'/',['Intake Manifold*,13,'Dynamics']],[80,160;125,160; 125,110; 150,110] ) 126 add_line([sys,'/',['Intake Manifold',13,'Dynamics']],[80, 30;125, 30;125, 80; 150, 80]) add_line([sys,'/',['Intake Manifold',13,'Dynamics']], [190, 95;225,95]) add_line([sys,'/',['Intake Manifold',13, 'Dynamics']],[260,95;310,95]) add_line([sys, '/', ['Intake Manifold',13,'Dynamics']],[350,95;385, 95;385, 65;430, 65]) add_line([sys,'/',['Intake Manifold',13,'Dynamics']],[275,95;275,170; 430,170] ) % Finished composite block ['Intake Manifold',13,'Dynamics']. set_param([sys,'/',['Intake Manifold',13, 'Dynamics']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'position',[340,115,370,170]) % Subsystem ['Mass Rate of,13,'Air in', 13, ' [d//dt]mai ']. new_system([sys,'/',['Mass Rate of',13,'Air in',13,'[d//dt]mai ']]) set_param([sys,'/',['Mass Rate of',13,'Air in',13,'[d//dt]mai ']],'Location',[8,119,637,456]) add_block('built-in/Saturation',[sys,'/',['Mass Rate of,13,'Air in',13,*[d//dt]mai /Throttle Angle',13, 'Saturation']]) set_j>aram([sys,'/',['Mass Rate of,13,'Air in',13,'[d//dt]mai /Throttle Angle',13,'Saturation']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'Lower Limit','lb_th',... 'Upper Limit','ub_th') set_param( [sys,'/',['Mass Rate of,13,'Air in',13,'[d//dt]mai /Throttle Angle',13,'Saturation']],... 'Mask Display','',... 'Mask Type','Engine Parameter',... 'Mask Dialogue','Throttle Angle Saturation|Saturated Angle (in deg.):') set_param([sys,'/',['Mass Rate of,13,'Air in', 13, '[d//dt]mai /Throttle Angle',13,'Saturation']],... 'Mask Translate','ub_th=@l;lb_th=0;') set_j>aram([sys,'/',['Mass Rate of,13,'Air in',13, '[d//dt]mai /Throttle Angle',13,'Saturation']],... 'Mask Help','Throttle Angle Saturation - eng_param(3) \nlnput with angle above this value will \nhave no effect on engine performance.') set_param([sys,'/',['Mass Rate of,13,'Air in', 13,'[d//dt]mai /Throttle Angle',13,'Saturation']],... 'Mask Entries','eng_param(3)\/',... 'position',[130,218,160,242]) add_block('built-in/Fcn',[sys,'/',['Mass Rate of',13,'Air in',13,'[d//dt]mai /Throttle Flow',13,'Characteristics fen']]) set_param([sys,'/',['Mass Rate of',13,'Air in',13,'[d//dt]mai /Throttle Flow',13,'Characteristics fen']],... 'Font Name','Times New Roman',... 127 •Font Size',12,... 'Drop Shadow',4,... 'Expr','1.0-cos(pi*u/180.0)' ) set_param([sys,•/',['Mas s Rate of',13,'Air in',13,'[d//dt]mai /Throttle Flow',13,'Characteristic s fen']],... •Mask Display','TC(0')',. .. 'Mask Type','Characteristic Equation') set_param([sys,'/',['Mass Rate of',13,'Air in',13,'[d//dt]mai /Throttle Flow',13,'Characteristics fen']],... 'Mask Dialogue','Throttle Flow Characteristics - Function of Throttle Angle (Empirical Equation)') set_param( [sys,'/',[ 'Mass Rate of,13,'Air in',13,'[d//dt]mai /Throttle Flow',13,'Characteristics fen']],... 'Mask Help','Throttle Flow Characteristics \nTC(a') = 1 - cos(0')',... 'position',[355,215,410,245]) add_block('built-in/Product',[sys,'/',['Mass Rate of,13,'Air in',13,'[d//dt]mai /Productl']]) set_param( [sys,'/',['Mass Rate of,13,'Air in',13,'[d//dt]mai /Productl']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'inputs','3',... 'position',[470,132,500,168]) add_block('built-in/Outport',[sys,'/',['Mass Rate of,13,'Air in',13,'[d//dt]mai /Mass Rate of',13,'Air in',13,'[d//dt]mai (kg//s)']]) set_param( [sys,'/',['Mass Rate of,13,'Air in',13,'[d//dt]mai /Mass Rate of,13,'Air in',13,'[d//dt]mai (kg//s)']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'position',[565,140,585,160]) add_block('built-in/Fcn',[sys,'/',['Mass Rate of ,13,'Air in',13,'[d//dt]mai /Pressure Ratio',13,'Influence fen']]) set_param( [sys,'/',['Mass Rate of ,13,'Air in',13,'[d//dt]mai /Pressure Ratio',13,'Influence fen']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... •Expr','1.0 - exp(9.0 * (u - 1.0))') set_param([sys,'/',['Mass Rate of',13,'Air in',13,'[d//dt]mai /Pressure Ratio',13,'Influence fen']],... 'Mask Display','PRI(PR)',.. . 'Mask Type','Characteristics Equation') set_param( [sys,'/',['Mass Rate of,13,'Air in',13,'[d//dt]mai /Pressure Ratio',13,'Influence fen']],... 'Mask Dialogue','Pressure Ratio Influence -\nFunction of Pressure Ratio\n(Empirical Equation)') set_param([sys,'/',[ 'Mass Rate of,13,'Air in',13,'[d//dt]mai /Pressure Ratio',13,'Influence fen']],... 'Mask Help','Pressure Ratio Influence \nPRI(PR) = 1 - exp(9 x (PR -1)) ',... 'position',[355,137,410,163]) 128 add_block('built-in/Saturation',[sys,'/',['Mass Rate of,13,'Air in',13, '[d//dt]mai /Pressure Ratio*,13,'Constraint']]) set_j>aram([sys,'/',['Mass Rate of,13,'Air in',13,'[d//dt]mai /Pressure Ratio',13,'Constraint']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'Lower Limit','lb_pr',... 'Upper Limit','ub_pr') set_param( [sys,'/',['Mass Rate of,13,'Air in',13,'[d//dt]mai /Pressure Ratio',13,'Constraint']],... 'Mask Display','',... 'Mask Type','Constraint',... 'Mask Dialogue','Pressure Ratio Constraint - max(PR) =1') set_param( [sys,'/',['Mass Rate of',13,'Air in',13,'[d//dt]mai /Pressure Ratio',13,'Constraint']],... 'Mask Translate','ub_pr=l;lb_pr=0; ') set_param([sys,'/',['Mass Rate of,13,'Air in',13, *[d//dt]mai /Pressure Ratio',13,'Constraint']],... 'Mask Help*,'The maximum value of Pressure Ratio (PR) is set to 1, due to the use of certain \nsimulation scheme may result in intermediate PR > 1, i.e. pressure in intake manifold is higher than atmospheric pressure, which is practically impossible.') set_param([sys,'/',['Mass Rate of,13,'Air in',13,'[d//dt]mai /Pressure Ratio',13,'Constraint']],... 'position',[270,138,300,162] ) add_block('built-in/Product',[sys,'/',['Mass Rate of,13,'Air in',13,'[d//dt]mai /Product']]) set_param([sys,'/',['Mass Rate of,13,'Air in*,13, '[d//dt]mai /Product 1 ]],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'position',[195,138,225,162]) add_block('built-in/Constant',[sys,'/',['Mass Rate of',13,'Air in',13,'[d//dt]mai /Maximum Flow Rate',13,'thru" Throttle',13,'MAX (kg//s)']]) setjparam([sys,'/',['Mass Rate of',13,'Air in',13,'[d//dt]mai /Maximum Flow Rate',13,'thru'' Throttle',13,'MAX (kg//s)']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'Value','MAX_flow') set_param( [sys,'/',['Mass Rate of,13,'Air in',13,'[d//dt]mai /Maximum Flow Rate',13,'thru'' Throttle',13,'MAX (kg//s)']],... 'Mask Display','plot(0,0,100,100,[20,20,80,80,20],[49, 51, 51, 49, 49] , [47,47,50,5 3,53,50,47], [51,49,47,49,51,53,51])*) set_param([sys,'/',['Mass Rate of,13,'Air in 1 ,13,'[d//dt]mai /Maximum Flow Rate',13,'thru*' Throttle',13,'MAX (kg//s)']],... 'Mask Type','Engine Parameter',... 'Mask Dialogue','Maximum Air Flow Rate through the Throttle|Flow rate (in kg/s):') set_param([sys,'/',['Mass Rate of',13,'Air in',13, '[d//dt]mai /Maximum Flow Rate',13,'thru'' Throttle',13,'MAX (kg//s)']],... 'Mask Translate','MAX flow=@l;',... 129 'Mask Help','Maximum air flow rate through \nthe throttle - eng_param(6)') set_param([sys,'/',['Mass Rate of,13,'Air in', 13, '[d//dt]mai /Maximum Flow Rate',13,'thru'' Throttle',13,'MAX (kg//s)']],... 'Mask Entries','eng_param(6)\/',... •position',[235,43,265,67]) add_block('built-in/Fcn', [sys,'/', ['Mass Rate of, 13,'Air in',13,*[d//dt]mai /Inverse']]) set_param([sys,'/',['Mass Rate of,13,'Air in',13,'[d//dt]mai /Inverse']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'Expr','1/u',... 'position',[105,55,145,75] ) add_block('built-in/Constant',[sys,'/', ['Mass Rate of,13,'Air in',13, '[d//dt]mai /Atmospheric',13,'Pressure',13,'Patm (kPa)']]) setjparam([sys,•/',['Mass Rate of,13,'Air in',13,'[d//dt]mai /Atmospheric',13,'Pressure',13,'Patm (kPa)']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'Value','Patm', ... 'Mask Display','Patm') set_j>aram([sys,'/',['Mass Rate of,13,'Air in', 13, '[d//dt]mai /Atmospheric',13,'Pressure',13,'Patm (kPa) ']],... 'Mask Type','Universal Constant',... 'Mask Dialogue','Atmospheric Pressure = 100 kPa', ... •Mask Translate','Patm=100;') set_param( [sys,'/',['Mass Rate of,13,'Air in',13,*[d//dt]mai /Atmospheric',13,'Pressure',13,'Patm (kPa) ']],... 'Mask Help','Atmospheric Pressure - Constant. \nPatm = 100.0 kPa',... 'position',[35,51,65,79]) add_block('built-in/Inport',[sys,'/', ['Mass Rate of,13,'Air in',13, '[d//dt]mai /Manifold Pressure', 13, 'Pm (kPa)']]) set_j>aram( [sys,'/',['Mass Rate of,13,'Air in',13,'[d//dt]mai /Manifold Pressure',13,'Pm (kPa)']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'position',[60,145,80,165]) add_block('built-in/Inport',[sys,'/', ['Mass Rate of,13,'Air in', 13,*[d//dt] mai /Throttle Angle *,13,'alpha (deg)']]) set_param([sys,'/',['Mass Rate of',13,'Air in',13,'[d//dt]mai /Throttle Angle',13,'alpha (deg)']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... •Port','2',... •position',[40,220,60,240]) add_block('built-in/Fcn',[sys,'/',['Mass Rate of,13,'Air in',13, '[d//dt]mai /Throttle Angle',13,'Correction fen']]) 130 set_param([sys,'/',['Mass Rate of,13,'Air' in', 13,'[d//dt]mai /Throttle Angle',13,'Correction fen']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'Expr',*M*u+0',... 'Mask Display',' 0'= Fc(a)') set_param([sys,'/',['Mass Rate of,13,'Air in',13, '[d//dt]mai /Throttle Angle',13,'Correction fen']],... 'Mask Type','Engine Parameter',... 'Mask Dialogue','Correction Function for Throttle Angle I Multiply:|Add:') set_param([sys,*/',['Mass Rate of,13,'Air in', 13, '[d//dt]mai /Throttle Angle',13,'Correction fen']],... 'Mask Translate','M=@l;0=@2;') set_param([sys,'/',['Mass Rate of,13,'Air in',13,'[d//dt]mai /Throttle Angle 1 ,13,'Correction fen']],... 'Mask Help','Throttle Angle Correction Function -\n engjparam(4), eng_param(5) \na' = Fc(0) = eng_param(4) x 0 + eng_param(5)') setjparam([sys,'/',['Mass Rate of,13,'Air in', 13, '[d//dt]mai /Throttle Angle',13,'Correction fen']],... 'Mask Entries','eng_param(4)\/eng__param(5)\/',... •position',[220,209,295,251]) add_line([sys,'/',['Mass Rate of',13,'Air in' •]],[165,230;215,230]) add_line([sys,'/',['Mass Rate of',13,'Air in' ']],[230,150;265,150]) add_line([sys,'/',['Mass Rate of',13,'Air in' ']],[305,150;350,150]) add_line([sys,'/',['Mass Rate of,13,'Air in' ']],[300,230;350,230]) add_line([sys,'/',['Mass Rate of',13,'Air in' ']],[415,150;465,150]) add_line([sys,'/',['Mass Rate of',13,'Air in' ']],[505,150;560,150]) add_line([sys,'/',['Mass Rate of,13,'Air in' ']],[65,230;125,230]) add_line([sys,'/',['Mass Rate of,13,'Air in' ']],[70,65;100,65]) add_line([sys,'/',['Mass Rate of,13,'Air in' ']],[85,155;190,155]) add_line( [sys,'/',['Mass Rate of,13,'Air in' ']],[270,55;430,55;430,140;465,140]) add_line([sys,'/', ['Mass Rate of,13,'Air in' ']], [415,230;430,230;430,160;465,160]) add_line([sys,'/',['Mass Rate of,13,'Air in',13,'[d//dt]mai ']] , [150,65;165,65;165,145;190,145]) ,13,'[d//dt]mai ,13, '[d//dt]mai ,13,'[d//dt]mai ,13,'[d//dt]mai ,13,'[d//dt]mai ,13,'[d//dt]mai ,13,'[d//dt]mai ,13,'[d//dt]mai ,13,'[d//dt]mai ,13,'[d//dt]mai ,13,'[d//dt]mai % Finished composite block ['Mass Rate of',13,'Air in',13,'[d//dt]mai •]. set_param([sys,'/',['Mass Rate of,13,'Air in',13, '[d//dt]mai *]],.. 'Font Name','Times New Roman',... •Font Size',12,... 'Drop Shadow',4,... 'position',[170,60,200,115]) 131 add_block('built-in/Constant',[sys,'/',['Spark',13,'Angle']]) set_j>aram( [sys,'/',['Spark',13,'Angle'3],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... •Value','SA',... 'Mask Display','SA',... 'Mask Type','Other Contolled Parameter') set_param([sys,'/',['Spark',13,'Angle']],... 'Mask Dialogue','SA - Spark Angle|SA:',... 'Mask Translate','SA=@1;') set_param([sys,'/',['Spark',13,'Angle']],... 'Mask Help','The Spark Angle (SA) is controlled by another controller within the engine structure, hence, for simplicity, the SA is set to a value so that (SA - MBT) equals to 10 degrees') set_param([sys,'/',['Spark',13,'Angle']], ... 'Mask Entries','20\/',... 'position',[50,258,80,282]) add_block('built-in/Constant',[sys,'/', ['Air Fuel',13,'Ratio']]) set_param([sys,'/',['Air Fuel',13,'Ratio' ]],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'Value','AF',... 'Mask Display','A/F',... 'Mask Type','Other Controller Paramter') setjparam([sys,'/',['Air Fuel',13,'Ratio'] ], . .. 'Mask Dialogue','A/F - Air Fuel Ratio|A/F:',... •Mask Translate',*AF=@1;') set_param([sys,'/',['Air Fuel',13,'Ratio'] ], ... 'Mask Help','The Air Fuel Ratio (A/F) is controlled by another controller within the engine \nstructure, hence, for simplicity, set A/F to 15.0',... 'Mask Entries','15\/') set_param([sys,'/',['Air Fuel',13,'Ratio']],... 'position',[50,177,80,203] ) % Subsystem ['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao']. new_system([sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao']]) set_param([sys,'/',['Mass Rate of Air',13,'leaving Manifold', 13,'[d//dt]mao']],'Location', [177,85,706,342] ) add_block('built-in/Outport',[sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao/Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao (kg//s)']]) set_param([sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao/Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao (kg//s)*]],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow', 4) 132 set_param([sys,'/',['Mass Rate of Air*,13,'leaving Manifold',13,'[d//dt]mao/Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao (kg//s)']],... •position',[450,80,470,100]) add_block('built-in/Product',[sys,'/', ['Mass Rate of Air',13,'leaving Manifold*,13,'[d//dt]mao/Productl']]) set_param([sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao/Productl'] ] , . . . 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'inputs','4',... 'position',[335,67,365,113]) add_block('built-in/Constant',[sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao/Speed Density',13,'Constant']]) set_param([sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao/Speed Density',13,'Constant']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'Value','K',... •Mask Display','K') set_param([sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao/Speed Density*,13,'Constant']],... 'Mask Type','Engine Parameter',... 'Mask Dialogue','Speed Density Constant|K:',... •Mask Translate','K=@l;') set_param([sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao/Speed Density',13,'Constant']],... 'Mask Help','Speed Density Constant - eng_param(14) \nK = #cyl * cyl vol / (4 * pi * Vm)', ... 'Mask Entries','eng_param(14)\/') set_param([sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao/Speed Density',13,'Constant']],... 'position*,[175,180,195,200]) % Subsystem ['Mass Rate of Air',13,'leaving Manifold',13,*[d//dt]mao/Volumetric Efficiency', 13,'nv']. new_system( [sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao/Volumetric Efficiency', 13,'nv']]) set_j?aram([sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao/Volumetric Efficiency',13,'nv']],'Location',[220,67,779,358]) add_block('built-in/Outport',[sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao/Volumetric Efficiency', 13,'nv/Volumetric Efficiency',13,'nv']]) set_param([sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao/Volumetric Efficiency', 13,'nv/Volumetric Efficiency',13,'nv']],... 'position',[435,105,455,125]) 133 add_block('built-in/Inport',[sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao/Volumetric Efficiency',13,'nv/Engine Speed',13,'w (rad//s)']]) set_param([sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao/Volumetric Efficiency',13,'nv/Engine Speed*,13,'w (rad//s)*]],... •Port','2',... •position',[70,130,90,150]) add_block('built-in/Inport',[sys,'/',['Mass Rate of Air', 13,'leaving Manifold',13,'[d//dt]mao/Volumetric Efficiency',13,'nv/Mass of Air',13,'in Manifold',13,'ma (kg)*]]) set_param( [sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao/Volumetric Efficiency',13,'nv/Mass of Air',13,'in Manifold',13,'ma (kg)']],... 'position',[70,50,90,70]) add_block('built-in/Mux',[sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao/Volumetric Efficiency',13,'nv/Mux']]) set_param([sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao/Volumetric Efficiency',13,'nv/Mux']],... 'inputs','2',... 'position',[190,96,220,129] ) add_block('built-in/Fcn',[sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao/Volumetric Efficiency', 13, 'nv/Volumetric Eff',13,'nv']]) set_param([sys,'/',['Mas s Rate of Air',13,'leaving Manifold',13,'[d//dt]mao/Volumetri c Efficiency', 13,'nv/Volumetric Eff,13,'nv']],.. . •Expr','(k l * u(2) + k2) * u(l) A 2 + (k3 * u(2) + k4) * u + (k5 * u(2) + k6)',... 'Mask Display','nv') set_param([sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao/Volumetric Efficiency', 13,'nv/Volumetric Eff',13,'nv']],... 'Mask Type','Characteristics Equation') set_param( [sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao/Volumetric Efficiency',13,'nv/Volumetric Eff ,13, 'nv']], ... 'Mask Dialogue','Volumetric Efficiency (Empirical Equation)\n(Read hep for more details)|kl:|k2:|k3:|k4:|k5:|k6:') set_param( [sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao/Volumetric Efficiency',13,'nv/Volumetric Eff',13,'nv']],... 'Mask Translate','kl=@l;k2=@2; k3=@3;k4=@4;k5=@5;k6=@6;*) set_param([sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao/Volumetric Efficiency',13,'nv/Volumetric Eff',13,'nv']],... 'Mask Help','The Empirical Equation of the Volumetric Efficiency : \nnv(ma, w) = (kl * w + k2) * ma A 2 + (k3 * w + k4) * ma (k5 * w + k6)\n\nkl - eng_param(7); k2 - eng_param(8);\nk3 - eng_param(9); k4 - eng_param(10);\nk5 - eng_param(ll); k6 - eng_param(12);\nw - Engine Speed (rad/s)') set_param([sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao/Volumetric Efficiency',13,'nv/Volumetric Eff ,13, 'nv']], .. . •Mask Entries','eng_param(7)\/eng_param(8)\/eng_param(9) \/eng_param(10)\/eng_p aram(ll)\/eng_param(12)\/*) set_param([sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao/Volumetric Efficiency', 13, 'nv/Volumetric Eff ,13, 'nv']], . . . 'position',[280,104,340,126]) add_line([sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,*[d//dt]mao/Volumetric Efficiency',13,'nv']],[95,60;135, 60;135,105; 185,105]) add_line([sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao/Volumetric Efficiency',13,'nv']],[95,140;135,140;135,120;185,120]) add_line([sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao/Volumetric Efficiency',13,'nv']],[225,115;275,115]) add_line([sys,'/',['Mass Rate of Air',13,'leaving Manifold', 13,'[d//dt]mao/Volumetric Efficiency',13,'nv']],[345,115;430,115]) % Finished composite block ['Mass Rate of Air', 13,'leaving Manifold',13,'[d//dt]mao/Volumetric Efficiency', 13, 'nv']. set_param([sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao/Volumetric Efficiency', 13,'nv']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'position',[190,57,220,113] ) add_block('built-in/Inport',[sys,'/',['Mass Rate of Air', 13,'leaving Manifold',13,'[d//dt]mao/Engine Speed',13,'w (rad//s)']]) set_param([sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao/Engine Speed',13,*w (rad//s)']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'Port*,'2',... 'position',[60,145,80,165]) add_block('built-in/Inport',[sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao/Mass of Air',13,'in Manifold',13,'ma (kg)']]) set_param([sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao/Mass of Air',13,'in Manifold',13,'ma (kg)']],... 'Font Name','Times New Roman',... 'Font Size',12,... 'Drop Shadow',4,... 'position',[60,20,80,40]) add_line([sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao']],[200,190;310,190;310,105;330,105]) add_line([sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao']],[85,30;120, 30;120, 70;185, 70]) add_line([sys,'/',[ 'Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao']],[120,30;280, 30;280, 75;330,75]) add_line([sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao']],[85,155;125,155;125,100;185,100]) 135 add_line([sys,*/',['Mass Rate of Air*,13,'leaving Manifold',13,'[d//dt]mao']],[125,155;285,155;285,95;330,95]) add_line([sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao']],[225, 85;330, 85] ) add_line([sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao']],[370,90;445, 90]) % Finished composite block ['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao']. set_param( [sys,'/',['Mass Rate of Air',13,'leaving Manifold',13,'[d//dt]mao']], .. . 'Font Name','Times New Roman', ... 'Font Size',12,... 'Drop Shadow',4, .. . 'position',[150,290,180,345] ) add_line(sys,[205,90;305,90;305,130;335,130]) add_line(sys,[375,130;510,130] ) add_line(sys,[355,370;415,370;415, 305;470, 305]) add_line(sys,[350,280;470,280] ) add_line(sys,[510,295;580,295] ) add_line(sys,[80,100;165,100]) add_line(sys,[540,295;540,430;255,430;255, 370;305,370]) add_line(sys,[375,155;430,155;430,230;115,230;115,305;145,305]) add_line(sys,[185,320;240,320;240,285;310, 285]) add_line(sys,[255,370;255,300;310, 300] ) add_line(sys,[255,430;100,430;100,330;145,330]) add_line(sys,[85,190;190,190;190,255;310, 255]) add_line(sys,[85,270;310,270]) add_line(sys,[240,285;240,155;335,155]) add_line(sys,[430,130;430,40;145,40;145, 75;165, 75] ) drawnow % Return any arguments. if (nargin | nargout) % Must use feval here to access system in memory if (nargin > 3) if (flag == 0) eval(['[ret,x0,str, ts,xts] = ',sys,'(t,x,u,flag);']) else eval(['ret =', sys,'(t,x,u,flag);']) end else [ret,x0,str,ts,xts] = feval(sys); end else drawnow % Flash up the model and execute load callback end 136 Appendix E MATLAB Program to Perform Spectral Analysis 137 % Procedure used to generate the power spectrum % This function is extracted from MathWork's Digest Fs=input('Sampling Frequency = ') ; Fn=Fs/2; NFFT=2. A (ceil(log(length(x))/log(2)) FFTX=fft(x,NFFT); NumUniquePts = ceil((NFFT+1)/2); FFTX=FFTX(1:NumUniquePts); MX=abs(FFTX); MX=MX*2; MX(l)=MX(l)/2; MX(length(MX))=MX(length(MX))/2; MX=MX/length(x); f=(0:NumUniquePts-l)*2*Fn/NFFT; plot(f,MX); % sampling frequency % Nyquist frequency ; % Next highest power of 2 greater % than length(x) % Take FFT, padding with zeros. % length)FFTX)==NFFT % FFT is symmetric, throw away % second half % Take magnitude of X % Multiply by 2 to take into % account the fact that we % threw out second half of % FFTX above % Account for endpoint uniqueness % We know NFFT is even % Scale the FFT so that it is % not a function of the length % of x % Plot the result 138 INFORMATION TO USERS This manuscript has been reproduced from the microfilm master. UMI films the text directly from the original or copy submitted. Thus, some thesis and dissertation copies are in typewriter face, while others may be from any type of computer printer. The quality of this reproduction i s dependent upon the quality of the copy submitted. Broken or indistinct print, colored or poor quality illustrations and photographs, print bleedthrough, substandard margins, and improper alignment can adversely affect reproduction. In the unlikely event that the author did not send UMI a complete manuscript and there are missing pages, these will be noted. Also, if unauthorized copyright material had to be removed, a note will indicate the deletion. Oversize materials (e.g., maps, drawings, charts) are reproduced by sectioning the original, beginning at the upper left-hand corner and continuing from left to right in equal sections with small overlaps. Each original is also photographed in one exposure and is included in reduced form at the back of the book. Photographs included in the original manuscript have been reproduced xerographically in this copy. Higher quality 6" x 9" black and white photographic prints are available for any photographs or illustrations appearing in this copy for an additional charge. Contact UMI directly to order. UMI A Bell & Howell Information Company 300 North Zeeb Road. Ann Arbor. Ml 48106-1346 USA 313/761-4700 800/521-0600 OMI Number: 1376476 UMI Microform 1376476 Copyright 1995, by UMI Company. All rights reserved. This microform edition is protected against unauthorized copying under Title 17, United States Code. UMI 300 North Zeeb Road Ann Arbor, MI 48103
Linked assets
University of Southern California Dissertations and Theses
Conceptually similar
PDF
Cognitive modeling of iteration in conceptual design
PDF
Thermally-driven angular rate sensors in standard CMOS
PDF
General and explicit equations of motion for mechanical systems
PDF
A document-driven approach to conceptual design
PDF
A work structure based approach to collaborative engineering design
PDF
A socio-technical approach to support collaborative engineering design
PDF
Investigation of a switching G mechanism for MEMS applications
PDF
An analytical approach to functional design
PDF
A cognitive approach to creative conceptual design
PDF
Investigation of several important phenomena associated with the development of Knudsen compressors
PDF
A global study of nonlinear dynamical systems by a combined numerical-analytical approach
PDF
A hierarchical co-evolutionary approach to conceptual design
PDF
Boundary element method for scattering of elastic waves in general anisotropic media
PDF
Dynamic analysis and control of one-dimensional distributed parameter systems
PDF
Modeling and vibration analysis of wheelchair-users
PDF
Active delay output feedback control for high performance flexible servo systems
PDF
Modeling enterprise operations and organizations for productivity improvement
PDF
An approach to experimentally based modeling and simulation of human motion
PDF
A transgenic mouse model for SCLC: Expression of Hel-N1 in mouse lung
PDF
Comparing signal processing methods for spectral bio-imaging
Asset Metadata
Creator
Lee, Kinping (author)
Core Title
Automotive engine model linearization
School
School of Engineering
Degree
Master of Science
Degree Program
Mechanical Engineering
Degree Conferral Date
1995-12
Publisher
University of Southern California
(original),
University of Southern California. Libraries
(digital)
Tag
engineering, automotive,engineering, mechanical,OAI-PMH Harvest
Language
English
Contributor
Digitized by ProQuest
(provenance)
Advisor
Flashner, Henryk (
committee chair
), [illegible] (
committee member
), Shiflett, Geoffrey (
committee member
)
Permanent Link (DOI)
https://doi.org/10.25549/usctheses-c16-662
Unique identifier
UC11341935
Identifier
1376476.pdf (filename),usctheses-c16-662 (legacy record id)
Legacy Identifier
1376476.pdf
Dmrecord
662
Document Type
Thesis
Rights
Lee, Kinping
Type
texts
Source
University of Southern California
(contributing entity),
University of Southern California Dissertations and Theses
(collection)
Access Conditions
The author retains rights to his/her dissertation, thesis or other graduate work according to U.S. copyright law. Electronic access is being provided by the USC Libraries in agreement with the au...
Repository Name
University of Southern California Digital Library
Repository Location
USC Digital Library, University of Southern California, University Park Campus, Los Angeles, California 90089, USA
Tags
engineering, automotive
engineering, mechanical