@@ -241,6 +241,7 @@ static int getNumericalJacobian(DATA* data, double* jac, double* x, double* f)
241241 {
242242 delta_hhh = solverData -> epsfcn * f [i ];
243243 delta_hh = fmax (delta_h * fmax (abs (x [i ]), abs (delta_hhh )), delta_h );
244+ delta_hh = ((f [i ] >= 0 ) ? delta_hh : - delta_hh );
244245 delta_hh = x [i ] + delta_hh - x [i ];
245246 deltaInv = 1. / delta_hh ;
246247 xsave = x [i ];
@@ -414,9 +415,9 @@ int solveHybrd(DATA *data, int sysNumber)
414415 INDENT (LOG_NLS );
415416 for (i = 0 ; i < solverData -> n ; i ++ )
416417 {
417- INFO2 (LOG_NLS , "x[%d] = %g " , i , systemData -> nlsx [i ]);
418+ INFO2 (LOG_NLS , "x[%d] = %f " , i , systemData -> nlsx [i ]);
418419 INDENT (LOG_NLS );
419- INFO3 (LOG_NLS , "scaling = %g \nold = %g \nextrapolated = %g " ,
420+ INFO3 (LOG_NLS , "scaling = %f \nold = %f \nextrapolated = %f " ,
420421 systemData -> nominal [i ], systemData -> nlsxOld [i ], systemData -> nlsxExtrapolation [i ]);
421422 RELEASE (LOG_NLS );
422423 }
@@ -429,10 +430,8 @@ int solveHybrd(DATA *data, int sysNumber)
429430 else
430431 memcpy (solverData -> x , systemData -> nlsxExtrapolation , solverData -> n * (sizeof (double )));
431432
432- for (i = 0 ; i < solverData -> n ; i ++ ){
433- solverData -> xScalefactors [i ] = fmax (solverData -> x [i ], systemData -> nominal [i ]);
434- }
435-
433+ for (i = 0 ; i < solverData -> n ; i ++ )
434+ solverData -> xScalefactors [i ] = fmax (fabs (solverData -> x [i ]), systemData -> nominal [i ]);
436435
437436 /* evaluate with discontinuities */
438437 {
@@ -448,9 +447,13 @@ int solveHybrd(DATA *data, int sysNumber)
448447 /* start solving loop */
449448 while (!giveUp && !success )
450449 {
450+
451451 /* debug output */
452452 if (ACTIVE_STREAM (LOG_NLS_V ))
453+ {
454+ printVector (solverData -> xScalefactors , & (solverData -> n ), LOG_NLS_V , "scaling factors x vector" );
453455 printVector (solverData -> x , & (solverData -> n ), LOG_NLS_V , "Iteration variable values" );
456+ }
454457
455458 /* Scaling x vector */
456459 if (solverData -> useXScaling )
@@ -622,8 +625,15 @@ int solveHybrd(DATA *data, int sysNumber)
622625 {
623626 /* try old values as x-Scaling factors */
624627
628+ /* set x vector */
629+ if (data -> simulationInfo .discreteCall )
630+ memcpy (solverData -> x , systemData -> nlsx , solverData -> n * (sizeof (double )));
631+ else
632+ memcpy (solverData -> x , systemData -> nlsxExtrapolation , solverData -> n * (sizeof (double )));
633+
634+
625635 for (i = 0 ; i < solverData -> n ; i ++ )
626- solverData -> xScalefactors [i ] = fmax (systemData -> nlsxOld [i ], systemData -> nominal [i ]);
636+ solverData -> xScalefactors [i ] = fmax (fabs ( systemData -> nlsxOld [i ]) , systemData -> nominal [i ]);
627637
628638 retries ++ ;
629639 giveUp = 0 ;
@@ -638,11 +648,20 @@ int solveHybrd(DATA *data, int sysNumber)
638648 {
639649 /* try to disable x-Scaling */
640650
651+ /* set x vector */
652+ if (data -> simulationInfo .discreteCall )
653+ memcpy (solverData -> x , systemData -> nlsx , solverData -> n * (sizeof (double )));
654+ else
655+ memcpy (solverData -> x , systemData -> nlsxExtrapolation , solverData -> n * (sizeof (double )));
656+
641657 int scaling = solverData -> useXScaling ;
642658 if (scaling )
643659 solverData -> useXScaling = 0 ;
644660
645- memcpy (solverData -> xScalefactors , systemData -> nominal , solverData -> n * (sizeof (double )));
661+ /* reset x-scalling factors */
662+ for (i = 0 ; i < solverData -> n ; i ++ )
663+ solverData -> xScalefactors [i ] = fmax (fabs (solverData -> x [i ]), systemData -> nominal [i ]);
664+
646665 retries ++ ;
647666 giveUp = 0 ;
648667 nfunc_evals += solverData -> nfev ;
@@ -677,6 +696,10 @@ int solveHybrd(DATA *data, int sysNumber)
677696 /* set x vector */
678697 memcpy (solverData -> x , systemData -> nlsxOld , solverData -> n * (sizeof (double )));
679698
699+ int scaling = solverData -> useXScaling ;
700+ if (!scaling )
701+ solverData -> useXScaling = 1 ;
702+
680703 continuous = 1 ;
681704 solverData -> factor = initial_factor ;
682705
@@ -749,7 +772,7 @@ int solveHybrd(DATA *data, int sysNumber)
749772
750773 for (i = 0 ; i < solverData -> n ; i ++ ) {
751774 solverData -> diag [i ] = fabs (solverData -> resScaling [i ]);
752- if (solverData -> diag [i ] <= 0 )
775+ if (solverData -> diag [i ] <= 1e-16 )
753776 solverData -> diag [i ] = 1e-16 ;
754777 }
755778 retries = 0 ;
@@ -762,7 +785,7 @@ int solveHybrd(DATA *data, int sysNumber)
762785 printStatus (solverData , & nfunc_evals , & xerror , & xerror_scaled , LOG_NLS_V );
763786 }
764787 /* try without internal scaling */
765- } else if ((solverData -> info == 4 || solverData -> info == 5 ) && retries3 < 2 ) {
788+ } else if ((solverData -> info == 4 || solverData -> info == 5 ) && retries3 < 1 ) {
766789 /* set x vector */
767790 if (data -> simulationInfo .discreteCall )
768791 memcpy (solverData -> x , systemData -> nlsx , solverData -> n * (sizeof (double )));
@@ -784,7 +807,7 @@ int solveHybrd(DATA *data, int sysNumber)
784807 printStatus (solverData , & nfunc_evals , & xerror , & xerror_scaled , LOG_NLS_V );
785808 }
786809 /* try to reduce the tolerance a bit */
787- } else if ((solverData -> info == 4 || solverData -> info == 5 ) && retries3 < 7 ) {
810+ } else if ((solverData -> info == 4 || solverData -> info == 5 ) && retries3 < 6 ) {
788811 /* set x vector */
789812 if (data -> simulationInfo .discreteCall )
790813 memcpy (solverData -> x , systemData -> nlsx , solverData -> n * (sizeof (double )));
@@ -815,7 +838,7 @@ int solveHybrd(DATA *data, int sysNumber)
815838 }
816839 if (ACTIVE_STREAM (LOG_NLS )) {
817840 RELEASE (LOG_NLS );
818- INFO1 (LOG_NLS , "### No Solution! ###\n after %d restarts" , retries + retries2 + retries3 );
841+ INFO1 (LOG_NLS , "### No Solution! ###\n after %d restarts" , retries * retries2 * retries3 );
819842 printStatus (solverData , & nfunc_evals , & xerror , & xerror_scaled , LOG_NLS );
820843 }
821844 }
0 commit comments