<?xml version="1.0" encoding="iso-8859-1"?>
<!-- tenseg/book/chap3.xml  A Practical Guide to Tensegrity Design
     Copyright 2004-2008 Robert William Burkhardt, Jr. -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" 
          "http://www.w3.org/TR/MathML2/dtd/xhtml-math11-f.dtd"
          [<!ENTITY mathml "http://www.w3.org/1998/Math/MathML">]>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/xhtml; charset=iso-8859-1"/>
<meta name="keywords"
      content="tensegrity, treatise, how-to, primer, thesis,
               mathematical programming, general, conjugate-direction,
               solution, solve"/>
<meta name="description"
      content="Outline of an approach to the mathematics of designing tensegrity structures."/>
<title>A Practical Guide to Tensegrity Design:
3&nbsp;General Tensegrity Structures</title>
<link rel="stylesheet" type="text/css" href="tenseg.css"/>
</head>

<body>
<p class="link">
A Practical Guide to Tensegrity Design<br/>
<a href="index.html#chap3">Table of Contents</a><br/>
2&nbsp;<a href="chap2_1.html">Basic Tensegrity Structures</a>
</p>

<p class="chapter-header">
Chapter 3
<br/><br/>

General Tensegrity Structures
</p>

<p class="section-header-level1" id="general">
3.1&nbsp;General Programming Problem
</p>

<p class="section-header-level2" id="general_intro">
3.1.1&nbsp;General Programming Problem:  Introduction
</p>

<p>
An inventory of the components of a tensegrity structure can start out
with sub-systems called hubs.  These hubs are the areas in the tensegrity
where members meet and are fastened together.
Members are interactions between pairs of hubs
and can be further classified as either struts
(compression members which keep pairs of hubs apart) or tendons
(tensile members which pull pairs of hubs together).
There may be constraints relating to member lengths,
symmetry and geometrical determinacy.
</p>

<p>
In initial design stages,  it may be easier
to treat the hubs as undifferentiated systems
where members all meet at a point.
This was the strategy used in <a href="chap2_1.html">Chapter&nbsp;2</a>.
In many real applications though, tendons are attached to the hub
at multiple points.  In these cases, the design
either has to formally model the hub as composed of
multiple attachment points or
adopt some <i>ad hoc</i> way of relating the model's geometry
to that of the physical structure.
When the hub is formally modeled as a collection of
separate attachment points, one or more vectors indicate how
these attachment points are positioned with respect to each other and
relative to a single basic point associated with the hub.
Additional constraints are necessary
to determine each vector's length and direction.
</p>

<p>
As <a href="chap2_1.html">Chapter&nbsp;2</a> showed,
an effective tensegrity design strategy involves minimizing or maximizing
the lengths of one set of
members while the other members are constrained to have various fixed
lengths.  So, the general problem is set out as:
</p>

<p class="center">
<math xmlns="&mathml;"><mtable>
<mtr><mtd><mtext>minimize</mtext></mtd>
<mtd>
 <mrow><mi>o</mi><mo>&equiv;</mo>
 <msub><mover><mi>w</mi><mo>&OverBar;</mo></mover><mn>1</mn></msub>
 <mo>&InvisibleTimes;</mo>
 <msubsup><mi>l</mi><mn>1</mn><mn>2</mn></msubsup>
 <mo>+</mo><mo>&sdot;&sdot;&sdot;</mo><mo>+</mo>
 <msub><mover><mi>w</mi><mo>&OverBar;</mo></mover>
 <msub><mi>n</mi><mo>o</mo></msub></msub>
 <mo>&InvisibleTimes;</mo>
 <msubsup><mi>l</mi><msub><mi>n</mi><mo>o</mo></msub><mn>2</mn></msubsup>
 </mrow>
 </mtd></mtr>

 <mtr><mtd><mrow><msub><mi>P</mi><mn>1</mn></msub><mo>,</mo>
 <mo>&hellip;</mo><mo>,</mo><msub><mi>P</mi>
 <msub><mi>n</mi><mo>h</mo></msub></msub><mo>,</mo>
 <msub><mi>V</mi><mn>1</mn></msub><mo>,</mo>
 <mo>&hellip;</mo><mo>,</mo><msub><mi>V</mi>
 <msub><mi>n</mi><mo>v</mo></msub></msub>
 </mrow></mtd></mtr>

 <mtr><mtd></mtd></mtr>

 <mtr><mtd><mtext>subject to</mtext></mtd>
 <mtd><mtext>Member constraints:</mtext></mtd></mtr>
 <mtr><mtd></mtd><mtd><mrow><mo>&plusmn;</mo>
 <msubsup><mover><mi>l</mi><mo>&OverBar;</mo></mover>
 <mrow><msub><mi>n</mi><mo>o</mo></msub><mo>+</mo><mn>1</mn></mrow>
 <mn>2</mn></msubsup>
 <mo>&ge;</mo>
 <mo>&plusmn;</mo><msubsup><mi>l</mi>
 <mrow><msub><mi>n</mi><mo>o</mo></msub><mo>+</mo><mn>1</mn></mrow>
 <mn>2</mn></msubsup>
 </mrow></mtd></mtr>
 <mtr><mtd></mtd><mtd><mo>&sdot;&sdot;&sdot;</mo></mtd></mtr>
 <mtr><mtd></mtd><mtd><mrow><mo>&plusmn;</mo>
 <msubsup><mover><mi>l</mi><mo>&OverBar;</mo></mover>
 <msub><mi>n</mi><mo>m</mo></msub><mn>2</mn></msubsup>
 <mo>&ge;</mo>
 <mo>&plusmn;</mo><msubsup><mi>l</mi>
 <msub><mi>n</mi><mo>m</mo></msub><mn>2</mn></msubsup>
 </mrow></mtd></mtr>

 <mtr><mtd></mtd><mtd><mtext>Symmetry constraints:</mtext></mtd></mtr>
 <mtr><mtd></mtd><mtd><mrow>
 <msub><mover><mo>s</mo><mo>&OverBar;</mo></mover><mn>1</mn></msub>
 <mo>=</mo>
 <msub><mo>s</mo><mn>1</mn></msub>
 <mfenced><mo>&sdot;&sdot;&sdot;</mo></mfenced></mrow></mtd></mtr>
 <mtr><mtd></mtd><mtd><mo>&sdot;&sdot;&sdot;</mo></mtd></mtr>
 <mtr><mtd></mtd><mtd><mrow>
 <msub><mover><mo>s</mo><mo>&OverBar;</mo></mover>
 <msub><mi>n</mi><mo>s</mo></msub></msub><mo>=</mo>
 <msub><mo>s</mo><msub><mi>n</mi><mo>s</mo></msub></msub>
 <mfenced><mo>&sdot;&sdot;&sdot;</mo></mfenced></mrow></mtd></mtr>

 <mtr><mtd></mtd><mtd><mtext>Point constraints:</mtext></mtd></mtr>
 <mtr><mtd></mtd><mtd><mrow>
 <msub><mover><mo>d</mo><mo>&OverBar;</mo></mover><mn>1</mn></msub><mo>=</mo>
 <msub><mover><mi>W</mi><mo>&OverBar;</mo></mover><mn>1</mn></msub>
 <mo>&sdot;</mo><msub><mi>P</mi><msub><mi>d</mi><mn>1</mn></msub></msub>
 </mrow></mtd></mtr>
 <mtr><mtd></mtd><mtd><mo>&sdot;&sdot;&sdot;</mo></mtd></mtr>
 <mtr><mtd></mtd><mtd><mrow>
 <msub><mover><mo>d</mo><mo>&OverBar;</mo></mover>
 <msub><mi>n</mi><mo>d</mo></msub></msub><mo>=</mo>
 <msub><mover><mi>W</mi><mo>&OverBar;</mo></mover><msub><mi>n</mi><mo>d</mo>
 </msub></msub>
 <mo>&sdot;</mo>
 <msub><mi>P</mi><msub><mo>d</mo><msub><mi>n</mi><mo>d</mo>
 </msub></msub></msub>
 </mrow></mtd></mtr>

 <mtr><mtd></mtd><mtd><mtext>Vector constraints:</mtext></mtd></mtr>
 <mtr><mtd></mtd><mtd><mrow>
 <msub><mover><mo>c</mo><mo>&OverBar;</mo></mover><mn>1</mn></msub><mo>=</mo>
 <msub><mo>c</mo><mn>1</mn></msub>
 <mfenced><mo>&sdot;&sdot;&sdot;</mo></mfenced></mrow></mtd></mtr>
 <mtr><mtd></mtd><mtd><mo>&sdot;&sdot;&sdot;</mo></mtd></mtr>
 <mtr><mtd></mtd><mtd><mrow>
 <msub><mover><mo>c</mo><mo>&OverBar;</mo></mover>
 <msub><mi>n</mi><mo>c</mo></msub></msub><mo>=</mo>
 <msub><mo>c</mo><msub><mi>n</mi><mo>c</mo></msub></msub>
 <mfenced><mo>&sdot;&sdot;&sdot;</mo></mfenced></mrow></mtd></mtr>
