Arc-length control method (Lam & Morley, 1992)
Contents
Notation and references
The notation followed here and in the following MATLAB codes:
- arc_length_Lam_Morley.m
- arc_length_Lam_Morley_modified.m
conforms to that used by Lam & Morley in the following reference:
Lam, W. and Morley, C. (1992). ”Arc-Length Method for Passing Limit Points in Structural Calculation.” J. Struct. Eng., 118(1), 169–185. This reference is denoted as [6] inside the text of the above codes.
Algorithms implemented
- Arc length control method as described by Lam & Morley (1992)
- Modified version of the above method which directs the search towards
, where
is the load factor.
help arc_length_Lam_Morley %1 help arc_length_Lam_Morley_modified %2
Arc-length control method (Lam & Morley, 1992)
Description
The equation functn(#p#)=#lambda#*#q# is solved for #p#, where
#lambda# (load factor) is given as a result along with each root
(#p#), with #q# not equal to 0. If the equation functn(#p#)=0 is to
be solved, #q# and #functn# are redefined such that
functn(#p#)+#q#=#q#.
The method used is described in Lam & Morley (1992): "Arc-Length
Method for Passing Limit Points in Structural Calculation" according
to the flowchart of Figure 3, p.178.
Notation in this code conforms to that used in the above paper.
Required input arguments
#functn# is the function handle at the left hand side of the equation
to be solved. The definition of #functn# must be of the type:
[#f#,#J#]=functn(#p#), where #f# ([#dim# x 1]) is the value of
#functn# at #p# ([#dim# x 1]) and #J# ([#dim# x #dim#]) is the value
of the Jacobian matrix of #functn# at #p#.
#q# ([#dim# x 1]) is the right hand side of the equation
functn(#p#)=#lambda#*#q#.
#p0# ([#dim# x 1]) is the starting point of the solution.
Optional input arguments
#maxIINCS# (scalar) is the number of equilibrium points desired.
Default value is 10.
#lambda0# (scalar) is the initial load factor. Default value
is 0.
#Deltalambda# (scalar) is the initial load increment. Default value
is 1.
#IITERmax# (scalar) is the maximum number of iterations permitted for
each converged point. If convergence is not achieved until the
maximum iteration the procedure stops and accepts as equilibrium
point that calculated at the last iteration. Default value is 20, as
recommended by Lam & Morley (1992).
#Ide# (scalar) is the desired number of iterations to each converged
point. Default value is 1.
#tol# (scalar) is the tolerance for convergence criterion (eq. 20) in
[6] for #e# and #h#. Default value is 0.00005.
#KTup# (scalar) is the stiffness matrix updater (number of iterations
after which the tangent stiffness matrix is updated). For #KTup# = 1
the algorithm implemented is Full Arc-Length method. For #KTup# = Inf
the algorithm implemented is Initial Stiffness Arc-Length method.
Default value is 1.
#dettol# (scalar) is the tolerance for singularity of Jacobian (#J#).
Default value is 1e-4.
Output arguments
#p_out# ([#dim# x #maxIINCS#]) roots of the equation being solved.
#lambda_out# ([1 x #maxIINCS#]) are the load factors (one per
increment). The roots of the equation to be solved correspond to
#lambda_out#=1 (or a feasible value as closest as possible to 1).
#iter_out# ([1 x #maxIINCS#]) number of iterations for each
increment.
Parents (calling functions)
None.
Children (called functions)
None.
__________________________________________________________________________
Copyright (c) 09-Mar-2014
George Papazafeiropoulos
First Lieutenant, Infrastructure Engineer, Hellenic Air Force
Civil Engineer, M.Sc., Ph.D. candidate, NTUA
Email: gpapazafeiropoulos@yahoo.gr
Website: http://users.ntua.gr/gpapazaf/
Modified arc-length control method (Lam & Morley, 1992)
Description
The equation functn(#p#)=#lambda#*#q# is solved for #p#, where
#lambda# (load factor) is given as a result along with each root
(#p#), with #q# not equal to 0. If the equation functn(#p#)=0 is to
be solved, #q# and #functn# are redefined such that
functn(#p#)+#q#=#q#.
The method used is described in Lam & Morley (1992): "Arc-Length
Method for Passing Limit Points in Structural Calculation" according
to the flowchart of Figure 3, p.178, with a minor modification so
that the solution procedure is directed towards #lambda#=1.
Notation in this code conforms to that used in the above paper.
Required input arguments
#functn# is the function handle at the left hand side of the equation
to be solved. The definition of #functn# must be of the type:
[#f#,#J#]=functn(#p#), where #f# ([#dim# x 1]) is the value of
#functn# at #p# ([#dim# x 1]) and #J# ([#dim# x #dim#]) is the value
of the Jacobian matrix of #functn# at #p#.
#q# ([#dim# x 1]) is the right hand side of the equation
functn(#p#)=#lambda#*#q#.
#p0# ([#dim# x 1]) is the starting point of the solution.
Optional input arguments
#maxIINCS# (scalar) is the number of equilibrium points desired.
Default value is 10.
#lambda0# (scalar) is the initial load factor. Default value
is 0.
#Deltalambda# (scalar) is the initial load increment. Default value
is 1.
#IITERmax# (scalar) is the maximum number of iterations permitted for
each converged point. If convergence is not achieved until the
maximum iteration the procedure stops and accepts as equilibrium
point that calculated at the last iteration. Default value is 20, as
recommended by Lam & Morley (1992).
#Ide# (scalar) is the desired number of iterations to each converged
point. Default value is 1.
#tol# (scalar) is the tolerance for convergence criterion (eq. 20) in
[6] for #e# and #h#. Default value is 0.00005.
#KTup# (scalar) is the stiffness matrix updater (number of iterations
after which the tangent stiffness matrix is updated). For #KTup# = 1
the algorithm implemented is Full Arc-Length method. For #KTup# = Inf
the algorithm implemented is Initial Stiffness Arc-Length method.
Default value is 1.
#dettol# (scalar) is the tolerance for singularity of Jacobian (#J#).
Default value is 1e-4.
Output arguments
#p_out# ([#dim# x #maxIINCS#]) roots of the equation being solved.
#lambda_out# ([1 x #maxIINCS#]) are the load factors (one per
increment). The roots of the equation to be solved correspond to
#lambda_out#=1 (or a feasible value as closest as possible to 1).
#iter_out# ([1 x #maxIINCS#]) number of iterations for each
increment.
Parents (calling functions)
None.
Children (called functions)
None.
__________________________________________________________________________
Copyright (c) 09-Mar-2014
George Papazafeiropoulos
First Lieutenant, Infrastructure Engineer, Hellenic Air Force
Civil Engineer, M.Sc., Ph.D. candidate, NTUA
Email: gpapazafeiropoulos@yahoo.gr
Website: http://users.ntua.gr/gpapazaf/
Equations solved
The following equations are solved for
and 

![$$\left[\begin{array}{c} {\mathrm{x_1}}^2 + {\mathrm{x_2}}^2 - 49\\
\mathrm{x_1}\, \mathrm{x_2} - 24 \end{array}\right] =
\left[\begin{array}{c} 1\\ 1 \end{array}\right] \, \mathrm{\lambda} \ \ \
\ \ \ (2)$$](arc_length_Lam_Morley_example_eq05444.png)
Function definitions
Two functions are utilized for the arc-length procedure:
The first function (
, defined in the file function4.m ), needed to solve equation (1) is a cubic polynomial with the following properties:
- Function value:

- Function jacobian (derivative):

- Passes through the origin:

The second function (
, defined in the file function3.m ), needed to solve equation (2) is a nonlinear smooth function with the following properties:
- Function value:
![$$f_2\left(\left[\begin{array}{c} \mathrm{x_1}\\ \mathrm{x_2}
\end{array}\right]\right) = \left[\begin{array}{c} {\mathrm{x_1}}^2 +
{\mathrm{x_2}}^2 - 49\\ \mathrm{x_1}\, \mathrm{x_2} - 24
\end{array}\right]$$](arc_length_Lam_Morley_example_eq12520.png)
- Function jacobian:
![$$J_2\left(\left[\begin{array}{c} \mathrm{x_1}\\ \mathrm{x_2}
\end{array}\right]\right) = \left[\begin{array}{cc} 2\, \mathrm{x_1} &
2\, \mathrm{x_2}\\ \mathrm{x_2} & \mathrm{x_1} \end{array}\right] $$](arc_length_Lam_Morley_example_eq04221.png)
Function coding
- For function
:
function [f,J]=function4(x) % Function output (1-by-1) f=x^3-57/8*x^2+51/4*x; % Function Jacobian output (1-by-1) J=3*x^2-57/4*x+51/4; end
- For function
:
function [f,J]=function3(x) % Function output column vector (2-by-1) f1 = x(1)^2 + x(2)^2 - 49; f2 = x(1)*x(2) -24; f = [f1;f2]; % Function Jacobian output matrix (2-by-2) J=[ 2*x(1), 2*x(2); x(2), x(1)]; end
Initial definitions
In the subsequent code the following initial definitions are made (in the order presented below):
- Define function

- Define function

- Set right hand side (
) of equation (1) - Set right hand side (
) of equation (2) - Set starting point (
) for solution of equation (1) - Set starting point (
) for solution of equation (2) - Set number of increments desired
- Set initial value of

- Set initial value of

- Set maximum number of iterations permitted per increment
- Set number of iterations desired to each converged point (
) - Set number of iterations desired to each converged point (
) for the modified Lam-Morley algorithm and solution of equation (2) - Set tolerance for convergence (
) for the solution of equation (1). Typical values range from 1/1000 to 1/500 - Set tolerance for convergence (
) for the solution of equation (2). Typical values range from 1/1000 to 1/500 - Set the number of iterations every which the stiffness matrix of the problem is updated. KTup=1 corresponds to the full arc length method
- Set the tolerance for determining if the stiffness matrix is singular (this is true if its determinant is below dettol)
functn1=@function4; %1 functn2=@function3; %2 q1=5; %3 q2=[1;1]; %4 p01=0.1; %5 p02=[4;6]; %6 maxIINCS=10; %7 lambda0=0; %8 Deltalambda=1; %9 IITERmax=20; %10 Ide=1; %11 Idemod2=5; %12 tol=5e-5; %13 tol2=2e-3; %14 KTup=1; %15 dettol=1e-4; %16
Applications
- Default application of the arc length control method as described by Lam & Morley (1992) to solve equation (1)
- Default application of the modified version of the Lam & Morley (1992) arc length control method to solve equation (1)
- Non-default application of the arc length control method as described by Lam & Morley (1992) to solve equation (1)
- Non-default application of the modified version of the Lam & Morley (1992) arc length control method to solve equation (1)
- Default application of the arc length control method as described by Lam & Morley (1992) to solve equation (2)
- Default application of the modified version of the Lam & Morley (1992) arc length control method to solve equation (2)
- Non-default application of the arc length control method as described by Lam & Morley (1992) to solve equation (2)
- Non-default application of the modified version of the Lam & Morley (1992) arc length control method to solve equation (2)
[p_out1,lambda_out1,iter_out1] = arc_length_Lam_Morley(functn1,q1,p01); %1 Result1=[p_out1',lambda_out1',iter_out1'] %1 [p_out2,lambda_out2,iter_out2] = arc_length_Lam_Morley_modified(functn1,q1,p01); %2 Result2=[p_out2',lambda_out2',iter_out2'] %2 [p_out3,lambda_out3,iter_out3] = arc_length_Lam_Morley(functn1,q1,p01,maxIINCS,lambda0,Deltalambda,IITERmax,Ide,tol,KTup,dettol); %3 Result3=[p_out3',lambda_out3',iter_out3'] %3 [p_out4,lambda_out4,iter_out4] = arc_length_Lam_Morley_modified(functn1,q1,p01,maxIINCS,lambda0,Deltalambda,IITERmax,Ide,tol,KTup,dettol); %4 Result4=[p_out4',lambda_out4',iter_out4'] %4 [p_out5,lambda_out5,iter_out5] = arc_length_Lam_Morley(functn2,q2,p02); %5 Result5=[p_out5',lambda_out5',iter_out5'] %5 [p_out6,lambda_out6,iter_out6] = arc_length_Lam_Morley_modified(functn2,q2,p02); %6 Result6=[p_out6',lambda_out6',iter_out6'] %6 [p_out7,lambda_out7,iter_out7] = arc_length_Lam_Morley(functn2,q2,p02,maxIINCS,lambda0,Deltalambda,IITERmax,Ide,tol2,KTup,dettol); %7 Result7=[p_out7',lambda_out7',iter_out7'] %7 [p_out8,lambda_out8,iter_out8] = arc_length_Lam_Morley_modified(functn2,q2,p02,maxIINCS,lambda0,Deltalambda,IITERmax,Idemod2,tol2,KTup,dettol); %8 Result8=[p_out8',lambda_out8',iter_out8'] %8
Result1 =
0.5403 0.9934 2.0000
0.9807 1.3189 2.0000
1.2522 1.3514 2.0000
1.4420 1.3137 2.0000
1.5824 1.2594 2.0000
1.6590 1.2217 2.0000
1.7300 1.1822 2.0000
1.7636 1.1621 2.0000
1.7992 1.1399 2.0000
1.8149 1.1298 2.0000
Result2 =
0.5403 0.9934 2.0000
0.9807 1.3189 2.0000
1.2522 1.3514 2.0000
1.4420 1.3137 2.0000
1.5824 1.2594 2.0000
1.6590 1.2217 2.0000
1.7300 1.1822 2.0000
1.7636 1.1621 2.0000
1.7992 1.1399 2.0000
1.8149 1.1298 2.0000
Result3 =
0.5403 0.9934 2.0000
0.9807 1.3189 2.0000
1.2522 1.3514 2.0000
1.4420 1.3137 2.0000
1.5824 1.2594 2.0000
1.6590 1.2217 2.0000
1.7300 1.1822 2.0000
1.7636 1.1621 2.0000
1.7992 1.1399 2.0000
1.8149 1.1298 2.0000
Result4 =
0.5403 0.9934 2.0000
0.9807 1.3189 2.0000
1.2522 1.3514 2.0000
1.4420 1.3137 2.0000
1.5824 1.2594 2.0000
1.6590 1.2217 2.0000
1.7300 1.1822 2.0000
1.7636 1.1621 2.0000
1.7992 1.1399 2.0000
1.8149 1.1298 2.0000
Result5 =
5.8220 3.7946 -1.3961 20.0000
5.5474 4.0874 -1.3812 20.0000
5.5973 4.0344 -1.3859 20.0000
5.5888 4.0483 -1.3851 20.0000
5.5888 4.0489 -1.3714 2.0000
5.5888 4.0489 -1.3713 2.0000
5.5888 4.0489 -1.3713 2.0000
5.5888 4.0489 -1.3712 1.0000
5.5888 4.0489 -1.3712 2.0000
5.5888 4.0489 -1.3713 1.0000
Result6 =
5.3339 4.8149 2.1037 20.0000
5.0730 5.0229 1.8003 20.0000
5.0697 5.0263 1.7341 20.0000
5.0700 5.0276 1.7193 20.0000
5.0687 5.0292 1.7224 20.0000
5.0684 5.0296 1.7232 20.0000
5.0683 5.0296 1.7234 20.0000
5.0683 5.0296 1.7234 20.0000
5.0683 5.0297 1.7234 20.0000
5.0683 5.0297 1.7234 20.0000
Result7 =
5.8220 3.7946 -1.3961 20.0000
5.5928 4.0375 -1.4193 11.0000
5.5939 4.0345 -1.4312 3.0000
5.5936 4.0352 -1.4289 3.0000
5.5946 4.0347 -1.4252 2.0000
5.5938 4.0356 -1.4251 2.0000
5.5930 4.0364 -1.4257 1.0000
5.5922 4.0372 -1.4264 1.0000
5.5926 4.0367 -1.4264 2.0000
5.5934 4.0357 -1.4260 1.0000
Result8 =
5.3339 4.8149 2.1037 20.0000
5.0388 4.9887 1.3831 20.0000
5.0226 4.9892 1.1042 20.0000
5.0137 4.9870 1.0052 6.0000
5.0136 4.9869 1.0038 2.0000
5.0134 4.9867 1.0006 2.0000
5.0131 4.9865 0.9971 2.0000
5.0828 4.9136 0.9763 15.0000
5.0596 4.9375 0.9803 2.0000
5.0044 4.9959 1.0022 3.0000
Copyright
Copyright (c) 09-Mar-2014 by George Papazafeiropoulos
- First Lieutenant, Infrastructure Engineer, Hellenic Air Force
- Civil Engineer, M.Sc., Ph.D. candidate, NTUA
- Email: gpapazafeiropoulos@yahoo.gr
- Website: http://users.ntua.gr/gpapazaf/