obsidian_backup/多体+耦合求解器/WindTurbine_Kane推导.ipynb

514 lines
38 KiB
Plaintext
Raw Normal View History

2025-03-28 09:27:28 +08:00
{
"cells": [
{
"cell_type": "code",
2025-04-02 15:53:40 +08:00
"execution_count": null,
2025-03-28 09:27:28 +08:00
"metadata": {},
"outputs": [],
"source": [
"import sympy as sm\n",
"import sympy.physics.mechanics as me\n",
2025-04-02 15:53:40 +08:00
"me.init_vprinting(use_latex='mathjafrac')"
2025-03-28 09:27:28 +08:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 建立坐标系"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"def smll_rot_trans(theta1, theta2, theta3):\n",
" theta11 = theta1 * theta1\n",
" theta22 = theta2 * theta2\n",
" theta33 = theta3 * theta3\n",
" sqrd_sum = theta11 + theta22 + theta33\n",
" sqrt1_sqrd_sum = (1.0 + sqrd_sum)**0.5\n",
" com_denom = sqrd_sum * sqrt1_sqrd_sum\n",
" theta12s = theta1 * theta2 * (sqrt1_sqrd_sum - 1.0)\n",
" theta13s = theta1 * theta3 * (sqrt1_sqrd_sum - 1.0)\n",
" theta23s = theta2 * theta3 * (sqrt1_sqrd_sum - 1.0)\n",
" \n",
" if com_denom == 0.0:\n",
2025-04-02 15:53:40 +08:00
" trans_mat = sm.Matrifrac([[1.0, 0.0, 0.0],\n",
2025-03-28 09:27:28 +08:00
" [0.0, 1.0, 0.0],\n",
" [0.0, 0.0, 1.0]])\n",
" \n",
" else:\n",
2025-04-02 15:53:40 +08:00
" trans_mat = sm.Matrifrac([[(theta11 * sqrt1_sqrd_sum + theta22 + theta33) / com_denom, (theta3 * sqrd_sum + theta12s) / com_denom, (-theta2 * sqrd_sum + theta13s) / com_denom],\n",
2025-03-28 09:27:28 +08:00
" [(-theta3 * sqrd_sum + theta12s) / com_denom, (theta11 + theta22 * sqrt1_sqrd_sum + theta33) / com_denom, (theta1 * sqrd_sum + theta23s) / com_denom],\n",
" [(theta2 * sqrd_sum + theta13s) / com_denom, (-theta1 * sqrd_sum + theta23s) / com_denom, (theta11 + theta22 + theta33 * sqrt1_sqrd_sum) / com_denom]])\n",
" return trans_mat"
]
},
{
"cell_type": "code",
2025-04-02 15:53:40 +08:00
"execution_count": 87,
"metadata": {},
"outputs": [],
"source": [
"def shape_functions(f, deriv):\n",
"\n",
" x = sm.symbols(\"x\")\n",
" L = sm.symbols(\"L\")\n",
" frac = x / L\n",
" if deriv == 0:\n",
" return f.subs(frac, x / L)\n",
" \n",
" if deriv == 1:\n",
" return f.diff(x)\n",
" \n",
" if deriv == 2:\n",
" return f.diff(x, 2)"
]
},
{
"cell_type": "code",
"execution_count": null,
2025-03-28 09:27:28 +08:00
"metadata": {},
2025-04-11 10:37:09 +08:00
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 148,
"metadata": {},
"outputs": [
{
"data": {
"text/latex": [
"$\\displaystyle \\left[\\begin{matrix}\\frac{0.985809297667139 \\left(0.761752341070088 \\left(- 0.0212200758868839 q_{tfa1} - q_{tfa2}\\right)^{2} + 1.04380956047043 \\left(0.0205928360022956 q_{tss1} + q_{tss2}\\right)^{2} \\left(0.740286138287461 \\left(- 0.0212200758868839 q_{tfa1} - q_{tfa2}\\right)^{2} + \\left(0.0205928360022956 q_{tss1} + q_{tss2}\\right)^{2} + 0.971819971366977\\right)^{0.5}\\right)}{\\left(0.761752341070088 \\left(- 0.0212200758868839 q_{tfa1} - q_{tfa2}\\right)^{2} + 1.0289971697056 \\left(0.0205928360022956 q_{tss1} + q_{tss2}\\right)^{2}\\right) \\left(0.740286138287461 \\left(- 0.0212200758868839 q_{tfa1} - q_{tfa2}\\right)^{2} + \\left(0.0205928360022956 q_{tss1} + q_{tss2}\\right)^{2} + 0.971819971366977\\right)^{0.5}} & \\frac{0.985809297667139 \\left(- 0.0185205479452055 q_{tfa1} - 0.872784246575343 q_{tfa2}\\right)}{\\left(0.740286138287461 \\left(- 0.0212200758868839 q_{tfa1} - q_{tfa2}\\right)^{2} + \\left(0.0205928360022956 q_{tss1} + q_{tss2}\\right)^{2} + 0.971819971366977\\right)^{0.5}} & \\frac{0.985809297667139 \\left(1.01439497716895 \\left(0.740286138287461 \\left(- 0.0212200758868839 q_{tfa1} - q_{tfa2}\\right)^{2} + \\left(0.0205928360022956 q_{tss1} + q_{tss2}\\right)^{2} + 0.971819971366977\\right)^{0.5} - 1.0\\right) \\left(- 0.0185205479452055 q_{tfa1} - 0.872784246575343 q_{tfa2}\\right) \\left(0.0208892694063927 q_{tss1} + 1.01439497716895 q_{tss2}\\right)}{\\left(0.761752341070088 \\left(- 0.0212200758868839 q_{tfa1} - q_{tfa2}\\right)^{2} + 1.0289971697056 \\left(0.0205928360022956 q_{tss1} + q_{tss2}\\right)^{2}\\right) \\left(0.740286138287461 \\left(- 0.0212200758868839 q_{tfa1} - q_{tfa2}\\right)^{2} + \\left(0.0205928360022956 q_{tss1} + q_{tss2}\\right)^{2} + 0.971819971366977\\right)^{0.5}}\\\\\\frac{0.985809297667139 \\left(0.0185205479452055 q_{tfa1} + 0.872784246575343 q_{tfa2}\\right)}{\\left(0.740286138287461 \\left(- 0.0212200758868839 q_{tfa1} - q_{tfa2}\\right)^{2} + \\left(0.0205928360022956 q_{tss1} + q_{tss2}\\right)^{2} + 0.971819971366977\\right)^{0.5}} & \\frac{0.985809297667139}{\\left(0.740286138287461 \\left(- 0.0212200758868839 q_{tfa1} - q_{tfa2}\\right)^{2} + \\left(0.0205928360022956 q_{tss1} + q_{tss2}\\right)^{2} + 0.971819971366977\\right)^{0.5}} & \\frac{0.985809297667139 \\left(0.0208892694063927 q_{tss1} + 1.01439497716895 q_{tss2}\\right)}{\\left(0.740286138287461 \\left(- 0.0212200758868839 q_{tfa1} - q_{tfa2}\\right)^{2} + \\left(0.0205928360022956 q_{tss1} + q_{tss2}\\right)^{2} + 0.971819971366977\\right)^{0.5}}\\\\\\frac{0.985809297667139 \\left(1.01439497716895 \\left(0.740286138287461 \\left(- 0.0212200758868839 q_{tfa1} - q_{tfa2}\\right)^{2} + \\left(0.0205928360022956 q_{tss1} + q_{tss2}\\right)^{2} + 0.971819971366977\\right)^{0.5} - 1.0\\right) \\left(- 0.0185205479452055 q_{tfa1} - 0.872784246575343 q_{tfa2}\\right) \\left(0.0208892694063927 q_{tss1} + 1.01439497716895 q_{tss2}\\right)}{\\left(0.761752341070088 \\left(- 0.0212200758868839 q_{tfa1} - q_{tfa2}\\right)^{2} + 1.0289971697056 \\left(0.0205928360022956 q_{tss1} + q_{tss2}\\right)^{2}\\right) \\left(0.740286138287461 \\left(- 0.0212200758868839 q_{tfa1} - q_{tfa2}\\right)^{2} + \\left(0.0205928360022956 q_{tss1} + q_{tss2}\\right)^{2} + 0.971819971366977\\right)^{0.5}} & \\frac{0.985809297667139 \\left(- 0.0208892694063927 q_{tss1} - 1.01439497716895 q_{tss2}\\right)}{\\left(0.740286138287461 \\left(- 0.0212200758868839 q_{tfa1} - q_{tfa2}\\right)^{2} + \\left(0.0205928360022956 q_{tss1} + q_{tss2}\\right)^{2} + 0.971819971366977\\right)^{0.5}} & \\frac{0.985809297667139 \\left(0.77271774862819 \\left(- 0.0212200758868839 q_{tfa1} - q_{tfa2}\\right)^{2} \\left(0.740286138287461 \\left(- 0.0212200758868839 q_{tfa1} - q_{tfa2}\\right)^{2} + \\left(0.0205928360022956 q_{tss1} + q_{tss2}\\right)^{2} + 0.971819971366977\\right)^{0.5} + 1.0289971697056 \\left(0.0205928360022956 q_{tss1} + q_{tss2}\\right)^{2}\\right)}{\\left(0.761752341070088 \\left(- 0.0212200758868839 q_{tfa1} - q_{tfa2}\\right)^{2} + 1.0289971697056 \\left(0.0205928360022956 q_{tss1} +
],
"text/plain": [
"⎡ ⎛ ↪\n",
"⎢ ⎜ ↪\n",
"⎢ 0.985809297667139⋅⎝0.761752341070088⋅(-0.0212200758868839⋅q_tfa1 - q ↪\n",
"⎢ ──────────────────────────────────────────────────────────────────── ↪\n",
"⎢ ↪\n",
"⎢ ↪\n",
"⎢ ↪\n",
"⎢ ↪\n",
"⎢ ↪\n",
"⎢ ↪\n",
"⎢ ↪\n",
"⎢ ⎛ ↪\n",
"⎢ ⎜ ⎛ ↪\n",
"⎢0.985809297667139⋅⎝1.01439497716895⋅⎝0.740286138287461⋅(-0.0212200758868839⋅q ↪\n",
"⎢───────────────────────────────────────────────────────────────────────────── ↪\n",
"⎢ ↪\n",
"⎣ ↪\n",
2025-04-02 15:53:40 +08:00
"\n",
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"↪ 2 2 ⎛ ↪\n",
"↪ _tfa2) + 1.04380956047043⋅(0.0205928360022956⋅qₜₛₛ₁ + qₜₛₛ₂) ⋅⎝0.7402861382 ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ──────────────────────────────────────────────────────────────────────────── ↪\n",
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"↪ 0.76175234107 ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ↪\n",
"↪ ↪\n",
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"↪ 0.985809297667139⋅(0.0185205479452055⋅q_tfa1 + 0.87278 ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"↪ 0 ↪\n",
"↪ 2 2 ⎞ ↪\n",
"↪ _tfa1 - q_tfa2) + (0.0205928360022956⋅qₜₛₛ₁ + qₜₛₛ₂) + 0.971819971366977⎠ ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ──────────────────────────────────────────────────────────────────────────── ↪\n",
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"↪ 0.76175234107 ↪\n",
2025-04-02 15:53:40 +08:00
"\n",
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"↪ 2 ↪\n",
"↪ 87461⋅(-0.0212200758868839⋅q_tfa1 - q_tfa2) + (0.0205928360022956⋅qₜₛₛ₁ + q ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ──────────────────────────────────────────────────────────────────────────── ↪\n",
2025-04-11 10:37:09 +08:00
"↪ 2 ↪\n",
"↪ 0088⋅(-0.0212200758868839⋅q_tfa1 - q_tfa2) + 1.0289971697056⋅(0.02059283600 ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ↪\n",
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"↪ ⎛ 2 ↪\n",
"↪ 4246575343⋅q_tfa2)⋅⎝0.740286138287461⋅(-0.0212200758868839⋅q_tfa1 - q_tfa2) ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"↪ .5 ⎞ ↪\n",
"↪ ⎟ ↪\n",
"↪ - 1.0⎠⋅(-0.0185205479452055⋅q_tfa1 - 0.872784246575343⋅q_tfa2)⋅(0.0208892 ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ──────────────────────────────────────────────────────────────────────────── ↪\n",
2025-04-11 10:37:09 +08:00
"↪ 2 ↪\n",
"↪ 0088⋅(-0.0212200758868839⋅q_tfa1 - q_tfa2) + 1.0289971697056⋅(0.02059283600 ↪\n",
2025-04-02 15:53:40 +08:00
"\n",
2025-04-11 10:37:09 +08:00
"↪ 0.5⎞ ↪\n",
"↪ 2 ⎞ ⎟ ⎛ ↪\n",
"↪ ₜₛₛ₂) + 0.971819971366977⎠ ⎠⋅⎝0.740286138287461⋅(-0.0212200758868839⋅q_tf ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ──────────────────────────────────────────────────────────────────────────── ↪\n",
2025-04-11 10:37:09 +08:00
"↪ 2 ↪\n",
"↪ 22956⋅qₜₛₛ₁ + qₜₛₛ₂) ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"↪ -0.5 ↪\n",
"↪ 2 ⎞ ↪\n",
"↪ + (0.0205928360022956⋅qₜₛₛ₁ + qₜₛₛ₂) + 0.971819971366977⎠ ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ↪\n",
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"↪ ⎛ ↪\n",
"↪ 694063927⋅qₜₛₛ₁ + 1.01439497716895⋅qₜₛₛ₂)⋅⎝0.740286138287461⋅(-0.02122007588 ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ──────────────────────────────────────────────────────────────────────────── ↪\n",
2025-04-11 10:37:09 +08:00
"↪ 2 ↪\n",
"↪ 22956⋅qₜₛₛ₁ + qₜₛₛ₂) ↪\n",
2025-04-02 15:53:40 +08:00
"\n",
2025-04-11 10:37:09 +08:00
"↪ -0.5 ↪\n",
"↪ 2 2 ⎞ ↪\n",
"↪ a1 - q_tfa2) + (0.0205928360022956⋅qₜₛₛ₁ + qₜₛₛ₂) + 0.971819971366977⎠ ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ──────────────────────────────────────────────────────────────────────────── ↪\n",
"↪ ↪\n",
"↪ ↪\n",
"↪ ↪\n",
"↪ ↪\n",
"↪ ↪\n",
"↪ ↪\n",
"↪ ↪\n",
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"↪ 2 2 ↪\n",
"↪ 68839⋅q_tfa1 - q_tfa2) + (0.0205928360022956⋅qₜₛₛ₁ + qₜₛₛ₂) + 0.9718199713 ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ──────────────────────────────────────────────────────────────────────────── ↪\n",
"↪ ↪\n",
"↪ ↪\n",
"\n",
"↪ ↪\n",
"↪ ↪\n",
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"↪ 0.985809297667139⋅(-0.0185205479452055⋅q_tfa1 - 0.87278424657534 ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ↪\n",
"↪ ↪\n",
"↪ ↪\n",
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"↪ ⎛ ↪\n",
"↪ 0.985809297667139⋅⎝0.740286138287461 ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"↪ -0.5 ↪\n",
"↪ ⎞ ↪\n",
"↪ 66977⎠ ↪\n",
"↪ ────────── 0.985809297667139⋅(-0.0208892694063927⋅qₜₛₛ₁ - 1.01439497716895 ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ↪\n",
"↪ ↪\n",
"\n",
"↪ ↪\n",
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"↪ ⎛ 2 ↪\n",
"↪ 3⋅q_tfa2)⋅⎝0.740286138287461⋅(-0.0212200758868839⋅q_tfa1 - q_tfa2) + (0.020 ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ↪\n",
"↪ ↪\n",
"↪ ↪\n",
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"↪ 2 ↪\n",
"↪ ⋅(-0.0212200758868839⋅q_tfa1 - q_tfa2) + (0.0205928360022956⋅qₜₛₛ₁ + qₜₛₛ₂) ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ↪\n",
"↪ ↪\n",
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"↪ ⎛ 2 ↪\n",
"↪ ⋅qₜₛₛ₂)⋅⎝0.740286138287461⋅(-0.0212200758868839⋅q_tfa1 - q_tfa2) + (0.02059 ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ↪\n",
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"\n",
"↪ ⎛ ↪\n",
"↪ -0.5 ⎜ ↪\n",
"↪ 2 ⎞ 0.985809297667139⋅⎝1 ↪\n",
"↪ 5928360022956⋅qₜₛₛ₁ + qₜₛₛ₂) + 0.971819971366977⎠ ──────────────────── ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ↪\n",
"↪ ↪\n",
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"↪ -0.5 ↪\n",
"↪ 2 ⎞ ↪\n",
"↪ + 0.971819971366977⎠ ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ↪\n",
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"↪ -0.5 ↪\n",
"↪ 2 ⎞ 0.98580929 ↪\n",
"↪ 28360022956⋅qₜₛₛ₁ + qₜₛₛ₂) + 0.971819971366977⎠ ────────── ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ↪\n",
"↪ ↪\n",
"\n",
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"↪ ⎛ 2 ↪\n",
"↪ .01439497716895⋅⎝0.740286138287461⋅(-0.0212200758868839⋅q_tfa1 - q_tfa2) + ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ──────────────────────────────────────────────────────────────────────────── ↪\n",
"↪ ↪\n",
"↪ ↪\n",
"↪ ↪\n",
"↪ ↪\n",
"↪ ↪\n",
"↪ ↪\n",
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"↪ ⎛ ↪\n",
"↪ ⎜ 2 ⎛ ↪\n",
"↪ 7667139⋅⎝0.77271774862819⋅(-0.0212200758868839⋅q_tfa1 - q_tfa2) ⋅⎝0.74028613 ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ──────────────────────────────────────────────────────────────────────────── ↪\n",
"↪ ↪\n",
"↪ ↪\n",
"\n",
2025-04-11 10:37:09 +08:00
"↪ 0.5 ⎞ ↪\n",
"↪ 2 ⎞ ⎟ ↪\n",
"↪ (0.0205928360022956⋅qₜₛₛ₁ + qₜₛₛ₂) + 0.971819971366977⎠ - 1.0⎠⋅(-0.01852 ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ──────────────────────────────────────────────────────────────────────────── ↪\n",
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"↪ 0.761752341070088⋅(-0.0212200758 ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ↪\n",
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"↪ ⎛ ↪\n",
"↪ 0.985809297667139⋅(0.0208892694063927⋅qₜₛₛ₁ + 1.01439497716895⋅qₜₛₛ₂)⋅⎝0 ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ↪\n",
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"↪ 2 ↪\n",
"↪ 8287461⋅(-0.0212200758868839⋅q_tfa1 - q_tfa2) + (0.0205928360022956⋅qₜₛₛ₁ + ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ──────────────────────────────────────────────────────────────────────────── ↪\n",
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"↪ 0.761752341070088⋅(-0.0212200758 ↪\n",
"\n",
2025-04-02 15:53:40 +08:00
"↪ ↪\n",
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"↪ 05479452055⋅q_tfa1 - 0.872784246575343⋅q_tfa2)⋅(0.0208892694063927⋅qₜₛₛ₁ + 1 ↪\n",
"↪ ──────────────────────────────────────────────────────────────────────────── ↪\n",
"↪ 2 ↪\n",
"↪ 868839⋅q_tfa1 - q_tfa2) + 1.0289971697056⋅(0.0205928360022956⋅qₜₛₛ₁ + qₜₛₛ₂ ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ↪\n",
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"↪ 2 ↪\n",
"↪ .740286138287461⋅(-0.0212200758868839⋅q_tfa1 - q_tfa2) + (0.020592836002295 ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"↪ 0.5 ↪\n",
"↪ 2 ⎞ ↪\n",
"↪ qₜₛₛ₂) + 0.971819971366977⎠ + 1.0289971697056⋅(0.0205928360022956⋅qₜₛₛ₁ ↪\n",
"↪ ──────────────────────────────────────────────────────────────────────────── ↪\n",
"↪ 2 ↪\n",
"↪ 868839⋅q_tfa1 - q_tfa2) + 1.0289971697056⋅(0.0205928360022956⋅qₜₛₛ₁ + qₜₛₛ₂ ↪\n",
2025-04-02 15:53:40 +08:00
"\n",
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"↪ ⎛ ↪\n",
"↪ .01439497716895⋅qₜₛₛ₂)⋅⎝0.740286138287461⋅(-0.0212200758868839⋅q_tfa1 - q_tf ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ──────────────────────────────────────────────────────────────────────────── ↪\n",
2025-04-11 10:37:09 +08:00
"↪ 2 ↪\n",
"↪ ) ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"↪ -0.5 ↪\n",
"↪ 2 ⎞ ↪\n",
"↪ 6⋅qₜₛₛ₁ + qₜₛₛ₂) + 0.971819971366977⎠ ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ↪\n",
2025-04-11 10:37:09 +08:00
"↪ ⎞ ↪\n",
"↪ 2⎟ ⎛ 2 ↪\n",
"↪ + qₜₛₛ₂) ⎠⋅⎝0.740286138287461⋅(-0.0212200758868839⋅q_tfa1 - q_tfa2) + (0.0 ↪\n",
2025-04-02 15:53:40 +08:00
"↪ ──────────────────────────────────────────────────────────────────────────── ↪\n",
2025-04-11 10:37:09 +08:00
"↪ 2 ↪\n",
"↪ ) ↪\n",
2025-04-02 15:53:40 +08:00
"\n",
2025-04-11 10:37:09 +08:00
"↪ -0.5⎤\n",
"↪ 2 2 ⎞ ⎥\n",
"↪ a2) + (0.0205928360022956⋅qₜₛₛ₁ + qₜₛₛ₂) + 0.971819971366977⎠ ⎥\n",
"↪ ───────────────────────────────────────────────────────────────────⎥\n",
"↪ ⎥\n",
"↪ ⎥\n",
"↪ ⎥\n",
"↪ ⎥\n",
"↪ ⎥\n",
"↪ ⎥\n",
"↪ ⎥\n",
"↪ -0.5 ⎥\n",
"↪ 2 ⎞ ⎥\n",
"↪ 205928360022956⋅qₜₛₛ₁ + qₜₛₛ₂) + 0.971819971366977⎠ ⎥\n",
"↪ ──────────────────────────────────────────────────────── ⎥\n",
"↪ ⎥\n",
"↪ ⎦"
2025-03-28 09:27:28 +08:00
]
},
2025-04-11 10:37:09 +08:00
"execution_count": 148,
2025-03-28 09:27:28 +08:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"A = me.ReferenceFrame('A')\n",
"B = me.ReferenceFrame('B')\n",
"D = me.ReferenceFrame('D')\n",
"C = me.ReferenceFrame('C')\n",
"G = me.ReferenceFrame('G')\n",
"G_prime1 = me.ReferenceFrame('G_prime1')\n",
"G_prime2 = me.ReferenceFrame('G_prime2')\n",
"G_prime3 = me.ReferenceFrame('G_prime3')\n",
"# fast x-1, -y-3, z-2\n",
"\n",
"# 广义坐标\n",
2025-04-02 15:53:40 +08:00
"qtfa1, qtfa2, qtss1, qtss2, q_yaw, q_drtr, q_geaz, q_1f1, q_1f2, q_1e1, q_2f1, q_2f2, q_2e1, q_3f1, q_3f2, q_3e1 = me.dynamicsymbols('q_tfa1, q_tfa2, q_tss1, q_tss2, q_yaw, q_drtr, q_geaz, q_1f1, q_1f2, q_1e1, q_2f1, q_2f2, q_2e1, q_3f1, q_3f2, q_3e1')\n",
2025-03-28 09:27:28 +08:00
"# tower top\n",
2025-04-02 15:53:40 +08:00
"\n",
"frac = sm.symbols(\"frac\")\n",
"x = sm.symbols(\"x\")\n",
"L = sm.symbols(\"L\")\n",
"frac = x / L\n",
"\n",
"# afa12, afa13, afa14, afa15, afa16, afa22, afa23, afa24, afa25, afa26 = sm.symbols(\"a_fa12, a_fa13, a_fa14, a_fa15, a_fa16, a_fa22, a_fa23, a_fa24, a_fa25, a_fa26\")\n",
"# ass12, ass13, ass14, ass15, ass16, ass22, ass23, ass24, ass25, ass26 = sm.symbols(\"a_ss12, a_ss13, a_ss14, a_ss15, a_ss16, a_ss22, a_ss23, a_ss24, a_ss25, a_ss26\")\n",
"# tower modal\n",
"# FA 1\n",
"fa1 = 0.7004 * frac**2 + 2.1963 * frac**3 - 5.6202 * frac**4 + 6.2275 * frac**5 - 2.504 * frac**6\n",
"# FA 2\n",
"fa2 = -70.5319 * frac**2 -63.7623 * frac**3 +289.737 * frac**4 -176.513 * frac**5 +22.0706 * frac**6\n",
"\n",
"# SS1\n",
"ss1 = 1.385 * frac**2 -1.7684 * frac**3 +3.0871 * frac**4 -2.2395 * frac**5 +0.5357 * frac**6\n",
"# ss2\n",
"ss2 = -121.21 * frac**2 +184.415 * frac**3 -224.904 * frac**4 + 298.536 * frac**5 -135.838 * frac**6\n",
"\n",
"# fa1 = afa12 * frac**2 + afa13 * frac**3 + afa14 * frac**4 + afa15 * frac**5 + afa16 * frac**6\n",
"# fa2 = afa22 * frac**2 + afa23 * frac**3 + afa24 * frac**4 + afa25 * frac**5 + afa26 * frac**6\n",
"\n",
"# ss1 = ass12 * frac**2 + ass13 * frac**3 + ass14 * frac**4 + ass15 * frac**5 + ass16 * frac**6\n",
"# ss2 = ass22 * frac**2 + ass23 * frac**3 + ass24 * frac**4 + ass25 * frac**5 + ass26 * frac**6\n",
"\n",
"# 塔顶模态及导数\n",
"repl = {x: 87.6, L: 87.6}\n",
"fa1_d0 = shape_functions(fa1, 0).xreplace(repl)\n",
"fa1_d1 = shape_functions(fa1, 1).xreplace(repl) \n",
"fa1_d2 = shape_functions(fa1, 2).xreplace(repl) \n",
"\n",
"fa2_d0 = shape_functions(fa2, 0).xreplace(repl) \n",
"fa2_d1 = shape_functions(fa2, 1).xreplace(repl) \n",
"fa2_d2 = shape_functions(fa2, 2).xreplace(repl) \n",
"\n",
"ss1_d0 = shape_functions(ss1, 0).xreplace(repl) \n",
"ss1_d1 = shape_functions(ss1, 1).xreplace(repl) \n",
"ss1_d2 = shape_functions(ss1, 2).xreplace(repl) \n",
"\n",
"ss2_d0 = shape_functions(ss2, 0).xreplace(repl) \n",
"ss2_d1 = shape_functions(ss2, 1).xreplace(repl) \n",
"ss2_d2 = shape_functions(ss2, 2).xreplace(repl) \n",
"\n",
"theta_fa = - fa1_d1 * qtfa1 - fa2_d1 * qtfa2\n",
"theta_ss = ss1_d1 * qtss1 + ss2_d1 * qtss2\n",
"\n",
"dcm = smll_rot_trans(theta_ss, 0, theta_fa)\n",
2025-03-28 09:27:28 +08:00
"B.orient_dcm(A, dcm)\n",
"\n",
2025-04-11 10:37:09 +08:00
"B.dcm(A)"
]
},
{
"cell_type": "code",
"execution_count": 149,
"metadata": {},
"outputs": [
{
"data": {
"text/latex": [
"$\\displaystyle \\left[\\begin{matrix}\\cos{\\left(q_{yaw} \\right)} & 0 & - \\sin{\\left(q_{yaw} \\right)}\\\\0 & 1 & 0\\\\\\sin{\\left(q_{yaw} \\right)} & 0 & \\cos{\\left(q_{yaw} \\right)}\\end{matrix}\\right]$"
],
"text/plain": [
"⎡cos(q_yaw) 0 -sin(q_yaw)⎤\n",
"⎢ ⎥\n",
"⎢ 0 1 0 ⎥\n",
"⎢ ⎥\n",
"⎣sin(q_yaw) 0 cos(q_yaw) ⎦"
]
},
"execution_count": 149,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
2025-03-28 09:27:28 +08:00
"# nacelle\n",
"D.orient_axis(B, q_yaw, B.y)\n",
"\n",
"# shaft C \n",
"theta_tilt = sm.symbols(\"theta_tilt\")\n",
"C.orient_axis(D, theta_tilt, D.z)\n",
"\n",
"# Hub G = Azimuth E\n",
"Azimuth = q_drtr + q_geaz\n",
"G.orient_axis(C, Azimuth, C.x)\n",
"\n",
"# 到每只叶片\n",
"angle = 2*sm.pi/3\n",
"G_prime1.orient_axis(G, angle * 0, G.x)\n",
"G_prime2.orient_axis(G, angle * 1, G.x)\n",
"G_prime3.orient_axis(G, angle * 2, G.x)\n",
"\n",
2025-04-02 15:53:40 +08:00
"\n",
2025-04-11 10:37:09 +08:00
"D.dcm(B)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/latex": [
"$\\displaystyle 0$"
],
"text/plain": [
"0"
]
},
"execution_count": 153,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 叶片\n",
"blade_x = sm.symbols(\"Blade_x\")\n",
"Blade_L = sm.symbols(\"Blade_L\")\n",
"blade_frac = blade_x / Blade_L\n",
"bld_fl1 = 0.0622 * blade_frac**2 + 1.7254 * blade_frac**3 -3.2452 * blade_frac**4 + 4.7131 * blade_frac**5 -2.2555 * blade_frac**6\n",
"bld_fl2 = -0.5809 * blade_frac**2 + 1.2067 * blade_frac**3 -15.5349 * blade_frac**4 + 29.7347 * blade_frac**5 -13.8255 * blade_frac**6\n",
"bld_edge = 0.3627 * blade_frac**2 + 2.5337 * blade_frac**3 -3.5772 * blade_frac**4 + 2.376 * blade_frac**5 -0.6952 * blade_frac**6\n",
"\n",
"bld_fl1_d2 = shape_functions(bld_fl1, 2)\n",
"bld_fl2_d2 = shape_functions(bld_fl2, 2).xreplace({blade_x: 61.5, Blade_L: 61.5})\n",
"bld_edge_d2 = shape_functions(bld_edge, 2).xreplace({blade_x: 61.5, Blade_L: 61.5})\n",
"\n",
"twist_sf_fl1_2_cos = bld_fl1_d2 \n",
"twist_sf_fl1_2_sin = 0\n",
"\n",
"twist_sf_fl2_2_cos = bld_fl2_d2\n",
"twist_sf_fl2_2_sin = 0\n",
"\n",
"twist_sf_edge_2_cos = bld_edge_d2\n",
"twist_sf_edge_2_sin = 0\n",
"\n",
"bld_fl1_d2"
2025-03-28 09:27:28 +08:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 速度"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "MinerU",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.16"
}
},
"nbformat": 4,
"nbformat_minor": 2
}