</mtable>
</math>
</p>

<p>
where:
</p>

<table class="center"><tr><td>
<math xmlns="&mathml;"><mrow><msub><mi>n</mi><mo>h</mo></msub><mo>=</mo>
<mtext>number of hubs</mtext>
<mo>=</mo><mtext>number of basic points</mtext></mrow></math><br/>
<math xmlns="&mathml;"><mrow><msub><mi>n</mi><mo>v</mo></msub><mo>=</mo>
<mtext>number of vectors</mtext></mrow></math><br/>
<math xmlns="&mathml;"><mrow><msub><mi>n</mi><mo>o</mo></msub><mo>=</mo>
<mtext>number of members in the objective function</mtext></mrow></math><br/>
<math xmlns="&mathml;"><mrow><msub><mi>n</mi><mo>m</mo></msub><mo>=</mo>
<mtext>number of members in the model</mtext></mrow></math><br/>
<math xmlns="&mathml;"><mrow>
<msub><mi>n</mi><mover><mo>o</mo><mo>~</mo></mover></msub><mo>=</mo>
<msub><mi>n</mi><mo>m</mo></msub><mo>-</mo><msub><mi>n</mi><mo>o</mo></msub>
<mo>=</mo><mtext>number of constrained members</mtext>
</mrow></math><br/>
<math xmlns="&mathml;"><mrow><msub><mi>n</mi><mo>s</mo></msub><mo>=</mo>
<mtext>number of symmetry constraints</mtext></mrow></math><br/>
<math xmlns="&mathml;"><mrow><msub><mi>n</mi><mo>d</mo></msub><mo>=</mo>
<mtext>number of point constraints</mtext></mrow></math><br/>
<math xmlns="&mathml;"><mrow><msub><mi>n</mi><mo>c</mo></msub><mo>=</mo>
<mtext>number of vector constraints</mtext></mrow></math>
</td></tr></table>

<p>
The expression
<math xmlns="&mathml;"><mrow><msub><mi>P</mi><mn>1</mn></msub><mo>,</mo>
 <mo>&hellip;</mo><mo>,</mo><msub><mi>P</mi>
 <msub><mi>n</mi><mo>h</mo></msub></msub><mo>,</mo>
 <msub><mi>V</mi><mn>1</mn></msub><mo>,</mo>
 <mo>&hellip;</mo><mo>,</mo><msub><mi>V</mi>
 <msub><mi>n</mi><mo>v</mo></msub></msub>
</mrow></math>
appearing under "minimize" indicates
that the coordinate values of the basic points and vectors
are the control variables of the minimization
problem.  These are the values which are changed (in accordance with
the constraints) to find a minimum value for
<math xmlns="&mathml;"><mi>o</mi></math>.
</p>

<p>
In the objective function,
<math xmlns="&mathml;">
<msub><mover><mi>w</mi><mo>&OverBar;</mo></mover>
<msub><mi>i</mi><mo>o</mo></msub></msub></math>
is a positive constant value if the corresponding member is a tendon
and negative if the member is a strut where
<math xmlns="&mathml;"><mrow>
<msub><mi>i</mi><mo>o</mo></msub><mo>&isin;</mo>
<mfenced open="{" close="}"><mn>1</mn><mi>&hellip;</mi>
<msub><mi>n</mi><mo>o</mo></msub></mfenced></mrow></math>.
</p>

<p>
In the objective function and member constraints,
<math xmlns="&mathml;">
<msub><mi>l</mi><msub><mi>i</mi><mo>m</mo></msub></msub></math>
stands for the length of member
<math xmlns="&mathml;"><msub><mi>i</mi><mo>m</mo></msub></math>
where
<math xmlns="&mathml;"><mrow>
<msub><mi>i</mi><mo>m</mo></msub><mo>&isin;</mo>
<mfenced open="{" close="}"><mn>1</mn><mi>&hellip;</mi>
<msub><mi>n</mi><mo>m</mo></msub></mfenced></mrow></math>.
</p>

<p>
In the member constraints,
<math xmlns="&mathml;"><msub><mover><mi>l</mi><mo>&OverBar;</mo></mover>
<msub><mi>i</mi><mover><mo>o</mo><mo>~</mo></mover></msub></msub></math>
is a positive constant value.
"+" precedes
<math xmlns="&mathml;"><msubsup><mover><mi>l</mi><mo>&OverBar;</mo></mover>
<msub><mi>i</mi><mover><mo>o</mo><mo>~</mo></mover></msub>
<mn>2</mn></msubsup></math>
and
<math xmlns="&mathml;"><msubsup><mi>l</mi>
<msub><mi>i</mi><mover><mo>o</mo><mo>~</mo></mover></msub>
<mn>2</mn></msubsup></math>
if the corresponding member
is a tendon, and "-" precedes them if the member is a strut where
<math xmlns="&mathml;"><mrow>
<msub><mi>i</mi><mover><mo>o</mo><mo>~</mo></mover></msub>
<mo>&isin;</mo>
<mfenced open="{" close="}">
<mrow><msub><mi>n</mi><mo>o</mo></msub><mo>+</mo><mn>1</mn></mrow>
<mi>&hellip;</mi>
<msub><mi>n</mi><mo>m</mo></msub>
</mfenced></mrow></math>.
</p>

<p>
In the other constraints,
<math xmlns="&mathml;"><mrow>
<msub><mo>s</mo><msub><mi>i</mi><mo>s</mo></msub></msub>
<mfenced><mo>&sdot;&sdot;&sdot;</mo></mfenced></mrow></math> and
<math xmlns="&mathml;"><mrow>
<msub><mo>c</mo><msub><mi>i</mi><mo>c</mo></msub></msub>
<mfenced><mo>&sdot;&sdot;&sdot;</mo></mfenced></mrow></math>
are functions of the coordinate values, and
<math xmlns="&mathml;">
<msub><mover><mo>s</mo><mo>&OverBar;</mo></mover>
<msub><mi>i</mi><mo>s</mo></msub></msub>
</math>,
<math xmlns="&mathml;">
<msub><mover><mo>d</mo><mo>&OverBar;</mo></mover>
<msub><mi>i</mi><mo>d</mo></msub></msub>
</math>
and
<math xmlns="&mathml;">
<msub><mover><mo>c</mo><mo>&OverBar;</mo></mover>
<msub><mi>i</mi><mo>c</mo></msub></msub>
</math>
are constant values where
<math xmlns="&mathml;"><mrow>
<msub><mi>i</mi><mo>s</mo></msub><mo>&isin;</mo>
<mfenced open="{" close="}"><mn>1</mn><mi>&hellip;</mi>
<msub><mi>n</mi><mo>s</mo></msub></mfenced></mrow></math>,

