How to update an old mex code to work again with ode45?

2 visualizzazioni (ultimi 30 giorni)
Hello
Back in 94 the following mex code worked with ode45 (Matlab 4.2 on solaris 2.6). Although I have the feeling that this type of code has been completely deprecated several years ago, I wonder whether it is possible to translate it to a new version (matlab 2017a). (I know that a m-file would do the job but I have lots of similar codes ..).
/* Lorenz Equation (84) - Simulation */
#include "mex.h"
/* #include "mymex.h" */
/* Define the system sizes here: */
#define NSTATES 12
#define NOUTPUTS 12
#define NCOEFFS 16
static Matrix *Coeffs[NCOEFFS];
#define a mxGetPr(Coeffs[0])
#define b mxGetPr(Coeffs[1])
#define F mxGetPr(Coeffs[2])
#define G mxGetPr(Coeffs[3])
#define X0 mxGetPr(Coeffs[4])
#define X1 mxGetPr(Coeffs[5])
#define X2 mxGetPr(Coeffs[6])
#define X01 mxGetPr(Coeffs[7])
#define X11 mxGetPr(Coeffs[8])
#define X21 mxGetPr(Coeffs[9])
#define X02 mxGetPr(Coeffs[10])
#define X12 mxGetPr(Coeffs[11])
#define X22 mxGetPr(Coeffs[12])
#define X03 mxGetPr(Coeffs[13])
#define X13 mxGetPr(Coeffs[14])
#define X23 mxGetPr(Coeffs[15])
static
#ifdef __STDC__
void init_conditions(double *x0)
#else
void init_conditions(x0)
double *x0;
#endif /* __STDC__ */
{
x0[0] = X0[0];
x0[1] = X1[0];
x0[2] = X2[0];
x0[3] = X01[0];
x0[4] = X11[0];
x0[5] = X21[0];
x0[6] = X02[0];
x0[7] = X12[0];
x0[8] = X22[0];
x0[9] = X03[0];
x0[10] = X13[0];
x0[11] = X23[0];
}
static
#ifdef __STDC__
void derivatives(double t, double *x, double *u, double *dx)
#else
void derivatives(t,x,u,dx)
double t, *x, *u; /* Input variables */
double *dx; /* Output variable*/
#endif /* __STDC__ */
{
int i;
dx[0] = -x[1] * x[1] - x[2] * x[2] - a[0] * (x[0] - F[0]);
dx[1] = x[0] * x[1] - b[0] * x[0] * x[2] - x[1] - G[0];
dx[2] = b[0] * x[0] * x[1] + x[0] * x[2] - x[2];
for (i=0;i<=2;i++)
{
dx[3+i] = (-a[0]) * x[3+i] + (-2.0 * x[1]) * x[6+i] + (-2.0 * x[2]) * x[9+i];
dx[6+i] = (x[1] - b[0] * x[2]) * x[3+i] + (x[0] - 1.0) * x[6+i] + (-b[0] * x[0]) * x[9+i];
dx[9+i] = (b[0] * x[1] + x[2]) * x[3+i] + (b[0] * x[0]) * x[6+i] + (x[0] - 1.0) * x[9+i];
}
}
static
#ifdef __STDC__
void outputs(double t, double *x, double *u, double *y)
#else
void outputs(t,x,u,y)
double t, *x, *u; /* Input variables */
double *y; /* Output variable*/
#endif /* __STDC__ */
{
int i;
for (i=0;i<NOUTPUTS;y[i]=x[i],i++);
}
/* #include "simulink.h" */
The function was called by issuing
[t,x,y]=ode45('lor84',tf,[],options,[],a,b,F,G,X0,X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11);
Many thanks.
Ed
  4 Commenti
Ed Mendes
Ed Mendes il 23 Mar 2020
Modificato: Ed Mendes il 23 Mar 2020
I think I found the problem - "error: Pre-Simulink 2.0 S-functions no are longer supported. We suggest using one of the S-function templates and adding your algorithm code to it. #error Pre-Simulink 2.0 S-functions no are longer supported. We suggest using one of the S-function templates and adding your algorithm code to it."
It seems that I have to use a S-function c-template.
There is an example, csfunc.c, that can be useful. If you have an idea how to change it to simulate the system in my c-code above, please let me know. Many thanks.
Ed Mendes
Ed Mendes il 23 Mar 2020
There is another interesting function, vdpmex.c. The only thing that I could not figure out is how to pass the parameters as I did in the c-code above, that is, a,b,F,G and initial conditions. And of course, how to call it from a command line using ode45. many thanks.

Accedi per commentare.

Risposte (0)

Categorie

Scopri di più su Programming in Help Center e File Exchange

Tag

Prodotti


Release

R2017a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by