control optimization

Hello to all,

during a parametric study i would like to control the DoFs of some joints. Some of these chosen configurations, however, lead to an error: “solver aborted after maximum number of iterations”.
I have 2 questions about this:

1.) What does this indicate in reality? A excess of muscle activtiy? A configuration for which no equilibrium can be generated, even if the muscles were stronger?

2.) I assume that these configurations are not physiological, but for the sake of continuity of the results during the parametric analysis i would nevertheless like to know a “theorectical” solution even if this means too large muscle activities. Is there a way to make AB find a solution (e. g. increase the number of allowed iterations, or any other optimization control, or something else…)?

Thanks a lot and kind regards,

Thomaz

Hey Thomaz,

Just to understand you correct: Where exactly does that happen? Is it in a parameter study when you test different design variables, or is it in the MotionAndParameterOptimization?

I’m aware of that error in the “MotionAndParameterOptimizationModel”, but then it’s pure kinematics and you don’t have muscles included.

Could you give more details please.


I use AB 5.0 and it happens in an inverse dynamic analysis. I do the parameterization myself, i do not use the AB parametric study facilities. As a matter of fact, it is an inverse static analysis.

Some more:

This error message shows that the model is out of balance and the muscles cannot solve the equations to have it in balance. Stronger muscles would not change anything. It means, that there is really a moment arm or something similar in 0 position. So for no iteration value exists for the muscle recruitment.

To isolate the source:

  • do you have conditional contact in your model between Body and Environment? This contact (as in the standing model with tripod) is modeled with muscles. These can cause the same error message.

  • if not, do you see it fails when you assume a muscle activity of 1 or above 1?

Hi Amir,

no, there is no contact in the model.
What do you mean with “assume a muscle activity of 1 or above”? I don’t know the muscles’ activities as the solution is not calculated.

Thanks, Thomaz

General aspect: Do you think that the model should solve even with the changes in your parametric study? Or might it fail, because there is something wrong, like a moment arm with 0?

About your question, my thoughts were:
if you take a model that works with a similar configuration, does the muscle envelope go over 1?

Hi Amir,

i don’t know whether there is a zero lever arm due to some joint positions, but i think not.

And yes, the muscle activities in the neighbourhood are rather high. May this result in a too high number of iterations?

If you use the default settings the upper bound is on. If there is no more solution for muscle activities to stay under or at 100% muscle activity,
it will switch and take another criterion (Min/Max) and go over 100%. This switching is a critical point, could you turn the upper bound “off” and try it again please.

I see.

What is the method to switch off all upper bounds?
I used AnyMuscleActivityBound, but this expects an AnyMuscle as far as i understand the documentation. Can the upper bound be switched off globally?

Thanks, that seems to be the reason for the strange behaviour. I did not know that the criterion changes without asking me :rolleyes: (Can this behaviour be found in the documentation?)

Thomaz,

you can switch it of by including following command in the study:

Main.Study.InverseDynamics.Criterion.UpperBoundOnOff = Off;

It should be described/mentioned in the muscle recruitment tutorial. But I’m going to double check that now.
**

Thanks so much, that’s it! Now it works.

The automatical switching behaviour explains another problem as well.

Kind regards,

Thomaz

Hi Amir,

sometimes is still get an error. I think the output is slightly different: solver aborted after maximum number of line-search iterations.

Have you got a clue about how to find/avoid this error?

Thanks again,

Thomas

btw: interesting webinar, thanks

Hi Thomaz,

It is hard to say what causes this, it can be many things.

In general it simply means that the solver failed to balance the problem.

We have a small section in the wiki wich provides some general hints:

http://wiki.anyscript.org/index.php/Model_trouble_shooting#Make_the_solution_of_the_inverse_problem_stable.3F

I am not aware of the details in your model, but i would in such a case check the accelerations of the segments, to see if these are realistic, and similarly check the applied forces from any forceplate to see if there are any spikes that could cause problems.

Best regards
Søren

Best regards
Søren

It is the StandingModel but without intra abdominal pressure and without the spine rythm.

A very small change of the T12/L1 angle (compared to a running configuration which has a max muscle activity of less than 10%) leads to this error. The change is only 0.006° (!)

I would be glad about every hint.

Hi Thomas,

After discussing with Søren, we think it might be the missing Abdominal Pressure. I’m not sure how you removed it, but it could be that there are some “leftovers” as the buckle segment, that has trouble being balanced now. Even tiny changes might affect that system. Options:

  1. make the belly muscles very weak, so they are still there and make the buckle stable, but don’t apply significant loads.
  2. try to get rid of everything related to the abdominal pressure (there should be segment and muscles at the buckle)
    3 make a constraint, so that the buckle segment is fixed.

**

Hi Amir,

thanks for your help (the thread gets longer and longer :slight_smile: ).

I found out that (sometimes) it helps to use “NewRecruitmentSolversOnOff = Off;”.
nStep = 1 also worked while nStep = 2 doesn’t (at least for one specific case)
Though i don’t know whether this is accidentally.

I switched the IAP off by simply inserting:
AnyMuscleActivityBound AbdominalMuscleLimit =
{
LowerBoundOnOff = On;
LowerBound = 0.0;
UpperBoundOnOff = On;
UpperBound = 0.0;
AnyMuscle &AbdominalMuscleLimit = Main.HumanModel.BodyModel.Trunk.Buckle.AbdominalPressureMuscle1;
};

Do you think, this is a good idea?

I am not sure about the suggestions you made:

1.) Do you mean the following muscles: transversus; obliquus externus, internus; Rectus abdominis? I understand that reducing their strengths would reduce the IAP, but don’t they have effects other than only creating IAP? What about the strength of the Ab dominalPressureMuscle1?

2.) Do you think that setting the UpperBound of the AbdominalMuslceLimit to zero or a very small number (see above) should have the same effect?

3.) How do you mean this? I must admit that i do not completely understood the way the buckle works. Could you give some lines of code how to do this?

Thanks for your help,

kind regards,

Thomaz

The way you excluded the IAP is correct.

I think it is very difficult to get the solution 1 and 3 working. This will be too messy and complicated. I would therefore suggest to go with 2. And yes, just change the bound, go with a small value (0.05) and see what happens.
In the Buckle are virtual segments, that are balanced with muscles on one side and the IAP on the other side. So if there is only one force it might get out of balance.
I will try to get a more detailed explanation of this buckle/IAP.

**