<math xmlns="&mathml;"><mrow>
<msub><mi>i</mi><mo>d</mo></msub><mo>&isin;</mo>
<mfenced open="{" close="}"><mn>1</mn><mi>&hellip;</mi>
<msub><mi>n</mi><mo>d</mo></msub></mfenced></mrow></math>
and
<math xmlns="&mathml;"><mrow>
<msub><mi>i</mi><mo>c</mo></msub><mo>&isin;</mo>
<mfenced open="{" close="}"><mn>1</mn><mi>&hellip;</mi>
<msub><mi>n</mi><mo>c</mo></msub></mfenced></mrow></math>.
</p>

<p>
In the point constraints,
<math xmlns="&mathml;"><msub>
<mover><mi>W</mi><mo>&OverBar;</mo></mover>
<msub><mi>i</mi><mo>d</mo></msub>
</msub></math>
is a triplet of fixed values which is applied to
<math xmlns="&mathml;">
<msub><mi>P</mi><msub><mi>d</mi><msub><mi>i</mi><mo>d</mo>
</msub></msub></msub></math>
using a dot product where for any value of
<math xmlns="&mathml;"><msub><mi>i</mi><mo>d</mo></msub></math>,
<math xmlns="&mathml;"><mrow>
<msub><mi>d</mi><msub><mi>i</mi><mo>d</mo></msub></msub>
<mo>&isin;</mo>
<mfenced open="{" close="}"><mn>1</mn><mi>&hellip;</mi>
<msub><mi>n</mi><mo>h</mo></msub></mfenced></mrow></math>.
</p>

<p>
So, the examination of this problem is divided into five
sections:  the objective function, the member constraints,
the symmetry constraints, the point constraints and the vector
constraints.
</p>

<p class="section-header-level2" id="general_objective">
3.1.2&nbsp;General Programming Problem:  Objective Function
</p>

<p>
In the basic tensegrity structures of
<a href="chap2_1.html">Chapter&nbsp;2</a>, the
objective functions consisted of the second power of the length
of one member.  If this member was a tendon, the quantity was
minimized.  If this member was a strut, the quantity was
maximized.  For these simple structures, including just one instance of
a <b>symmetrical</b> class of members in the
objective function worked fine, but, for
more complex structures, this procedure
leads to a lopsided structure having one tendon much shorter
than its comparable companions.  So, in complex structures,
the lengths of several instances of <b>non-symmetrical</b> classes of
members are minimized (for tendons) or maximized (for struts).
</p>

<p>
How can this be done?  A mathematical programming problem can't
have more than one objective function; so, a
different objective function for the length of each non-symmetrical instance
is not a possibility.  What can be done is
minimize a <b>weighted sum of the second powers</b> of these lengths.
Positive weights are used for tendon lengths.
If a strut is included in the objective function, it is included
with a negative weight since minimizing the additive inverse of a
quantity is the same as maximizing the quantity.    This approach
results in a valid tensegrity since, in the final solution, each
of the member lengths is minimized (for tendons)
or maximized (for struts) with respect to the others.  If
this weren't the case, the length of one member could be reduced
(for a tendon) or increased (for a strut)
while maintaining the lengths of the others.  This would result
in a weighted sum less than the
minimum which cannot be if the problem was solved correctly.  So,
the general form for the objective function is:
</p>

<p class="center">
<math xmlns="&mathml;">
 <mrow><mi>o</mi><mo>&equiv;</mo>
 <msub><mover><mi>w</mi><mo>&OverBar;</mo></mover><mn>1</mn></msub>
 <mo>&InvisibleTimes;</mo>
 <msubsup><mi>l</mi><mn>1</mn><mn>2</mn></msubsup>
 <mo>+</mo><mo>&sdot;&sdot;&sdot;</mo><mo>+</mo>
 <msub><mover><mi>w</mi><mo>&OverBar;</mo></mover>
 <msub><mi>n</mi><mo>o</mo></msub></msub>
 <mo>&InvisibleTimes;</mo>
 <msubsup><mi>l</mi><msub><mi>n</mi><mo>o</mo></msub><mn>2</mn></msubsup>
 </mrow>
</math>
</p>

<p>
Besides allowing tendons to be minimized and struts to be maximized
in the same objective function, the weights give the designer control
over the relative lengths of the members which appear in the objective
function.  The weights can be chosen as desired subject only to the
requirement that the weight for a tendon must be positive
(since tendon lengths are <b>minimized</b>) and the weight for a strut
must be negative (since strut lengths are <b>maximized</b>).
In <a href="chap7_2.xml#subsec_wtgen">Section&nbsp;7.2.6</a>
it is shown that any valid tensegrity
configuration can be viewed as the solution to a mathematical
programming problem of this form with an appropriate selection of weights.
This fact gives this weighted-sum approach complete generality
as a tool for tensegrity design.
</p>

<p class="section-header-level2" id="general_constraints_members">
3.1.3&nbsp;General Programming Problem:  Member Constraints
</p>

<p>
The member lengths which don't appear in the objective function
appear in the constraints.  The constraint function
is the second power of member length in the case of a tendon and
minus the second power of length in the case of a strut.  This
value is constrained to be <b>less than</b> or <b>equal to</b>
<math xmlns="&mathml;"><mrow>
<mo>&plusmn;</mo>
<msubsup><mover><mi>l</mi><mo>&OverBar;</mo></mover>
<msub><mi>i</mi><mover><mo>o</mo><mo>~</mo></mover></msub>
<mn>2</mn></msubsup>
</mrow></math>
where again the member type determines the sign used.
</p>

<p>
In the general
model, these constraints are inequalities since
tendons are members which can pull points together but can't push
them apart, and struts are members which can push
points apart but can't pull points together.  Practically, the
strut may be made of materials which are capable of sustaining a
very substantial tensile load (though certainly the struts may be
fabricated so they can stand no tensile load at all), but in a
final design, they should not be sustaining such a load since
they are not designed for this.  So, even for struts, an
inequality is called for in the constraints.
</p>

<p>
Since, for uniformity, the
equations are organized so that the constrained value is
always less than or equal to some fixed value,
the second power of strut lengths and the corresponding
<math xmlns="&mathml;"><msubsup><mover><mi>l</mi><mo>&OverBar;</mo></mover>
<msub><mi>i</mi><mover><mo>o</mo><mo>~</mo></mover></msub>
<mn>2</mn></msubsup></math> constants
are negated in the strut constraint equations.
In practice (see <a href="#solve">Section&nbsp;3.2</a>),
all the constraints are treated as equalities.
</p>

<p class="section-header-level2" id="general_constraints_symmetry">
3.1.4&nbsp;General Programming Problem:  Symmetry Constraints
</p>

