Krut prizmatického prutu nekruhového průřezu

Pro případ prostého krutu prutu nekruhového průřezu je základním vztahem rovnice pro Saint-Venantovu funkci napětí $\Phi$,

\begin{equation} \frac{\partial^2\Phi}{\partial x^2}+\frac{\partial^2\Phi}{\partial y^2}=-2G\theta\quad\mathrm{pro}\,(x,y)\in\Omega \end{equation}

při okrajové podmínce

\begin{equation} \Phi=0\quad\mathrm{pro}\,(x,y)\in\partial\Omega. \end{equation}

Řešením této rovnice je Saint-Venantova funkce napětí $\Phi(x,y)$, pomocí níž lze výjádřit posuvy a napětí v libovolném bodě příčného průřezu. Problém je, že výše uvedená, tzv. Harmonická rovnice je řešitelná (kromě několika málo případů velmi jednoduché geometrie příčného průřezu) pouze numericky, např. Metodou hraničních prvků.

Problém je nalézt $\theta$, proto nejdříve vyřešíme rovnici

\begin{equation} \frac{\partial^2\Phi_1}{\partial x^2}+\frac{\partial^2\Phi_1}{\partial y^2}=1, \end{equation}

kde

\begin{equation} \Phi_1=-\frac{1}{2G\theta}\Phi. \end{equation}

Pro výsledný kroutící moment platí

\begin{equation} M_k=2{\int\int}_\Omega\Phi\mathrm{d}x\mathrm{d}y=-4G\theta{\int\int}_\Omega\Phi_1\mathrm{d}x\mathrm{d}y, \end{equation}

odkud

\begin{equation} \theta=-\frac{M_k}{2GM_1}, \end{equation}

kde

\begin{equation} M_1=2{\int\int}_\Omega\Phi_1\mathrm{d}x\mathrm{d}y. \end{equation}

Pro smykové složky $\tau_{zx}$ a $\tau_{zy}$ tenzoru napětí platí

\begin{eqnarray} &&\tau_{zx}=\frac{\partial\Phi}{\partial y}=-2G\theta\frac{\partial\Phi_1}{\partial y}, \\ &&\tau_{zy}=-\frac{\partial\Phi}{\partial x}=2G\theta\frac{\partial\Phi_1}{\partial x}. \end{eqnarray}

Z Hookeova zákona se vyjádří posuv $w$ ve směru osy $z$

\begin{eqnarray} \tau_{zx}=G\left(\frac{\partial w}{\partial x}-\theta y\right), \tau_{zy}=G\left(\frac{\partial w}{\partial y}+\theta x\right). \end{eqnarray}

Z těchto vztahů plyne

\begin{equation} w=\int\left( \frac{1}{G}\tau_{zx}+\theta y\right) \mathrm{d}x+g(y) \end{equation}

nebo

\begin{equation} w=\int\left(\frac{1}{G}\tau_{zy}-\theta x\right)\mathrm{d}y+h(x). \end{equation}

Funkce $g(y)$ a $h(x)$ se položí rovny nule, tedy

\begin{equation} w=\frac{1}{G}\int\tau_{zx}\mathrm{d}x+\theta xy \end{equation}

nebo

\begin{equation} w=\frac{1}{G}\int\tau_{zy}\mathrm{d}y-\theta xy. \end{equation}

Dále jsou uvedeny konečnoprvkové výsledky řešení výše uvedené Saint-Venantovy rovnice pro obdélníkový průřez o rozměrech $h:b=5:1$ zatíženého jednotkovým krouticím momentem.

Načtení potřebných knihoven,

In [7]:
%matplotlib inline
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt

Načtení hodnot Saint-Venantovi funkce $\Phi\left(x,y\right)$ se souboru krut_Phi.dat,

In [6]:
x,y,z=[],[],[]
with open('krut_Phi.dat','r') as f:
  f.readline()
  for ii in f:
    x.append(float(ii.split()[0]))
    y.append(float(ii.split()[1]))
    z.append(float(ii.split()[2]))

Vykreslení funkce $\Phi\left(x,y\right)$,

In [8]:
fig = plt.figure(figsize=(10,10))
ax = fig.gca(projection='3d')
ax.set_xlim3d(-2.5,2.5)
ax.set_ylim3d(-2.5,2.5)
ax.set_zlim3d(-1,1)
ax.set_xlabel('$x$').set_fontsize(18)
ax.set_ylabel('$y$').set_fontsize(18)
ax.set_zlabel('$\Phi$').set_fontsize(18)
ax.set_title('Saint-Venantova funkce $\Phi(x,y)$').set_fontsize(18)

ax.plot_trisurf(x, y, z, cmap=cm.jet, linewidth=0.2)
Out[8]:
<mpl_toolkits.mplot3d.art3d.Poly3DCollection at 0x7fd3403d79d0>

