Skip to content

Commit 2eb4aaf

Browse files
author
Vitalij Ruge
committed
- improve numeric in hessian
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@19892 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent 19e43c4 commit 2eb4aaf

File tree

1 file changed

+15
-9
lines changed

1 file changed

+15
-9
lines changed

SimulationRuntime/c/optimization/lagrangeFun/ipopt_hessian.c

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -203,13 +203,18 @@ Bool ipopt_h(int n, double *v, Bool new_x, double obj_factor, int m, double *lam
203203
static int sumLagrange(IPOPT_DATA_ *iData, double * erg,int ii, int i, int j, int p, modelica_boolean mayer_yes)
204204
{
205205
long double sum;
206+
int l;
207+
206208
OPTIMIZER_DIM_VARS *dim = &iData->dim;
207209
OPTIMIZER_MBASE *mbase = &iData->mbase;
208-
int l;
210+
209211
int nJ = (p) ? dim->nJ : dim->nx;
212+
210213
sum = 0.0;
214+
211215
for(l = 0; l<dim->nx; ++l)
212-
sum += iData->df.H[l][i][j];
216+
if(iData->sopt.knowedJ[l][j] + iData->sopt.knowedJ[l][i] >= 2)
217+
sum += iData->df.H[l][i][j];
213218

214219
if(iData->sopt.lagrange &&
215220
iData->sopt.gradFs[iData->lagrange_index][i]*iData->sopt.gradFs[iData->lagrange_index][j])
@@ -222,8 +227,9 @@ static int sumLagrange(IPOPT_DATA_ *iData, double * erg,int ii, int i, int j, in
222227

223228
sum = iData->dtime.dt[ii]*sum;
224229

225-
for(l = dim->nx; l<nJ; ++l)
226-
sum += iData->df.H[l][i][j];
230+
for(l = dim->nx; l<nJ; ++l)
231+
if(iData->sopt.knowedJ[l][j] + iData->sopt.knowedJ[l][i] >= 2)
232+
sum += iData->df.H[l][i][j];
227233

228234
if(mayer_yes && iData->sopt.gradFs[iData->mayer_index][i]*iData->sopt.gradFs[iData->mayer_index][j])
229235
sum += iData->df.mH[i][j];
@@ -266,7 +272,7 @@ static int num_hessian(double *v, double t, IPOPT_DATA_ *iData, double *lambda,
266272
if(iData->sopt.Hg[i][j]){
267273
for(l = 0; l< nJ; ++l){
268274
if(iData->sopt.knowedJ[l][j] + iData->sopt.knowedJ[l][i] >= 2 && lambda[l] != 0.0)
269-
iData->df.H[l][i][j] = (long double)lambda[l]*(iData->df.J[l][j] - iData->df.J0[l][j])/h;
275+
iData->df.H[l][i][j] = (long double)(iData->df.J[l][j] - iData->df.J0[l][j])*lambda[l]/h;
270276
else
271277
iData->df.H[l][i][j] = (long double) 0.0;
272278
iData->df.H[l][j][i] = iData->df.H[l][i][j];
@@ -276,8 +282,8 @@ static int num_hessian(double *v, double t, IPOPT_DATA_ *iData, double *lambda,
276282
h = obj_factor/h;
277283
if(lagrange_yes){
278284
for(j = i; j < dim->nv; ++j){
279-
if(iData->sopt.gradFs[iData->lagrange_index][i]*iData->sopt.gradFs[iData->lagrange_index][j])
280-
iData->df.oH[i][j] = (long double) h* iData->scaling.vnom[j]*(iData->df.gradF[0][j] - iData->df.gradF[2][j]);
285+
if(iData->sopt.gradFs[iData->lagrange_index][i]*iData->sopt.gradFs[iData->lagrange_index][j] && obj_factor!=0)
286+
iData->df.oH[i][j] = (long double) (iData->df.gradF[0][j] - iData->df.gradF[2][j])*h*iData->scaling.vnom[j];
281287
else
282288
iData->df.oH[i][j] = 0.0;
283289
iData->df.oH[j][i] = iData->df.oH[i][j] ;
@@ -286,8 +292,8 @@ static int num_hessian(double *v, double t, IPOPT_DATA_ *iData, double *lambda,
286292

287293
if(mayer_yes){
288294
for(j = i; j < dim->nv; ++j){
289-
if(iData->sopt.gradFs[iData->mayer_index][i]*iData->sopt.gradFs[iData->mayer_index][j])
290-
iData->df.mH[i][j] = (long double) h* iData->scaling.vnom[j]*(iData->df.gradF[1][j] - iData->df.gradF[3][j]);
295+
if(iData->sopt.gradFs[iData->mayer_index][i]*iData->sopt.gradFs[iData->mayer_index][j] && obj_factor!=0)
296+
iData->df.mH[i][j] = (long double) (iData->df.gradF[1][j] - iData->df.gradF[3][j])*h* iData->scaling.vnom[j];
291297
else
292298
iData->df.mH[i][j] = 0.0;
293299
iData->df.mH[j][i] = iData->df.mH[i][j] ;

0 commit comments

Comments
 (0)