<p>
In the simple tensegrities examined in
<a href="chap2_1.html">Chapter&nbsp;2</a>,
symmetry constraints are mentioned, but are dealt with implicitly
by making geometrical assumptions
(Sections <a href="chap2_2.xml#tprism_math_cyl">2.2.2</a> and
<a href="chap2_4.xml">2.4</a>) or
in the mathematical programming problems by doing substitutions
(Sections <a href="chap2_2.xml#tprism_math_car">2.2.3</a> and
<a href="chap2_3.xml">2.3</a>).
In the latter case,
the simplicity of the symmetry transformations and the coordinate
systems used allows the coordinates of one
point to be expressed as a simple signed permutation
of the coordinates of another point.
</p>

<p>
In the general problem,
the geometry is fairly general and implements no assumptions about
symmetry.  In addition, the very real
possibility exists that some symmetry constraints cannot be
accounted for by simple coordinate substitutions since,
in general, a symmetry-transformed coordinate
is a linear combination of all three coordinates of another
point.  However, for most of the models discussed in this book,
though some of them are rather complex, the
symmetry constraints are of the simpler type so that they
do not appear in the programming problem explicitly, but
only appear implicitly as signed coordinate permutations.
This is because most of the models have octahedral symmetries.  When
other symmetries are used, for example the icosahedral symmetry
of the model discussed in
<a href="chap5_4.xml#laminar_hextri">Section&nbsp;5.4</a>,
symmetry constraints may need to be introduced
explicitly.  This introduction creates no real mathematical problems
other than slowing down the computations due to the larger system.
</p>

<p>
<math xmlns="&mathml;">
<msub><mover><mo>s</mo><mo>&OverBar;</mo></mover>
<msub><mi>i</mi><mo>s</mo></msub></msub>
</math>
is always 0, but it is convenient to keep the label for
symbolic manipulations later.
</p>

<p class="section-header-level2" id="general_constraints_determinacy">
3.1.5&nbsp;General Programming Problem:  Point Constraints
</p>

<p>
This type of constraint appeared explicitly as the last two
constraints in the Cartesian-coordinate model for the t-prism in
<a href="chap2_2.xml#tprism_math_car">Section&nbsp;2.2.3</a>.
It appeared implicitly in the cylindrical-coordinate
model of the t-prism in
<a href="chap2_2.xml#tprism_math_cyl">Section&nbsp;2.2.2</a>
where the <math xmlns="&mathml;"><mi>z</mi></math> coordinates of points
<math xmlns="&mathml;"><mi>A</mi></math>,
<math xmlns="&mathml;"><mi>B</mi></math> and
<math xmlns="&mathml;"><mi>C</mi></math> were fixed at 0.
In general, for cylindrical (e.g.&nbsp;masts) or truncated (e.g.&nbsp;domes)
structures point constraints need to be introduced
to make the mathematical model of the structure determinant.
For structures with spherical symmetries, the member, symmetry and
vector constraints are sufficient for determining the structure.
</p>

<p>
Point constraints are linear equalities
restricting a point to lie in a specific plane.
In Cartesian coordinates, the format of a point constraint is
a dot product of a point with a triplet of fixed values.
The dot product is constrained to be a particular value.
The triplet of fixed values is referred to here as the
determining vector of the point constraint, and
the point lies in a plane orthogonal to this vector when it
conforms to the constraint.
Point constraints don't seem to be necessary when using
conjugate-direction methods to solve a mathematical programming problem,
but can be necessary when using Newton's method to improve a solution's
accuracy.
</p>

<p class="section-header-level2" id="subsec_vec_constraints">
3.1.6&nbsp;General Programming Problem:  Vector Constraints
</p>

<p>
Vector constraints fill in the details about
the geometry of complex hubs.
The use of these constraints, and the list of vectors they affect,
<math xmlns="&mathml;"><mrow>
<msub><mi>V</mi><mn>1</mn></msub><mo>,</mo>
<mo>&hellip;</mo><mo>,</mo><msub><mi>V</mi>
<msub><mi>n</mi><mo>v</mo></msub></msub>
</mrow></math>,
represents a move away from the
initial gross analysis of a tensegrity structure, where the details
of strut-tendon connections are omitted for simplicity's sake,
to a more detailed analysis of the structure, where the struts and
tendons are no longer assumed to meet at a point.
This includes situations where a tendon
is attached to a point away from the ends of the strut,
i.e. between the ends somewhere, or
off the centerline of the strut, or both.
A vector is a difference between two points and is necessary to
model the offset from the strut end point to the point
where the tendon is attached.
</p>

<p>
In general, the tendon attachment points are still clustered
in two areas on the strut in proximity to the locations
which were modeled as simple strut end points in the gross analysis.
Each cluster of points is defined with respect to the basic
point which corresponds to the hub they represent, or in some
cases they are defined with respect to a convex combination
of the basic points corresponding to the two hubs a strut connects.
Especially in the latter case,
the center of the hub does not necessarily coincide with the
location of the corresponding basic point.
</p>

<p>
As an example of what vector constraints are like,
consider the case where, instead
of assuming the tendon is connected on the center line of the strut,
it is more realistically assumed that the tendon connects to the
surface of the strut and thus the attachment point falls off the
center line of the strut.  For this example, the strut is assumed
to be a simple cylinder.
</p>

<p>
The first step is to introduce
a single vector which represents the offset to the tendon attachment point
from a reference point lying on the center line of the strut.
This reference point may be one of the basic points corresponding to the two
hubs the strut connects or perhaps a point on a line through the basic
points of those two hubs.
A vector constraint is then introduced which indicates how far from the
reference point the tendon is to be connected.
In this case, that distance would correspond to the radius of the strut.
This constraint would restrict the tendon's attachment point to lie on a
sphere about the point.  A second constraint is then introduced to
restrict the vector to be orthogonal to the center line of the strut.
The attachment point is thus constrained to lie on a plane
through the reference point and
orthogonal to the strut's center line.  This second constraint makes sure
the tendon is attached to the surface of the
strut rather than at an interior point.
</p>

<p>
An example using vector constraints appears in
<a href="chap7_3.xml#stress_another_sample">Section&nbsp;7.3.6</a>.
</p>

<p class="section-header-level1" id="solve">
3.2&nbsp;Solving the Problem
</p>

<p>
In this section, two methods for solving this general problem
are described.
The problem can be characterized as a mathematical programming
problem in which both the objective function and the constraints
are non-linear in the control variables.  The constraint region is
not convex<sup><a href="#tx1" id="rf1">1</a></sup>,
so the simpler algorithms admissible in that case cannot
be used.  The non-linearity of the objective functions and constraints
is a simple one.  They are both quadratic in the control variables.
This simplifies taking their derivatives.
</p>

<p>
To make the problem more tractable, it is reformulated as a
mathematical programming problem where the member constraints
are met with equality rather than inequalities.  This reformulation
facilitates a further reformulation where the constrainted
problem is restated as an unconstrained problem.  Once the
problem is stated as an unconstrained problem, there are widely-available
techniques which can be applied to its solution.
</p>

<p>
The assumption that the member constraints
hold with equality is fairly innocuous.
The final solution must be checked however to
make sure tendons and struts have appropriate member forces.
An inappropriate member force for one of the constrained members,
a tendon in compression or a strut in tension, means that particular
constraint is not effective for the solution in question and
should be removed from the problem, or the parameters of the
problem should be altered so the constraint is effective.
</p>

<p>
The easiest way of reformulating a mathematical programming problem
with equality constraints as an unconstrained problem is to use
penalty<sup><a href="#tx2" id="rf2">2</a></sup>
methods.
In the penalty formulation,
the constraints are recast as deviations from zero
and the sum of the second powers of these deviations
is incorporated into the the objective function
with a large positive coefficient.  This formulation is especially
useful in the initial stages of solving a tensegrity mathematical
programming problem since it
easily handles large deviations from the constraint requirements.
This allows the initial coordinate values to be very rough approximations
to the constraint requirements and eases the process of formulating
the initial values.
</p>