Načtení hodnot napětí $\tau_{zx}$ ze souboru tzx.dat,

In [9]:
x,y,z=[],[],[]
with open('tzx.dat','r') as f:
  f.readline()
  for ii in f:
    x.append(float(ii.split()[0]))
    y.append(float(ii.split()[1]))
    z.append(float(ii.split()[2]))

Vykreslení průbehu napětí $\tau_{zx}$,

In [10]:
fig = plt.figure(figsize=(10,10))
ax = fig.gca(projection='3d')
ax.set_xlim3d(-2.5,2.5)
ax.set_ylim3d(-2.5,2.5)
ax.set_zlim3d(-5,5)
ax.set_xlabel('$x$').set_fontsize(18)
ax.set_ylabel('$y$').set_fontsize(18)
ax.set_zlabel(r'$\tau_{zx}$').set_fontsize(18)
ax.set_title('Napeti '+r'$\tau_{zx}$').set_fontsize(18)

ax.plot_trisurf(x, y, z, cmap=cm.jet, linewidth=0.2)
Out[10]:
<mpl_toolkits.mplot3d.art3d.Poly3DCollection at 0x7fd3403d8110>

Načtení hodnot napětí $\tau_{zy}$ ze souboru tzy.dat,

In [12]:
x,y,z=[],[],[]
with open('tzy.dat','r') as f:
  f.readline()
  for ii in f:
    x.append(float(ii.split()[0]))
    y.append(float(ii.split()[1]))
    z.append(float(ii.split()[2]))

Vykreslení průbehu napětí $\tau_{zy}$,

In [13]:
fig = plt.figure(figsize=(10,10))
ax = fig.gca(projection='3d')
ax.set_xlim3d(-2.5,2.5)
ax.set_ylim3d(-2.5,2.5)
ax.set_zlim3d(-5,5)
ax.set_xlabel('$x$').set_fontsize(18)
ax.set_ylabel('$y$').set_fontsize(18)
ax.set_zlabel(r'$\tau_{zy}$').set_fontsize(18)
ax.set_title('Napeti '+r'$\tau_{zy}$').set_fontsize(18)

ax.plot_trisurf(x, y, z, cmap=cm.jet, linewidth=0.2)
Out[13]:
<mpl_toolkits.mplot3d.art3d.Poly3DCollection at 0x7fd33d598810>

Načtení hodnot posuvů $u$ ve směru osy $x$ ze souboru u1.dat,

In [14]:
x,y,z=[],[],[]
with open('u1.dat','r') as f:
  f.readline()
  for ii in f:
    x.append(float(ii.split()[0]))
    y.append(float(ii.split()[1]))
    z.append(float(ii.split()[2]))

Vykreslení deformovaného příčného průřezu,

In [16]:
fig = plt.figure(figsize=(10,10))
ax = fig.gca(projection='3d')
ax.set_xlim3d(-2.5,2.5)
ax.set_ylim3d(-2.5,2.5)
ax.ticklabel_format(style='sci', axis='z', scilimits=(0,0))
ax.set_zlim3d(-0.0001,0.0001)
ax.set_xlabel('$y$').set_fontsize(18)
ax.set_ylabel('$z$').set_fontsize(18)
ax.set_zlabel('$u$').set_fontsize(18)
ax.set_title('Posuv '+r'$u$').set_fontsize(18)

ax.plot_trisurf(x, y, z, cmap=cm.jet, linewidth=0.2)
Out[16]:
<mpl_toolkits.mplot3d.art3d.Poly3DCollection at 0x7fd33d441190>

Načtení hodnot posuvů $u$ ve směru osy $x$ ze souboru u2.dat,

In [17]:
x,y,z=[],[],[]
with open('u2.dat','r') as f:
  f.readline()
  for ii in f:
    x.append(float(ii.split()[0]))
    y.append(float(ii.split()[1]))
    z.append(float(ii.split()[2]))

Vykreslení deformovaného příčného průřezu,

In [18]:
fig = plt.figure(figsize=(10,10))
ax = fig.gca(projection='3d')
ax.set_xlim3d(-2.5,2.5)
ax.set_ylim3d(-2.5,2.5)
ax.ticklabel_format(style='sci', axis='z', scilimits=(0,0))
ax.set_zlim3d(-0.0001,0.0001)
ax.set_xlabel('$y$').set_fontsize(18)
ax.set_ylabel('$z$').set_fontsize(18)
ax.set_zlabel('$u$').set_fontsize(18)
ax.set_title('Posuv '+r'$u$').set_fontsize(18)

ax.plot_trisurf(x, y, z, cmap=cm.jet, linewidth=0.2)
Out[18]:
<mpl_toolkits.mplot3d.art3d.Poly3DCollection at 0x7fd33d431050>
In [ ]: