ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SymPy 生物力学模块肌肉肌腱特征曲线(Musculotendon Characteristic Curves)完全指南

SymPy 生物力学模块肌肉肌腱特征曲线(Musculotendon Characteristic Curves)完全指南 SymPy 生物力学模块肌肉肌腱特征曲线Musculotendon Characteristic Curves完全指南【免费下载链接】sympyA computer algebra system written in pure Python项目地址: https://gitcode.com/GitHub_Trending/sy/sympySymPy 的sympy.physics.biomechanics模块在sympy.physics.mechanics多体动力学基础上扩展了用于建模骨骼肌-肌腱系统musculotendon的能力。其中sympy.physics.biomechanics.curve子模块定义了整套基于 De Groote et al. (2016) 论文的肌肉肌腱特征曲线函数——包括肌腱力-长度曲线、肌纤维主动/被动力-长度曲线、力-速度曲线及其各自的解析逆函数。阅读本文后你将掌握这 8 个特征曲线类的数学方程、默认常量、构造方式、求导/数值化/代码生成用法并能把它们组装进MusculotendonDeGroote2016模型用于生物力学仿真。特征曲线在生物力学建模中的角色生物力学模型通常需要同时建模骨骼系统、肌肉系统与神经系统。在 SymPy 中骨骼系统用sympy.physics.mechanics的多体动力学描述肌肉系统musculotendon与神经激活动力学activation dynamics则由sympy.physics.biomechanics提供。sympy.physics.biomechanics被设计为sympy.physics.mechanics的扩展两个模块的类层级相关、接口属性名、调用签名、返回类型互相模仿因此sympy.physics.mechanics能为包含生物力学组件的多体系统正确生成运动方程参见 api/index.rst。Hill 型肌肉模型中肌腱与肌纤维产生的力由若干条特征曲线决定。每条曲线都是归一化量之间的函数关系肌腱力-长度曲线fl^T f(\tilde{l}^T)肌纤维主动力-长度曲线fl^M_act f(\tilde{l}^M)肌纤维被动力-长度曲线fl^M_pas f(\tilde{l}^M)肌纤维力-速度曲线fv^M f(\tilde{v}^M)全部曲线及逆函数都实现为 SymPyFunction的子类基类为CharacteristicCurveFunction源码位于 sympy/physics/biomechanics/curve.py。模块顶层通过 sympy/physics/biomechanics/init.py 导出全部 8 个曲线类、基类与CharacteristicCurveCollection容器因此可以直接from sympy.physics.biomechanics import ...。基类 CharacteristicCurveFunction符号函数的实现骨架所有特征曲线继承自CharacteristicCurveFunction继承自 SymPy 的Function。它提供两个核心约定禁止直接实例化基类的eval直接抛出TypeError提示特征曲线实例必须是具体子类防止用户误用基类。代码打印控制_print_code在打印为代码时用printer.parenthesize(self.doit(deepFalse, evaluateFalse), PRECEDENCE[Atom])强制保留括号并关闭常量折叠。注释说明肌肉肌腱特征曲线方程中的数值项若被常量折叠有时会产生数值上不稳定的表达式。这一打印逻辑被同时绑定到_ccode、_cxxcode、_fcode、_numpycode、_jaxcode、_cupycode、_pythoncode、_octave、_lambdacode、_mpmathcode等大量代码打印接口意味着一条曲线可以直接翻译成 C、C、Fortran、Python、NumPy、JAX、CuPy 等目标语言代码。test_curve.py 中的test_print_code_parenthesize用自定义的ExampleFunction验证f1*f2*f3经 15 种不同代码打印器C89/C99/C11/CXX98/CXX11/CXX17/Fortran/Octave/Python/NumPy/SciPy/CuPy/JAX/mpmath/Lambda输出后均保留完整括号。8 个特征曲线类的数学方程与默认常量所有曲线的解析方程与常量均出自论文De Groote, F., Kinney, A. L., Rao, A. V., Fregly, B. J., Evaluation of direct collocation optimal control problem formulations for solving the muscle redundancy problem, Annals of biomedical engineering, 44(10), (2016) pp. 2922-2936。下表汇总了全部 8 个类及其方程要点类名输入归一化量方程概要默认常量TendonForceLengthDeGroote2016肌腱长度 $\tilde{l}^T$$fl^T c_0 e^{c_3(\tilde{l}^T - c_1)} - c_2$c00.2, c10.995, c20.25, c333.93669377311689TendonForceLengthInverseDeGroote2016肌腱力 $fl^T$${\tilde{l}^T} \log((fl^Tc_2)/c_0)/c_3 c_1$同上FiberForceLengthPassiveDeGroote2016纤维长度 $\tilde{l}^M$$fl^M_{pas} (\exp(c_1(\tilde{l}^M-1)/c_0)-1)/(\exp(c_1)-1)$c00.6, c14.0FiberForceLengthPassiveInverseDeGroote2016被动纤维力 $fl^M_{pas}$$\tilde{l}^M c_0\log(fl^M_{pas}(e^{c_1}-1)1)/c_1 1$同上FiberForceLengthActiveDeGroote2016纤维长度 $\tilde{l}^M$三个高斯项之和见下12 个常量见下FiberForceVelocityDeGroote2016纤维速度 $\tilde{v}^M$$fv^M c_0\log(c_1\tilde{v}^Mc_2\sqrt{(c_1\tilde{v}^Mc_2)^21})c_3$c0-0.318, c1-8.149, c2-0.374, c30.886FiberForceVelocityInverseDeGroote2016纤维力 $fv^M$$\tilde{v}^M (\sinh((fv^M-c_3)/c_0)-c_2)/c_1$同上CharacteristicCurveCollection—冻结数据类聚合 7 个曲线—其中主动力-长度曲线由三个高斯项叠加$fl^M_{act} c_0 \exp\left(-\frac{1}{2}\left(\frac{\tilde{l}^M - c_1}{c_2 c_3 \tilde{l}^M}\right)^2\right) c_4 \exp\left(-\frac{1}{2}\left(\frac{\tilde{l}^M - c_5}{c_6 c_7 \tilde{l}^M}\right)^2\right) c_8 \exp\left(-\frac{1}{2}\left(\frac{\tilde{l}^M - c_9}{c_{10} c_{11} \tilde{l}^M}\right)^2\right)$其 12 个默认常量依次为c00.814, c11.06, c20.162, c30.0633, c40.433, c50.717, c6-0.0299, c70.2, c80.1, c91.0, c100.354, c110.0。常量选择的物理意义源码文档强调虽然可以修改这些常量但原始论文精心选择了它们以保证曲线具备特定且必需的性质肌腱力-长度曲线肌腱处于无应变状态时产生零力肌腱承受 5% 应变时产生 1 个归一化单位的力。被动肌纤维力-长度曲线对所有介于 0 与 1 之间的归一化纤维长度被动纤维力都非常接近 0这正是被动的含义——松弛状态下几乎不产生力。主动肌纤维力-长度曲线在归一化纤维长度为 1 时主动力为 1在归一化纤维长度为 0 和 2 时主动力为 0。力-速度曲线当肌纤维等长收缩伸长率为 0时产生 1 个归一化单位的力。推荐构造方式with_defaults 类方法文档明确推荐使用各曲线的with_defaults类方法实例化它会把方程常量自动填充为论文中的浮点值实现见各类的with_defaults内部用Float(...)构造常量。以肌腱力-长度曲线为例 from sympy import Symbol from sympy.physics.biomechanics import TendonForceLengthDeGroote2016 l_T_tilde Symbol(l_T_tilde) fl_T TendonForceLengthDeGroote2016.with_defaults(l_T_tilde) fl_T TendonForceLengthDeGroote2016(l_T_tilde, 0.2, 0.995, 0.25, 33.93669377311689)也可以传入任意可 sympify 的值包括符号与表达式。归一化肌腱长度通常定义为肌腱长度与肌腱松弛长度之比 from sympy import symbols l_T, l_T_slack symbols(l_T l_T_slack) l_T_tilde l_T/l_T_slack fl_T TendonForceLengthDeGroote2016.with_defaults(l_T_tilde) fl_T TendonForceLengthDeGroote2016(l_T/l_T_slack, 0.2, 0.995, 0.25, 33.93669377311689)查看方程doit 与数值稳定性实例的doit()会展开为实际的符号表达式。建议使用doit(evaluateFalse)它不会折叠常量能把表达式保持在对肌肉肌腱合理工作区间内数值更稳定的形式 fl_T.doit(evaluateFalse) -0.25 0.2*exp(33.93669377311689*(l_T/l_T_slack - 0.995))实现上evaluateTrue时返回c0*exp(c3*(l_T_tilde - c1)) - c2evaluateFalse时用UnevaluatedExpr包裹l_T_tilde - c1阻止求值。doit的完整签名是doit(self, deepTrue, evaluateTrue, **hints)deep控制是否递归调用子表达式默认Trueevaluate控制构造符号表达式时是否求值。测试test_doit与test_doit_evaluate_false分别验证了两种模式的输出见 test_curve.py。符号求导fdiff 与 diff每个曲线类都实现了fdiff(argindex)返回对第argindex个参数从 1 开始的偏导数因此可以直接用.diff(...)对输入变量或任意常量求导 fl_T.diff(l_T) 6.787338754623378*exp(33.93669377311689*(l_T/l_T_slack - 0.995))/l_T_slack对TendonForceLengthDeGroote2016fdiff对 5 个参数分别返回对 $\tilde{l}^T$ 为 $c_0c_3e^{c_3(\tilde{l}^T-c_1)}$对 c0 为 $e^{c_3(\tilde{l}^T-c_1)}$对 c1 为 $-c_0c_3e^{c_3(\tilde{l}^T-c_1)}$对 c2 为常数 -1对 c3 为 $c_0(\tilde{l}^T-c_1)e^{c_3(\tilde{l}^T-c_1)}$。越界参数会抛出ArgumentIndexError。所有求导行为均有对应测试覆盖例如test_differentiate_wrt_l_T_tilde、test_differentiate_wrt_c0等。解析逆函数inverse 方法每个正向曲线都实现inverse()方法返回对应的解析逆函数类逆函数也实现inverse()返回原函数类二者互为精确解析逆正向曲线逆函数默认常量TendonForceLengthDeGroote2016TendonForceLengthInverseDeGroote20164 个FiberForceLengthPassiveDeGroote2016FiberForceLengthPassiveInverseDeGroote20162 个FiberForceVelocityDeGroote2016FiberForceVelocityInverseDeGroote20164 个注意主动力-长度曲线没有逆函数它不是单调函数无法解析求逆。测试test_inverse断言了这些配对关系。例如逆肌腱力-长度曲线以肌腱力为输入给出对应长度 from sympy import Symbol from sympy.physics.biomechanics import TendonForceLengthInverseDeGroote2016 fl_T Symbol(fl_T) l_T_tilde TendonForceLengthInverseDeGroote2016.with_defaults(fl_T) l_T_tilde.doit(evaluateFalse) c1 log((c2 fl_T)/c0)/c3 l_T_tilde.diff(fl_T) 1/(c3*(c2 fl_T))LaTeX 打印_latex 输出标准肌肉力学符号每个类都实现了_latex方法将函数本身打印为标准肌肉力学记号TendonForceLengthDeGroote2016→\operatorname{fl}^T \left( ... \right)逆肌腱曲线 →\left( \operatorname{fl}^T \right)^{-1} \left( ... \right)被动曲线 →\operatorname{fl}^M_{pas} \left( ... \right)主动曲线 →\operatorname{fl}^M_{act} \left( ... \right)力-速度曲线 →\operatorname{fv}^M \left( ... \right)对应测试如test_function_print_latex、test_expression_print_latex验证了函数记号与展开表达式的 LaTeX 输出test_curve.py。数值化与代码生成lambdify 与代码打印器CharacteristicCurveFunction._print_code使所有曲线可直接打印为多种语言的数值代码。以TendonForceLengthDeGroote2016为例各打印器输出来自测试参数化包括C89/C99/C11/CXX98(-0.25 0.2*exp(33.93669377311689*(l_T_tilde - 0.995)))Python/NumPy/SciPy/CuPy(-0.25 0.2*math.exp(...))/numpy.exp(...)/cupy.exp(...)JAX(-0.25 0.2*jax.numpy.exp(...))mpmath高精度mpmath.mpf表达结合sympy.utilities.lambdify.lambdify可生成可调用函数做数值评估。测试给出了可复现的数值基准 from sympy.utilities.lambdify import lambdify fl_T_callable lambdify(l_T_tilde, fl_T) fl_T_callable(1.0) # ≈ -0.013014055039221595NumPy 版本还验证了向量化输入l_T_tilde [0.95, 1.0, 1.01, 1.05]对应输出[-0.2065693181344816, -0.0130140550392216, 0.0827421191989246, 1.04314889144172]。JAX 版本测试中还会用jax.jit包裹后与 NumPy 结果比对前提是安装了 jax 与 numpy否则对应测试跳过。用 CharacteristicCurveCollection 组装完整曲线组CharacteristicCurveCollection是dataclass(frozenTrue)的简单数据容器将 7 条相关曲线聚合在一起dataclass(frozenTrue) class CharacteristicCurveCollection: tendon_force_length: CharacteristicCurveFunction tendon_force_length_inverse: CharacteristicCurveFunction fiber_force_length_passive: CharacteristicCurveFunction fiber_force_length_passive_inverse: CharacteristicCurveFunction fiber_force_length_active: CharacteristicCurveFunction fiber_force_velocity: CharacteristicCurveFunction fiber_force_velocity_inverse: CharacteristicCurveFunction它实现了__iter__按上述字段顺序逐个产出曲线。该容器被 musculotendon.py 中的MusculotendonBase使用curves属性保存CharacteristicCurveCollection实例在构造肌肉肌腱模型时按需调用各曲线的with_defaults生成力表达式例如源码 704-708 行self._fl_T self.curves.tendon_force_length.with_defaults(self._l_T_tilde)等。实战组装 MusculotendonDeGroote2016 模型在 musculotendon.py 的MusculotendonDeGroote2016文档示例中曲线与完整肌肉模型协同使用。其with_defaults构造器with_defaultsTrue会自动在内部调用各特征曲线的with_defaults确保使用论文发布的常量——这正是 api/index.rst 中所述模块设计理念的体现。典型调用方式from sympy.physics.biomechanics import ( MusculotendonDeGroote2016, MusculotendonFormulation, ) elastic_tendon_muscle MusculotendonDeGroote2016.with_defaults( muscle, pathway, activation, musculotendon_dynamicsMusculotendonFormulation.FIBER_LENGTH_EXPLICIT, tendon_slack_lengthl_T_slack, peak_isometric_forceF_M_max, optimal_fiber_lengthl_M_opt, )其中pathway须为PathwayBase具体子类如LinearPathway实例activation须为ActivationBase具体子类如FirstOrderActivationDeGroote2016实例。若不使用with_defaults所有曲线常量将作为符号参数出现在模型的p参数矩阵中用户需自行提供数值。更多模型构建步骤可参考 biomechanical-model-example.rst 与 biomechanics 教程索引。相关文档与测试资源API 参考页本文档来源curve.rst、musculotendon.rst、activation.rst模块总览api/index.rst教程biomechanical-model-example.rst、biomechanics/index.rst源码curve.py、musculotendon.py、activation.py测试test_curve.py、test_musculotendon.py、test_activation.py适用前提说明上述常量与方程仅针对 De Groote et al. (2016) 的 Hill 型模型表述若需使用其它文献的曲线形式可以子类化CharacteristicCurveFunction并自行实现eval、doit、fdiff、inverse、_latex等接口再通过CharacteristicCurveCollection接入MusculotendonBase。数值运行lambdify 的 NumPy/JAX 后端要求环境中已安装对应依赖库。【免费下载链接】sympyA computer algebra system written in pure Python项目地址: https://gitcode.com/GitHub_Trending/sy/sympy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表