<p>
Reformulated in penalty terms, the general tensegrity programming
problem becomes:
</p>

<p class="center">
<math xmlns="&mathml;"><mtable>
<mtr><mtd><mtext>minimize</mtext></mtd>
<mtd>
 <mrow>
 <msub><mover><mi>w</mi><mo>&OverBar;</mo></mover><mn>1</mn></msub>
 <mo>&InvisibleTimes;</mo>
 <msubsup><mi>l</mi><mn>1</mn><mn>2</mn></msubsup>
 <mo>+</mo><mo>&sdot;&sdot;&sdot;</mo><mo>+</mo>
 <msub><mover><mi>w</mi><mo>&OverBar;</mo></mover>
 <msub><mi>n</mi><mo>o</mo></msub></msub>
 <mo>&InvisibleTimes;</mo>
 <msubsup><mi>l</mi><msub><mi>n</mi><mo>o</mo></msub><mn>2</mn></msubsup>
 <mo>+</mo>
 </mrow></mtd></mtr>

 <mtr><mtd><mrow><msub><mi>P</mi><mn>1</mn></msub><mo>,</mo>
 <mo>&hellip;</mo><mo>,</mo><msub><mi>P</mi>
 <msub><mi>n</mi><mo>h</mo></msub></msub><mo>,</mo>
 <msub><mi>V</mi><mn>1</mn></msub><mo>,</mo>
 <mo>&hellip;</mo><mo>,</mo><msub><mi>V</mi>
 <msub><mi>n</mi><mo>v</mo></msub></msub>
 </mrow></mtd>

 <mtd><mrow>
 <mover><mi>&mu;</mi><mo>&OverBar;</mo></mover><mo>&InvisibleTimes;</mo>
 <msup><mfenced><mrow>
 <msubsup><mover><mi>l</mi><mo>&OverBar;</mo></mover>
 <mrow><msub><mi>n</mi><mo>o</mo></msub><mo>+</mo><mn>1</mn></mrow>
 <mn>2</mn></msubsup>
 <mo>-</mo>
 <msubsup><mi>l</mi>
 <mrow><msub><mi>n</mi><mo>o</mo></msub><mo>+</mo><mn>1</mn></mrow>
 <mn>2</mn></msubsup>
 </mrow></mfenced><mn>2</mn></msup>
 <mo>+</mo><mo>&sdot;&sdot;&sdot;</mo><mo>+</mo>
 <mover><mi>&mu;</mi><mo>&OverBar;</mo></mover><mo>&InvisibleTimes;</mo>
 <msup><mfenced><mrow><msubsup><mover><mi>l</mi><mo>&OverBar;</mo></mover>
 <msub><mi>n</mi><mo>m</mo></msub><mn>2</mn></msubsup>
 <mo>-</mo>
 <msubsup><mi>l</mi>
 <msub><mi>n</mi><mo>m</mo></msub><mn>2</mn></msubsup>
 </mrow></mfenced><mn>2</mn></msup>
 <mo>+</mo>
 </mrow></mtd></mtr>

 <mtr><mtd></mtd><mtd><mrow>
 <mover><mi>&mu;</mi><mo>&OverBar;</mo></mover><mo>&InvisibleTimes;</mo>
 <msup><mfenced><mrow>
 <msub><mover><mo>s</mo><mo>&OverBar;</mo></mover><mn>1</mn></msub>
 <mo>-</mo>
 <msub><mo>s</mo><mn>1</mn></msub>
 <mfenced><mo>&sdot;&sdot;&sdot;</mo></mfenced>
 </mrow></mfenced><mn>2</mn></msup>

 <mo>+</mo><mo>&sdot;&sdot;&sdot;</mo><mo>+</mo>
 <mover><mi>&mu;</mi><mo>&OverBar;</mo></mover><mo>&InvisibleTimes;</mo>
 <msup><mfenced><mrow>
 <msub><mover><mo>s</mo><mo>&OverBar;</mo></mover>
 <msub><mi>n</mi><mo>s</mo></msub></msub><mo>-</mo>
 <msub><mo>s</mo><msub><mi>n</mi><mo>s</mo></msub></msub>
 <mfenced><mo>&sdot;&sdot;&sdot;</mo></mfenced>
 </mrow></mfenced><mn>2</mn></msup>
 <mo>+</mo>
 </mrow></mtd></mtr>

 <mtr><mtd></mtd><mtd><mrow>
 <mover><mi>&mu;</mi><mo>&OverBar;</mo></mover><mo>&InvisibleTimes;</mo>
 <msup><mfenced><mrow>
 <msub><mover><mo>d</mo><mo>&OverBar;</mo></mover><mn>1</mn></msub><mo>-</mo>
 <msub><mover><mi>W</mi><mo>&OverBar;</mo></mover><mn>1</mn></msub>
 <mo>&sdot;</mo><msub><mi>P</mi><msub><mi>d</mi><mn>1</mn></msub></msub>
 </mrow></mfenced><mn>2</mn></msup>
 <mo>+</mo><mo>&sdot;&sdot;&sdot;</mo><mo>+</mo>
 <mover><mi>&mu;</mi><mo>&OverBar;</mo></mover><mo>&InvisibleTimes;</mo>
 <msup><mfenced><mrow>
 <msub><mover><mo>d</mo><mo>&OverBar;</mo></mover>
 <msub><mi>n</mi><mo>d</mo></msub></msub><mo>-</mo>
 <msub><mover><mi>W</mi><mo>&OverBar;</mo></mover><msub><mi>n</mi><mo>d</mo>
 </msub></msub>
 <mo>&sdot;</mo>
 <msub><mi>P</mi><msub><mo>d</mo><msub><mi>n</mi><mo>d</mo>
 </msub></msub></msub>
 </mrow></mfenced><mn>2</mn></msup>
 <mo>+</mo>
 </mrow></mtd></mtr>

 <mtr><mtd></mtd><mtd><mrow>
 <mover><mi>&mu;</mi><mo>&OverBar;</mo></mover><mo>&InvisibleTimes;</mo>
 <msup><mfenced><mrow>
 <msub><mover><mo>c</mo><mo>&OverBar;</mo></mover><mn>1</mn></msub><mo>-</mo>
 <msub><mo>c</mo><mn>1</mn></msub>
 <mfenced><mo>&sdot;&sdot;&sdot;</mo></mfenced>
 </mrow></mfenced><mn>2</mn></msup>
 <mo>+</mo><mo>&sdot;&sdot;&sdot;</mo>
 <mo>+</mo>
 <mover><mi>&mu;</mi><mo>&OverBar;</mo></mover><mo>&InvisibleTimes;</mo>
 <msup><mfenced><mrow>
 <msub><mover><mo>c</mo><mo>&OverBar;</mo></mover>
 <msub><mi>n</mi><mo>c</mo></msub></msub><mo>-</mo>
 <msub><mo>c</mo><msub><mi>n</mi><mo>c</mo></msub></msub>
 <mfenced><mo>&sdot;&sdot;&sdot;</mo></mfenced>
 </mrow></mfenced><mn>2</mn></msup></mrow></mtd></mtr>
</mtable>
</math>
</p>

<p>
where
<math xmlns="&mathml;"><mover><mi>&mu;</mi><mo>&OverBar;</mo></mover></math>
is a very large positive constant.
</p>

<p>
The second way of reformulating the
tensegrity mathematical programming problem
as an unconstrained problem
is referred to here as the exact formulation.
It uses the constraints to divide the basic point and vector coordinates
into a dependent set and an independent set.
The constraints are then solved
for the values of the dependent set in terms of the
values of the independent set.
The number of coordinates in the dependent set equals
the number of constraint equations.
Once this is done, the programming
problem can then be treated as an unconstrained problem with the
independent coordinate values as the control variables.
Newton's method<sup><a href="#tx3" id="rf3">3</a></sup>
is used to solve constraint system for the values of the dependent
coordinates.  The exact formulation may not be suitable
for the initial stages of solving a problem,
since, if the initial coordinate values
imply large deviations from the constraint requirements,
Newton's method may not converge.
</p>

<p>
Reformulated in exact terms, the general tensegrity programming
problem becomes:
</p>

<p class="center">
<math xmlns="&mathml;"><mtable>
<mtr><mtd><mtext>minimize</mtext></mtd>
<mtd>
 <mrow>
 <msub><mover><mi>w</mi><mo>&OverBar;</mo></mover><mn>1</mn></msub>
 <mo>&InvisibleTimes;</mo>
 <msubsup><mi>l</mi><mn>1</mn><mn>2</mn></msubsup>
 <mo>+</mo><mo>&sdot;&sdot;&sdot;</mo><mo>+</mo>
 <msub><mover><mi>w</mi><mo>&OverBar;</mo></mover>
 <msub><mi>n</mi><mo>o</mo></msub></msub>
 <mo>&InvisibleTimes;</mo>
 <msubsup><mi>l</mi><msub><mi>n</mi><mo>o</mo></msub><mn>2</mn></msubsup>
 <mo>;</mo>
 </mrow></mtd>
 <mtd><mrow><msub><mi>x</mi><mo>d</mo></msub><mo>=</mo>
 <mo>h</mo><mfenced><msub><mi>x</mi><mo>i</mo></msub></mfenced>
 </mrow></mtd>
 </mtr>
 <mtr><mtd><msub><mi>x</mi><mo>i</mo></msub></mtd></mtr>
</mtable>
</math>
</p>

<p>
where <math xmlns="&mathml;"><msub><mi>x</mi><mo>i</mo></msub></math> is a
<math xmlns="&mathml;"><mrow>
<mn>3</mn><mo>&InvisibleTimes;</mo>
<mfenced><mrow>
<msub><mi>n</mi><mi>h</mi></msub><mo>+</mo><msub><mi>n</mi><mi>v</mi></msub>
</mrow></mfenced>
<mo>-</mo>
<mfenced><mrow>
<msub><mi>n</mi><mover><mi>o</mi><mo>~</mo></mover></msub>
<mo>+</mo><msub><mi>n</mi><mi>s</mi></msub>
<mo>+</mo><msub><mi>n</mi><mi>d</mi></msub>
<mo>+</mo><msub><mi>n</mi><mi>c</mi></msub>
</mrow></mfenced>
</mrow>
</math>
column vector and
<math xmlns="&mathml;"><msub><mi>x</mi><mo>d</mo></msub></math> is a
<math xmlns="&mathml;"><mrow>
<msub><mi>n</mi><mover><mi>o</mi><mo>~</mo></mover></msub>
<mo>+</mo><msub><mi>n</mi><mi>s</mi></msub>
<mo>+</mo><msub><mi>n</mi><mi>d</mi></msub>
<mo>+</mo><msub><mi>n</mi><mi>c</mi></msub>
</mrow></math>
column vector which together contain all the
<math xmlns="&mathml;"><mrow>
<mn>3</mn><mo>&InvisibleTimes;</mo>
<mfenced><mrow>
<msub><mi>n</mi><mi>h</mi></msub><mo>+</mo><msub><mi>n</mi><mi>v</mi></msub>
</mrow></mfenced></mrow>
</math>
coordinates of
<math xmlns="&mathml;"><mrow>
 <msub><mi>P</mi><mn>1</mn></msub><mo>,</mo>
 <mo>&hellip;</mo><mo>,</mo><msub><mi>P</mi>
 <msub><mi>n</mi><mo>h</mo></msub></msub><mo>,</mo>
 <msub><mi>V</mi><mn>1</mn></msub><mo>,</mo>
 <mo>&hellip;</mo><mo>,</mo><msub><mi>V</mi>
 <msub><mi>n</mi><mo>v</mo></msub></msub>
</mrow></math>.
The vector-mapping function
<math xmlns="&mathml;"><mrow>
 <mo>h</mo><mfenced><msub><mi>x</mi><mo>i</mo></msub></mfenced>
</mrow></math>
is not determined explicitly.  Its characteristics are determined implicitly
from the constraint equations.
</p>

<p>
Many of the computations involved in solving and analyzing these
two unconstrained mathematical programming problems require
knowledge of the partial derivatives of the member lengths and
non-member constraint equations with respect to the coordinate values.
These partial derivatives can be represented as a matrix
with
<math xmlns="&mathml;"><mrow>
<msub><mi>n</mi><mi>m</mi></msub>
<mo>+</mo><msub><mi>n</mi><mi>s</mi></msub>
<mo>+</mo><msub><mi>n</mi><mi>d</mi></msub>
<mo>+</mo><msub><mi>n</mi><mi>c</mi></msub>
</mrow></math>
rows, one for each member and each non-member constraint equation,
and
<math xmlns="&mathml;"><mrow>
<mn>3</mn><mo>&InvisibleTimes;</mo>
<mfenced><mrow>
<msub><mi>n</mi><mi>h</mi></msub><mo>+</mo><msub><mi>n</mi><mi>v</mi></msub>
</mrow></mfenced></mrow>
</math>
columns, one for each of the coordinates of
<math xmlns="&mathml;"><mrow>
 <msub><mi>P</mi><mn>1</mn></msub><mo>,</mo>
 <mo>&hellip;</mo><mo>,</mo><msub><mi>P</mi>
 <msub><mi>n</mi><mo>h</mo></msub></msub><mo>,</mo>
 <msub><mi>V</mi><mn>1</mn></msub><mo>,</mo>
 <mo>&hellip;</mo><mo>,</mo><msub><mi>V</mi>
 <msub><mi>n</mi><mo>v</mo></msub></msub>
</mrow></math>.
This matrix is referred to as
<math xmlns="&mathml;"><mi>&Psi;</mi></math>.
The element in the <math xmlns="&mathml;"><mi>i</mi><mtext>th</mtext></math>
row and <math xmlns="&mathml;"><mi>j</mi><mtext>th</mtext></math> column
of the matrix represents the partial derivative of the
<math xmlns="&mathml;"><mi>i</mi><mtext>th</mtext></math>
equation with respect to the
<math xmlns="&mathml;"><mi>j</mi><mtext>th</mtext></math>
coordinate.  This element is referred to as
<math xmlns="&mathml;"><msub>
<mi>&psi;</mi><mrow><mi>i</mi><mi>j</mi></mrow>
</msub></math>.
</p>

<p>
Since the member and constraint equations are linear or quadratic
in the coordinate values,
the partial derivatives are constant or linear in the coordinate values.
This means it is easy to compute them using formulas.  It is also
possible to compute the partial derivatives using numerical
techniques; however, this may yield less accurate results.
</p>

<p>
Frequently, submatrices of this matrix are referred to, so it is useful
to partition the matrix.  The matrix is partitioned over its rows
into two submatrices called
<math xmlns="&mathml;"><msup><mi>&Psi;</mi><mo>o</mo></msup></math>
and 
<math xmlns="&mathml;"><msup><mi>&Psi;</mi><mo>c</mo></msup></math>
which represent the partial derivatives of the lengths of
the members in the objective
function and the partials for the constraint equations respectively.
This partitioning can be represented as:
</p>

