(*A mathematica notebook to calculate length dependent
muscle properties (fiber length, sarcomere length and
fiber angles) from a reference configuration and current
muscle length. Copyright 1996, Thomas Burkholder
You are licensed to use this package for non-commercial
purposes. I'd like to hear from you if you do use this, or
need tech support at tburkhol@ucsd.edu*)
(*Assume rigid aponeurosis and tendon; Constant muscle
projection area; Uniform pennation, fiber angle etc
Notation:
Lf1 Fiber Length in muscle refrence state
La Aponeurosis Length in refrence state
alpha aponeurosis angle
beta Fiber angle
ML Muscle length in current state
MV Muscle velocity
theta Joint angle or current pennation
ZeroLength Muscle length at refrence
depends on a list data structure of refrence:
muscle length, aponeurosis length,
fiber length, PCSA,
aponeurosis angle,fiber angle,
pennation angle, moment arm function(unused)
kilosarcomere #, MA,
fast fiber fraction,
tendon length, tendon "a",
tendon "b"*)
BeginPackage["Muscle`"]
SLengthTension::usage =
"SLengthTension[length] gives the normalized force
produced by a human sarcomere at length in µm"
SVelocityTension::usage =
"SVelocityTension[vin, Vmax] gives the normalized
force of a sarcomere extending at vin, subject to
specified Vmax."
ForceLength::usage =
"ForceLength[fl, csa,n] gives the force of a muscle
with PCSA csa, fiber length fl, and n sarcomeres in
series."
ForceVelocity::usage =
"ForceVelocity[svel, fast%] gives scaling factor
for a muscle with fast% fast fibers lengthening at
a velocity of fvel when n sarcomeres are in series.
Requires definitions of global variables Fast and Slow,
the Vmax for fast and slow fibers respecitvely."
NewArch::usage =
"NewArch[Muscle,ML] returns {aponeurosis angle, fiber
angle, fiber length} for Muscle at new length ML"
Vf::usage =
"Vf[MV,ML,Muscle] returns fiber velocity and fiber length
of Muscle at length ML contracting at MV"
Begin["`Private`"]
SLengthTension[length_]:=Which[
length < 1.05, 0,
length < 1.65, length-1.05,
length < 2.47, -0.2052 + 0.488 length,
length <=2.81 , 1,
length <4.33, 0.658 (4.33-length),
True, 0]
(*Human theoretical Cutts ('88) J Anat 160:79-88*)
SVelocityTension[vin_, Vmax_]:=If[vin <= 0,
If[-vin <= Vmax,
(Vmax+vin)/(Vmax-4vin),
0],
(1.8-0.8(Vmax-vin)/
(Vmax+7.56vin))]
(*Shortening curve from Close 1965 (Nature 206:718)
Lengthening from Katz 1939 (J Phys Lond 94:45)*)
ForceLength[fl_, csa_,n_]:= 2.5 csa*
SLengthTension[fl/n]
(*based on 2.5 kg/cm^2, so units are kg*)
ForceVelocity[svel_, fast_]:=
fast SVelocityTension[svel, Global`Fast] +
(1-fast) SVelocityTension[svel, Global`Slow]
(*forces of fiber subpopulations add linearly*)
MuscleArea[Muscle_List]:= Muscle[[1]] Sin[Muscle[[5]]]
(*conservation of projection area is used to find
alpha. this is a reduced form assuming const.
aponeurosis length*)
NewArch[Muscle_List,ML_]:= Block[{a$ = ArcSin[
MuscleArea[Muscle]/ML],
b$ = ArcTan[
Muscle[[2]] Sin[a$]/(ML -
Muscle[[2]] Cos[a$])]},
Return[{a$,b$,Muscle[[2]]/Sin[b$]*
Sin[a$]}]]
(*The fundamental model function:
conservation of area gives alpha
trig gives beta (arctan[height/length])
law of sines gives fiber length*)
Vf[MV_,ML_,Muscle_List]:= Block[{Angles$2 = NewArch[
Muscle, ML]},
Return[{MV Cos[Angles$2[[1]]+Angles$2[[2]]]/
Cos[Angles$2[[1]]],
Angles$2[[3]]}]]
(*from zuurbier and Huijing, with aponeurosis
velocity = 0*)
End[]
EndPackage[]