/* general purpose sigmoid:
* use as template for single input, single output function system (no states)
*/
#define RAND_FACT 2147483647.0 /* largest random number generated */
#define S_FUNCTION_NAME Msigmoid2 /* same as filename */
#include "simstruc.h"
extern double exp();
extern double log();
/* extern long random(); */
/* input arguments (parameters) */
#define SLOPE ssGetArg(S, 0)
#define THRESH ssGetArg(S, 1)
/*
* mdlInitializeSizes - initialize the sizes array
*
* for single input, single output function system (no states)
* notice use of ssSetNumInputArgs() to set number of input pars
*/
static void mdlInitializeSizes(S)
SimStruct *S;
{
ssSetNumContStates( S, 0); /* number of continuous states */
ssSetNumDiscStates( S, 0); /* number of discrete states */
ssSetNumInputs( S, 1); /* number of inputs */
ssSetNumOutputs( S, 1); /* number of outputs */
ssSetDirectFeedThrough(S, 1); /* direct feedthrough flag */
ssSetNumSampleTimes( S, 1); /* number of sample times */
ssSetNumInputArgs( S, 2); /* number of input arguments */
ssSetNumRWork( S, 0); /* number of real work vector elements */
ssSetNumIWork( S, 0); /* number of integer work vector elements */
ssSetNumPWork( S, 0); /* number of pointer work vector elements */
}
/*
* mdlInitializeSampleTimes - initialize the sample times array
*
* This function is used to specify the sample time(s) for your S-function.
* If your S-function is continuous, you must specify a sample time of 0.0.
* Sample times must be registered in ascending order.
*/
static void mdlInitializeSampleTimes(S)
SimStruct *S;
{
ssSetSampleTimeEvent(S, 0, 0.0);
ssSetOffsetTimeEvent(S, 0, 0.0);
}
/* have to have th efiollowing functions even though they are empty
* otherwise get segmentation violations */
static void mdlInitializeConditions(x0, S)
double *x0;
SimStruct *S;
{
}
static void mdlUpdate(x, u, S, tid)
double *x, *u;
SimStruct *S;
int tid;
{
}
static void mdlDerivatives(dx, x, u, S, tid)
double *dx, *x, *u;
SimStruct *S;
int tid;
{
}
static void mdlTerminate(S)
SimStruct *S;
{
}
/***************** main function calculation **********/
/*
* mdlOutputs - compute the outputs
*
*/
static void mdlOutputs(y, x, u, S, tid)
double *y, *x, *u;
SimStruct *S;
int tid;
{
double slope, thresh;
double act;
double y_out;
slope = mxGetPr(SLOPE)[0];
thresh = mxGetPr(THRESH)[0];
act = u[0];
if (act <= thresh) {
y_out = 0;
}
else if ((act > thresh) && (act < 1/slope + thresh)) {
y_out = slope * (act - thresh);
}
else {
y_out = 1;
}
y[0] = y_out;
}
#ifdef MATLAB_MEX_FILE /* Is this file being compiled as a MEX-file? */
#include "simulink.c" /* MEX-file interface mechanism */
#else
#include "cg_sfun.h" /* Code generation registration function */
#endif