<table class="center"><tr><td align="center">
<math xmlns="&mathml;"><mrow>
<mi>&Psi;</mi><mo>=</mo>
<mfenced open="[" close="]"><mtable>
<mtr><mtd><msup><mi>&Psi;</mi><mo>o</mo></msup></mtd></mtr>
<mtr><mtd><msup><mi>&Psi;</mi><mo>c</mo></msup></mtd></mtr>
</mtable></mfenced>
</mrow></math>
</td></tr></table>

<p>
When the exact formulation is being used, the matrix is partitioned over
its columns into two submatrices
<math xmlns="&mathml;"><msup><mi>&Psi;</mi><mo>d</mo></msup></math>
and 
<math xmlns="&mathml;"><msup><mi>&Psi;</mi><mo>i</mo></msup></math>
which represent the coordinates classified as dependent and
independent respectively.  This partitioning can be
represented as:
</p>

<table class="center"><tr><td align="center">
<math xmlns="&mathml;"><mrow>
<mi>&Psi;</mi><mo>=</mo>
<mfenced open="[" close="]"><mtable>
<mtr><mtd><msup><mi>&Psi;</mi><mo>d</mo></msup></mtd>
<mtd><msup><mi>&Psi;</mi><mo>i</mo></msup></mtd></mtr>
</mtable></mfenced>
</mrow></math>
</td></tr></table>

<p>
For this representation to make sense, the columns of
<math xmlns="&mathml;"><mi>&Psi;</mi></math>
must have been rearranged so all the columns corresponding
to the dependent coordinates are on the left and
all the columns corresponding
to the independent coordinates are on the right.
When the columns have been rearranged,
<math xmlns="&mathml;"><msub>
<mi>&psi;</mi><mrow><mi>i</mi><mi>j</mi></mrow>
</msub></math>
continues to refer to the same partial it did before
the columns were rearranged.  For example, the
partial
<math xmlns="&mathml;"><msub>
<mi>&psi;</mi><mrow><mi>7</mi><mo>,</mo><mi>5</mi></mrow>
</msub></math>
may refer to a partial in the second column of the matrix
rather than the fifth column as it did before the rearrangement
of the columns.
</p>

<p>
Both of these partitionings can be combined to get the following
representation:
</p>

<table class="center"><tr><td align="center">
<math xmlns="&mathml;"><mrow>
<mi>&Psi;</mi><mo>=</mo>
<mfenced open="[" close="]"><mtable>
<mtr><mtd><msup><mi>&Psi;</mi>
<mrow><mo>o</mo><mo>&cap;</mo><mo>d</mo></mrow></msup></mtd>
<mtd><msup><mi>&Psi;</mi>
<mrow><mo>o</mo><mo>&cap;</mo><mo>i</mo></mrow></msup></mtd></mtr>
<mtr><mtd><msup><mi>&Psi;</mi>
<mrow><mo>c</mo><mo>&cap;</mo><mo>d</mo></mrow></msup></mtd>
<mtd><msup><mi>&Psi;</mi>
<mrow><mo>c</mo><mo>&cap;</mo><mo>i</mo></mrow></msup></mtd></mtr>
</mtable></mfenced>
</mrow></math>
</td></tr></table>

<p>
For the exact formulation to work,
a method for reliably dividing the coordinates into
a dependent and an
independent set must be found since not every partitioning results
in a solvable system.  For the system to be solvable, the
square
<math xmlns="&mathml;"><mrow>
<msub><mi>n</mi><mover><mo>o</mo><mo>~</mo></mover></msub><mo>+</mo>
<msub><mi>n</mi><mo>c</mo></msub><mo>+</mo>
<msub><mi>n</mi><mo>s</mo></msub><mo>+</mo>
<msub><mi>n</mi><mo>d</mo></msub>
</mrow></math> by
<math xmlns="&mathml;"><mrow>
<msub><mi>n</mi><mover><mo>o</mo><mo>~</mo></mover></msub><mo>+</mo>
<msub><mi>n</mi><mo>c</mo></msub><mo>+</mo>
<msub><mi>n</mi><mo>s</mo></msub><mo>+</mo>
<msub><mi>n</mi><mo>d</mo></msub>
</mrow></math>
submatrix
<math xmlns="&mathml;">
<msup><mi>&Psi;</mi>
<mrow><mo>c</mo><mo>&cap;</mo><mo>d</mo></mrow></msup>
</math>
must be non-singular, and the further bounded away from singularity
it is, the more robust it is in solving for new values of
the dependent coordinates when the values of the independent
coordinates are changed.
</p>

<p>
To get a good partitioning, the following method can be used.
Start with the submatrix
<math xmlns="&mathml;">
<msup><mi>&Psi;</mi><mo>c</mo></msup>
</math>
which has
<math xmlns="&mathml;"><mrow>
<msub><mi>n</mi><mover><mo>o</mo><mo>~</mo></mover></msub><mo>+</mo>
<msub><mi>n</mi><mo>c</mo></msub><mo>+</mo>
<msub><mi>n</mi><mo>s</mo></msub><mo>+</mo>
<msub><mi>n</mi><mo>d</mo></msub>
</mrow></math>
rows and
<math xmlns="&mathml;"><mrow><mn>3</mn><mo>&InvisibleTimes;</mo>
<mfenced><mrow><msub><mi>n</mi><mo>h</mo></msub><mo>+</mo>
<msub><mi>n</mi><mo>v</mo></msub></mrow></mfenced>
</mrow></math>
columns.
The <math xmlns="&mathml;"><mrow><mi>i</mi><mi>j</mi><mtext>th</mtext>
</mrow></math>
element of this matrix,
<math xmlns="&mathml;"><msubsup><mi>&psi;</mi>
<mrow><mi>i</mi><mi>j</mi></mrow><mo>c</mo></msubsup></math>,
represents the partial derivative of the
<math xmlns="&mathml;"><mi>i</mi><mtext>th</mtext></math>
constraint with respect to the
<math xmlns="&mathml;"><mi>j</mi><mtext>th</mtext></math>
coordinate value.
Gaussian elimination is applied to the matrix with pivoting both over
rows and <b>columns</b>.<sup><a href="#tx4" id="rf4">4</a></sup>
At the end of this process, the coordinates corresponding to the
<math xmlns="&mathml;"><mrow>
<msub><mi>n</mi><mover><mo>o</mo><mo>~</mo></mover></msub><mo>+</mo>
<msub><mi>n</mi><mo>c</mo></msub><mo>+</mo>
<msub><mi>n</mi><mo>s</mo></msub><mo>+</mo>
<msub><mi>n</mi><mo>d</mo></msub>
</mrow></math>
left-most columns are selected as the dependent
set.  The remaining coordinates compose the independent set.
If coordinate values change a great amount in the course of
solving the mathematical programming problem, it may be advisable to
recompute this partitioning to maintain a robust partitioning.
</p>

<p>
Once an unconstrained formulation of the tensegrity mathematical programming
problem is selected, a method must be picked
for solving the unconstrained problem.  Newton's method can be
applied here since the first-order condition of a solution
requires the gradient of the unconstrained objective function to be
a zero vector, or as close to it as the solution tolerances require.
However, Newton's method is only really useful at the end of the
solution iterations to increase the accuracy of the solution.
If the coordinate values are not in the neighborhood of a solution,
Newton's method diverges and isn't able to reach a solution.
</p>

