I used Pythonista and Plotly, both on an iPhone, to perform the analysis and to produce the graphs.
https://scholar.google.com/citations?user=57nzdlcAAAAJ&hl=en
https://www.amazon.com/Finite-Element-Method-Engineers-Practice/dp/1842655531
https://www.lubbockonline.com/article/20150701/NEWS/307019685
Beam Problem — Hand Calculation
PDF LINK — beam analysis — hand calculations
The 5 page calculation in the PDF was done in 1983. The quidiagonal matrix solution was probably done with an HP-41 calculator program.
Beam Problem — Plotly Graph
LIVE LINK to HTML PAGE — using Plotly
The Plotly graph shows deflections, shears, and moments in the beam. Feel free to manipulate the graph elements.
This web page stands alone; once the web page is generated, it no longer needs Python or Plotly.
Click the ‘home’ icon to restore the graphs to the original settings.
Screenshot — Plotly Graph
Plotly — Python code
plotpadfactor = 0.25 # xvector — x positions # vvector — deflections # svector — shears # mvector — moments # convert these 2D arrays to vectors xvector = x_array[1:14, 0] vvector = v_array[1:14, 0] svector = shear[1:14] mvector = moment[1:14] fig = make_subplots( rows=3, cols=1, shared_xaxes=True, subplot_titles=("Deflection", "Shear", "Moment"), vertical_spacing=0.12 ) fig.add_trace( go.Scatter( x=xvector, y=vvector, name="Deflection", text=min_max_filter(vvector, 3), # texttemplate="%{y:.3f}", mode="lines+markers+text", textposition="top center", hovertemplate="Deflection: %{y:.3f}" + " x: %{x}", ), row=1, col=1, ) fig.add_trace( go.Scatter( x=xvector, y=svector, name="Shear", text="", texttemplate="%{y:.1f}", mode="lines+markers+text", textposition="top center", hovertemplate="Shear: %{y:.2f}" + " x: %{x}", ), row=2, col=1, ) fig.add_trace( go.Scatter( x=xvector, y=mvector, name="Moment", text="", texttemplate="%{y:.1f}", mode="lines+markers+text", textposition="top center", hovertemplate="Moment: %{y:.2f}" + " x: %{x}", ), row=3, col=1, ) fig['layout']['yaxis1'].update( # title_text="Deflection", range=min_max_factored(vvector, plotpadfactor), autorange=False ) fig['layout']['yaxis2'].update( # title_text="Deflection", range=min_max_factored(svector, plotpadfactor), autorange=False ) fig['layout']['yaxis3'].update( # title_text="Deflection", range=min_max_factored(mvector, plotpadfactor), autorange=False ) fig['layout']['yaxis1'].update( zeroline=True, zerolinewidth=2, zerolinecolor='sandybrown') fig['layout']['yaxis2'].update( zeroline=True, zerolinewidth=2, zerolinecolor='sandybrown') fig['layout']['yaxis3'].update( zeroline=True, zerolinewidth=2, zerolinecolor='sandybrown') fig.update_layout( autosize=False, width=500, height=700, margin=dict(l=40, r=40, b=60, t=120, pad=10), paper_bgcolor="linen", hoverlabel=dict(bgcolor="lightyellow"), title_text="Beam Analysis", showlegend=False ) fig['layout']['annotations'][0].update(x=0.10) fig['layout']['annotations'][1].update(x=0.10) fig['layout']['annotations'][2].update(x=0.10) # fig['layout']['annotations'][2].update(x=0.15, y=0.05 ) # fig.update_layout(hovermode='x unified') # fig.show() fig.write_html("num_method.html", auto_open=True)