jacobian.c
Go to the documentation of this file.
1 #include "jacobian.h"
2 
3 #include "error.h"
4 #include "basic_algebra.h"
5 
17 {
18  unsigned int i;
19 
20  j->neqs=NEqualityEquations(eqs);
21  j->nvars=NVariables(vs);
22 
23  if (j->nvars==0)
24  Error("Empty problem in InitJacobian");
25 
26  NEW(j->J,j->nvars,Tequations);
27  for(i=0;i<j->nvars;i++)
28  DeriveEqualityEquations(i,&(j->J[i]),eqs);
29 }
30 
31 void CopyJacobian(TJacobian *j_dst,TJacobian *j_src)
32 {
33  unsigned int i;
34 
35  j_dst->neqs=j_src->neqs;
36  j_dst->nvars=j_src->nvars;
37 
38  NEW(j_dst->J,j_dst->nvars,Tequations);
39  for(i=0;i<j_dst->nvars;i++)
40  CopyEquations(&(j_dst->J[i]),&(j_src->J[i]));
41 }
42 
43 void GetJacobianSize(unsigned int *nr,unsigned int *nc,TJacobian *j)
44 {
45  *nr=j->neqs;
46  *nc=j->nvars;
47 }
48 
50 {
51  if (nv>=j->nvars)
52  Error("Index out of range in GetJacobianColumn");
53 
54  return(&(j->J[nv]));
55 }
56 
57 Tequation *GetJacobianEquation(unsigned int r,unsigned int c,TJacobian *j)
58 {
59  if ((r>=j->neqs)||(c>=j->nvars))
60  Error("Index out of range in GetJacobianEquation");
61 
62  return(GetEquation(r,&(j->J[c])));
63 }
64 
66 {
67  if (j->neqs>0)
68  {
69  unsigned int i;
70 
71  NEW(*m,j->neqs,double *);
72  for(i=0;i<j->neqs;i++)
73  {
74  NEW((*m)[i],j->nvars,double);
75  }
76  }
77 }
78 
79 void EvaluateJacobian(double *v,double **m,TJacobian *j)
80 {
81  if (j->neqs>0)
82  {
83  unsigned int i,k;
84  double *e;
85 
86  NEW(e,j->neqs,double);
87  for(i=0;i<j->nvars;i++)
88  {
89  EvaluateEqualityEquations(FALSE,v,e,&(j->J[i]));
90  for(k=0;k<j->neqs;k++)
91  m[k][i]=e[k];
92  }
93  free(e);
94  }
95 }
96 
97 void EvaluateJacobianInVector(double *v,unsigned int nr,unsigned int nc,double *m,TJacobian *j)
98 {
99  if (j->neqs>0)
100  {
101  unsigned int i;
102  double *e;
103 
104  NEW(e,j->neqs,double);
105  for(i=0;i<j->nvars;i++)
106  {
107  EvaluateEqualitySparseEquations(v,e,&(j->J[i]));
108  SubMatrixFromMatrix(j->neqs,1,e,0,i,nr,nc,m);
109  }
110  free(e);
111  }
112 }
113 
114 void EvaluateJacobianSubSetInVector(double *v,boolean *sr,unsigned int nr,unsigned int nc,double *m,TJacobian *j)
115 {
116  if (j->neqs>0)
117  {
118  unsigned int i,l;
119  double *e;
120 
121  l=0;
122  for(i=0;i<j->neqs;i++)
123  {
124  if (sr[i]) l++;
125  }
126 
127  NEW(e,l,double);
128  for(i=0;i<j->nvars;i++)
129  {
130  EvaluateSubSetEqualitySparseEquations(v,sr,e,&(j->J[i]));
131  SubMatrixFromMatrix(l,1,e,0,i,nr,nc,m);
132  }
133  free(e);
134  }
135 }
136 
137 void EvaluateTransposedJacobianInVector(double *v,unsigned int nr,unsigned int nc,double *m,TJacobian *j)
138 {
139  if (j->neqs>0)
140  {
141  unsigned int i;
142  double *e;
143 
144  NEW(e,j->neqs,double);
145  for(i=0;i<j->nvars;i++)
146  {
147  EvaluateEqualitySparseEquations(v,e,&(j->J[i]));
148  SubMatrixFromMatrix(1,j->neqs,e,i,0,nr,nc,m);
149  }
150  free(e);
151  }
152 }
153 
154 void EvaluateTransposedJacobianSubSetInVector(double *v,boolean *sr,unsigned int nr,unsigned int nc,double *m,TJacobian *j)
155 {
156  if (j->neqs>0)
157  {
158  unsigned int i,l;
159  double *e;
160 
161  l=0;
162  for(i=0;i<j->neqs;i++)
163  {
164  if (sr[i]) l++;
165  }
166 
167  NEW(e,l,double);
168  for(i=0;i<j->nvars;i++)
169  {
170  EvaluateSubSetEqualitySparseEquations(v,sr,e,&(j->J[i]));
171  SubMatrixFromMatrix(1,l,e,i,0,nr,nc,m);
172  }
173  free(e);
174  }
175 }
176 
177 void PrintJacobianEvaluation(FILE *f,double **m,TJacobian *j)
178 {
179  unsigned int i,k;
180 
181  fprintf(f,"[");
182  for(i=0;i<j->neqs;i++)
183  {
184  for(k=0;k<j->nvars;k++)
185  {
186  fprintf(f,"%.16f ",m[i][k]);
187  }
188  fprintf(f,"\n");
189  }
190  fprintf(f,"];\n");
191 }
192 
193 
195 {
196  if (j->neqs>0)
197  {
198  unsigned int i;
199 
200  for(i=0;i<j->neqs;i++)
201  free(m[i]);
202  free(m);
203  }
204 }
205 
207  unsigned int n,unsigned int ng,unsigned int *g,double *v,
208  unsigned int *nr,unsigned int *nc,double ***m,
209  TJacobian *j)
210 {
211  unsigned int i,k;
212  double *e;
213 
214  /* Size of the output matrix */
215  *nr=3*n;
216  *nc=j->nvars;
217 
218  /* Allocate the output matrix. */
219  NEW(*m,3*n,double*);
220  for(i=0;i<*nr;i++)
221  { NEW((*m)[i],*nc,double); }
222 
223  /* Space for the evaluation of each column */
224  NEW(e,*nr,double);
225 
226  /* Evaluate column-wise */
227  for(i=0;i<j->nvars;i++)
228  {
229  EvaluateEquationsXVectors(p,ng,g,v,e,&(j->J[i]));
230  for(k=0;k<(*nr);k++)
231  (*m)[k][i]=e[k];
232  }
233 
234  /* Release space */
235  free(e);
236 }
237 
238 void PrintJacobian(FILE *f,char **varNames,TJacobian *j)
239 {
240  unsigned int i;
241 
242  for(i=0;i<j->nvars;i++)
243  {
244  fprintf(f,"Jacobian column %u\n",i);
245  PrintEquations(f,varNames,&(j->J[i]));
246  }
247 }
248 
250 {
251  unsigned int i;
252 
253  for(i=0;i<j->nvars;i++)
254  DeleteEquations(&(j->J[i]));
255  free(j->J);
256 }
void AllocateJacobianEvaluation(double ***m, TJacobian *j)
Allocate space for the Jacobian evaluation.
Definition: jacobian.c:65
void FreeJacobianEvaluation(double **m, TJacobian *j)
Release space for the Jacobian evaluation.
Definition: jacobian.c:194
void InitJacobian(Tvariables *vs, Tequations *eqs, TJacobian *j)
Constructor.
Definition: jacobian.c:16
Set of variables of a cuiksystem.
Definition: variables.h:38
Tequation * GetEquation(unsigned int n, Tequations *eqs)
Gets an equation from the set.
Definition: equations.c:1697
#define FALSE
FALSE.
Definition: boolean.h:30
Tequations * J
Definition: jacobian.h:26
unsigned int NVariables(Tvariables *vs)
Gets the number of variables in a set.
Definition: variables.c:69
void EvaluateJacobian(double *v, double **m, TJacobian *j)
Evaluates the Jacobian.
Definition: jacobian.c:79
#define NEW(_var, _n, _type)
Allocates memory space.
Definition: defines.h:385
Definition of the TJacobian type and the associated functions.
void CopyEquations(Tequations *eqs_dst, Tequations *eqs_src)
Copy constructor.
Definition: equations.c:768
void PrintJacobianEvaluation(FILE *f, double **m, TJacobian *j)
Prints the result of evaluating the Jacobian.
Definition: jacobian.c:177
void Error(const char *s)
General error function.
Definition: error.c:80
void PrintJacobian(FILE *f, char **varNames, TJacobian *j)
Prints the symbolic Jacobian.
Definition: jacobian.c:238
void EvaluateSubSetEqualitySparseEquations(double *v, boolean *se, double *r, Tequations *eqs)
Evaluates a subset of the set of equality equations for sparse systems.
Definition: equations.c:2586
Tequation * GetJacobianEquation(unsigned int r, unsigned int c, TJacobian *j)
Returns one element of the Jacobian.
Definition: jacobian.c:57
Error and warning functions.
Tequations * GetJacobianColumn(unsigned int nv, TJacobian *j)
Returns one of the Jacobian element.
Definition: jacobian.c:49
void EvaluateJacobianXVectors(double *p, unsigned int n, unsigned int ng, unsigned int *g, double *v, unsigned int *nr, unsigned int *nc, double ***m, TJacobian *j)
Evaluates the Jacobian multiplied by some given vectors.
Definition: jacobian.c:206
unsigned int neqs
Definition: jacobian.h:24
unsigned int NEqualityEquations(Tequations *eqs)
Number of equalities in the set.
Definition: equations.c:1095
Set of equations.
Definition: equations.h:81
An equation.
Definition: equation.h:236
void EvaluateJacobianInVector(double *v, unsigned int nr, unsigned int nc, double *m, TJacobian *j)
Evaluates the Jacobian.
Definition: jacobian.c:97
void EvaluateEqualitySparseEquations(double *v, double *r, Tequations *eqs)
Evaluates the set of equality equations for sparse systems.
Definition: equations.c:2563
void EvaluateEqualityEquations(boolean systemOnly, double *v, double *r, Tequations *eqs)
Evaluates all equality equations in the set.
Definition: equations.c:2477
void EvaluateEquationsXVectors(double *v, unsigned int ng, unsigned int *g, double *p, double *r, Tequations *eqs)
Evaluates the matrix equations multiplied by some given vectors.
Definition: equations.c:2624
CBLAS_INLINE void SubMatrixFromMatrix(unsigned int nr1, unsigned int nc1, double *m1, unsigned int nri, unsigned int nci, unsigned int nr, unsigned int nc, double *m)
Defines a submatrix in a matrix.
unsigned int nvars
Definition: jacobian.h:25
void EvaluateJacobianSubSetInVector(double *v, boolean *sr, unsigned int nr, unsigned int nc, double *m, TJacobian *j)
Evaluates some of the Jacobian equations.
Definition: jacobian.c:114
The Jacobian of a set of equations.
Definition: jacobian.h:23
void EvaluateTransposedJacobianSubSetInVector(double *v, boolean *sr, unsigned int nr, unsigned int nc, double *m, TJacobian *j)
Evaluates a subset of the transposed Jacobian.
Definition: jacobian.c:154
void DeleteEquations(Tequations *eqs)
Destructor.
Definition: equations.c:2750
void PrintEquations(FILE *f, char **varNames, Tequations *eqs)
Prints a set of equations.
Definition: equations.c:2694
void GetJacobianSize(unsigned int *nr, unsigned int *nc, TJacobian *j)
Returns the size of the Jacobian.
Definition: jacobian.c:43
void DeriveEqualityEquations(unsigned int v, Tequations *deqs, Tequations *eqs)
Derives an equation set.
Definition: equations.c:2668
void DeleteJacobian(TJacobian *j)
Destructor.
Definition: jacobian.c:249
void CopyJacobian(TJacobian *j_dst, TJacobian *j_src)
Constructor.
Definition: jacobian.c:31
void EvaluateTransposedJacobianInVector(double *v, unsigned int nr, unsigned int nc, double *m, TJacobian *j)
Evaluates the transposed Jacobian.
Definition: jacobian.c:137