<p>
Initially, it is best to use some sort of conjugate-direction
method.
Two effective methods in this category are
Parallel Tangents
(also called PARTAN)<sup><a href="#tx5" id="rf5">5</a></sup>)
and Fletcher-Reeves.<sup><a href="#tx6" id="rf6">6</a></sup>
These and other conjugate-direction methods recommend themselves especially
in conjunction with the penalty formulation since they are immune to the
problems posed by the asymmetric eigenvalues of the objective function
which results from that formulation.
</p>

<p>
Both of these methods require a method for doing a line search for finding
which point in a given direction minimizes the objective function.  One
method is outlined below.  It assumes the value of the objective function
for the current coordinate values has already been computed.
</p>

<ol>
<li>An initial step size is selected and the point in the
given direction found whose distance from the initial point matches
this step size.  The value of the objective function is computed
at this new point.<sup><a href="#tx7" id="rf7">7</a></sup></li>
<li>If the objective function value is larger at the
new point, the step
size is halved until a decrease is obtained, and halving continues until
no more improvement (i.e. no more decrease in the objective function)
is obtained.
If the objective function value is smaller at the new point, the step
size is doubled until no further decreases are obtained.  In this
second case, if the first doubling of the step size doesn't result
in an additional decrease, the original step size is halved to
see if that results in a decrease.  If it does, halving
continues until no further decrease is realized.</li>
<li>A quadratic technique is used to fine tune the step size.  Three
points are selected from the doubling/halving process above:  the initial
point, the best point and the point selected after the best point.
A quadratic curve is fitted to the step sizes and objective function
values corresponding to these three points.  Using this curve, the
step size corresponding to the minimum value for the objective function
is computed.  The actual value for the objective function for this
step size is computed.  This procedure is repeated,
substituting the
new point generated for one of the old points.  Repetition is
terminated when no further improvement to the actual value of the
objective function is obtained.
The formula for computing
the new step size is:
<p class="center">
<math xmlns="&mathml;"><mrow><msub><mi>s</mi><mi>n</mi></msub>
<mo>=</mo><mfrac>
<mrow><mfenced><mrow><msubsup><mi>s</mi><mn>2</mn><mn>2</mn></msubsup>
<mo>-</mo><msubsup><mi>s</mi><mn>3</mn><mn>2</mn></msubsup></mrow></mfenced>
<mo>&InvisibleTimes;</mo><msub><mi>o</mi><mn>1</mn></msub><mo>+</mo>
<mfenced><mrow><msubsup><mi>s</mi><mn>3</mn><mn>2</mn></msubsup>
<mo>-</mo><msubsup><mi>s</mi><mn>1</mn><mn>2</mn></msubsup></mrow></mfenced>
<mo>&InvisibleTimes;</mo><msub><mi>o</mi><mn>2</mn></msub><mo>+</mo>
<mfenced><mrow><msubsup><mi>s</mi><mn>1</mn><mn>2</mn></msubsup>
<mo>-</mo><msubsup><mi>s</mi><mn>2</mn><mn>2</mn></msubsup></mrow></mfenced>
<mo>&InvisibleTimes;</mo><msub><mi>o</mi><mn>3</mn></msub></mrow>
<mrow><mn>2</mn><mo>&InvisibleTimes;</mo>
<mfenced><mrow><mfenced><mrow><msub><mi>s</mi><mn>2</mn></msub><mo>-</mo>
<msub><mi>s</mi><mn>3</mn></msub></mrow></mfenced><mo>&InvisibleTimes;</mo>
<msub><mi>o</mi><mn>1</mn></msub><mo>+</mo>
<mfenced><mrow><msub><mi>s</mi><mn>3</mn></msub><mo>-</mo>
<msub><mi>s</mi><mn>1</mn></msub></mrow></mfenced><mo>&InvisibleTimes;</mo>
<msub><mi>o</mi><mn>2</mn></msub><mo>+</mo>
<mfenced><mrow><msub><mi>s</mi><mn>1</mn></msub><mo>-</mo>
<msub><mi>s</mi><mn>2</mn></msub></mrow></mfenced><mo>&InvisibleTimes;</mo>
<msub><mi>o</mi><mn>3</mn></msub></mrow></mfenced></mrow></mfrac></mrow></math>
</p>
where <math xmlns="&mathml;"><msub><mi>s</mi><mi>n</mi></msub></math>
is the new step size,
<math xmlns="&mathml;"><msub><mi>s</mi><mn>1</mn></msub></math>,
<math xmlns="&mathml;"><msub><mi>s</mi><mn>2</mn></msub></math>,
<math xmlns="&mathml;"><msub><mi>s</mi><mn>3</mn></msub></math>
are the step sizes
corresponding to the three points and
<math xmlns="&mathml;"><msub><mi>o</mi><mn>1</mn></msub></math>,
<math xmlns="&mathml;"><msub><mi>o</mi><mn>2</mn></msub></math>,
<math xmlns="&mathml;"><msub><mi>o</mi><mn>3</mn></msub></math>
are the three objective function values.</li>
</ol>

<p>
The final fine-tuning step is important since both PARTAN and
Fletcher-Reeves count on the point being an accurate minimizing
point in the direction chosen.  Once a solution to the unconstrained
problem has been reached using conjugate-direction methods,
Newton's method can be applied to the
unconstrained problem to improve the accuracy of the result.
</p>

<div id="footnotes">
<hr class="footmark"/>
<p class="note">
<sup><a href="#rf1" id="tx1">1</a></sup>
  The non-convexity is due to the strut constraints.
  For a proof, see <a href="appendixB.xml">Appendix&nbsp;B</a>.
  </p>

<p class="note">
<sup><a href="#rf2" id="tx2">2</a></sup>
  <a href="refs.html#Luenberger73"><i>Luenberger73</i></a>, pp.&nbsp;278-280.
  </p>

<p class="note">
<sup><a href="#rf3" id="tx3">3</a></sup>
  <a href="refs.html#Luenberger73"><i>Luenberger73</i></a>, pp.&nbsp;155-158.
  This is also referred to as the Newton-Raphson method.
  It is usually presented in a univariate context.
  Here, the multivariate version of the method is used.
  </p>

<p class="note">
<sup><a href="#rf4" id="tx4">4</a></sup>
  This is referred to as "complete" or "total" pivoting.
  In contrast to "partial" pivoting,
  swapping is done over both rows and columns instead of just rows.
  Elimination is done in the usual manner over just rows.
  This only
  gets a footnote in most treatments of Gaussian elimination since for most
  applications "partial" pivoting (pivoting over rows only) is sufficient.
  For example, see <a href="refs.html#Johnston82"><i>Johnston82</i></a>,
  p.&nbsp;31.
  </p>

<p class="note">
<sup><a href="#rf5" id="tx5">5</a></sup>
  <a href="refs.html#Luenberger73"><i>Luenberger73</i></a>, pp.&nbsp;184-186.
  </p>

<p class="note">
<sup><a href="#rf6" id="tx6">6</a></sup>
  <a href="refs.html#Luenberger73"><i>Luenberger73</i></a>, pp.&nbsp;182-183.
  </p>

<p class="note">
<sup><a href="#rf7" id="tx7">7</a></sup>
  If the exact formulation is being used, it is
  possible that this step generates constraint deviations
  large enough that Newton's method doesn't converge.  If this
  happens, the step size should be halved.
  </p>
</div>

<p class="link">
<a href="index.html#chap3">Table of Contents</a><br/>
4&nbsp;<a href="chap4_1.html">Higher-Frequency Spheres</a>
</p>

</body>
</html>

