Skip to content
Permalink
master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# CompMech04-Linear Algebra Project\n",
"# Practical Linear Algebra for Finite Element Analysis\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this project we will perform a linear-elastic finite element analysis (FEA) on a support structure made of 11 beams that are riveted in 7 locations to create a truss as shown in the image below. \n",
"\n",
"![Mesh image of truss](../images/mesh.png)\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The triangular truss shown above can be modeled using a [direct stiffness method [1]](https://en.wikipedia.org/wiki/Direct_stiffness_method), that is detailed in the [extra-FEA_material](./extra-FEA_material.ipynb) notebook. The end result of converting this structure to a FE model. Is that each joint, labeled $n~1-7$, short for _node 1-7_ can move in the x- and y-directions, but causes a force modeled with Hooke's law. Each beam labeled $el~1-11$, short for _element 1-11_, contributes to the stiffness of the structure. We have 14 equations where the sum of the components of forces = 0, represented by the equation\n",
"\n",
"$\\mathbf{F-Ku}=\\mathbf{0}$\n",
"\n",
"Where, $\\mathbf{F}$ are externally applied forces, $\\mathbf{u}$ are x- and y- displacements of nodes, and $\\mathbf{K}$ is the stiffness matrix given in `fea_arrays.npz` as `K`, shown below\n",
"\n",
"_note: the array shown is 1000x(`K`). You can use units of MPa (N/mm^2), N, and mm. The array `K` is in 1/mm_\n",
"\n",
"$\\mathbf{K}=EA*$\n",
"\n",
"$ \\left[ \\begin{array}{cccccccccccccc}\n",
" 4.2 & 1.4 & -0.8 & -1.4 & -3.3 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 \\\\\n",
" 1.4 & 2.5 & -1.4 & -2.5 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 \\\\\n",
" -0.8 & -1.4 & 5.0 & 0.0 & -0.8 & 1.4 & -3.3 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 \\\\\n",
" -1.4 & -2.5 & 0.0 & 5.0 & 1.4 & -2.5 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 \\\\\n",
" -3.3 & 0.0 & -0.8 & 1.4 & 8.3 & 0.0 & -0.8 & -1.4 & -3.3 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 \\\\\n",
" 0.0 & 0.0 & 1.4 & -2.5 & 0.0 & 5.0 & -1.4 & -2.5 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 \\\\\n",
" 0.0 & 0.0 & -3.3 & 0.0 & -0.8 & -1.4 & 8.3 & 0.0 & -0.8 & 1.4 & -3.3 & 0.0 & 0.0 & 0.0 \\\\\n",
" 0.0 & 0.0 & 0.0 & 0.0 & -1.4 & -2.5 & 0.0 & 5.0 & 1.4 & -2.5 & 0.0 & 0.0 & 0.0 & 0.0 \\\\\n",
" 0.0 & 0.0 & 0.0 & 0.0 & -3.3 & 0.0 & -0.8 & 1.4 & 8.3 & 0.0 & -0.8 & -1.4 & -3.3 & 0.0 \\\\\n",
" 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 1.4 & -2.5 & 0.0 & 5.0 & -1.4 & -2.5 & 0.0 & 0.0 \\\\\n",
" 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & -3.3 & 0.0 & -0.8 & -1.4 & 5.0 & 0.0 & -0.8 & 1.4 \\\\\n",
" 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & -1.4 & -2.5 & 0.0 & 5.0 & 1.4 & -2.5 \\\\\n",
" 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & -3.3 & 0.0 & -0.8 & 1.4 & 4.2 & -1.4 \\\\\n",
" 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 0.0 & 1.4 & -2.5 & -1.4 & 2.5 \\\\\n",
"\\end{array}\\right]~\\frac{1}{m}$"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 0.00416667, 0.00144338, -0.00083333, -0.00144338, -0.00333333,\n",
" 0. , 0. , 0. , 0. , 0. ,\n",
" 0. , 0. , 0. , 0. ],\n",
" [ 0.00144338, 0.0025 , -0.00144338, -0.0025 , 0. ,\n",
" 0. , 0. , 0. , 0. , 0. ,\n",
" 0. , 0. , 0. , 0. ],\n",
" [-0.00083333, -0.00144338, 0.005 , 0. , -0.00083333,\n",
" 0.00144338, -0.00333333, 0. , 0. , 0. ,\n",
" 0. , 0. , 0. , 0. ],\n",
" [-0.00144338, -0.0025 , 0. , 0.005 , 0.00144338,\n",
" -0.0025 , 0. , 0. , 0. , 0. ,\n",
" 0. , 0. , 0. , 0. ],\n",
" [-0.00333333, 0. , -0.00083333, 0.00144338, 0.00833333,\n",
" 0. , -0.00083333, -0.00144338, -0.00333333, 0. ,\n",
" 0. , 0. , 0. , 0. ],\n",
" [ 0. , 0. , 0.00144338, -0.0025 , 0. ,\n",
" 0.005 , -0.00144338, -0.0025 , 0. , 0. ,\n",
" 0. , 0. , 0. , 0. ],\n",
" [ 0. , 0. , -0.00333333, 0. , -0.00083333,\n",
" -0.00144338, 0.00833333, 0. , -0.00083333, 0.00144338,\n",
" -0.00333333, 0. , 0. , 0. ],\n",
" [ 0. , 0. , 0. , 0. , -0.00144338,\n",
" -0.0025 , 0. , 0.005 , 0.00144338, -0.0025 ,\n",
" 0. , 0. , 0. , 0. ],\n",
" [ 0. , 0. , 0. , 0. , -0.00333333,\n",
" 0. , -0.00083333, 0.00144338, 0.00833333, 0. ,\n",
" -0.00083333, -0.00144338, -0.00333333, 0. ],\n",
" [ 0. , 0. , 0. , 0. , 0. ,\n",
" 0. , 0.00144338, -0.0025 , 0. , 0.005 ,\n",
" -0.00144338, -0.0025 , 0. , 0. ],\n",
" [ 0. , 0. , 0. , 0. , 0. ,\n",
" 0. , -0.00333333, 0. , -0.00083333, -0.00144338,\n",
" 0.005 , 0. , -0.00083333, 0.00144338],\n",
" [ 0. , 0. , 0. , 0. , 0. ,\n",
" 0. , 0. , 0. , -0.00144338, -0.0025 ,\n",
" 0. , 0.005 , 0.00144338, -0.0025 ],\n",
" [ 0. , 0. , 0. , 0. , 0. ,\n",
" 0. , 0. , 0. , -0.00333333, 0. ,\n",
" -0.00083333, 0.00144338, 0.00416667, -0.00144338],\n",
" [ 0. , 0. , 0. , 0. , 0. ,\n",
" 0. , 0. , 0. , 0. , 0. ,\n",
" 0.00144338, -0.0025 , -0.00144338, 0.0025 ]])"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"fea_arrays = np.load('./fea_arrays.npz')\n",
"K=fea_arrays['K']\n",
"K"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this project we are solving the problem, $\\mathbf{F}=\\mathbf{Ku}$, where $\\mathbf{F}$ is measured in Newtons, $\\mathbf{K}$ `=E*A*K` is the stiffness in N/mm, `E` is Young's modulus measured in MPa (N/mm^2), and `A` is the cross-sectional area of the beam measured in mm^2. \n",
"\n",
"There are three constraints on the motion of the joints:\n",
"\n",
"i. node 1 displacement in the x-direction is 0 = `u[0]`\n",
"\n",
"ii. node 1 displacement in the y-direction is 0 = `u[1]`\n",
"\n",
"iii. node 7 displacement in the y-direction is 0 = `u[13]`\n",
"\n",
"We can satisfy these constraints by leaving out the first, second, and last rows and columns from our linear algebra description. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1. Calculate the condition of `K` and the condition of `K[2:13,2:13]`. \n",
"\n",
"a. What error would you expect when you solve for `u` in `K*u = F`? \n",
"\n",
"b. Why is the condition of `K` so large?\n",
"\n",
"c. What error would you expect when you solve for `u[2:13]` in `K[2:13,2:13]*u=F[2:13]`"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1.4577532625238035e+17"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Part a\n",
"np.linalg.cond(K)"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The expected error for the matrix is 10\n",
"The condition of K is so large because of the dimensions of the K matrix\n"
]
},
{
"data": {
"text/plain": [
"52.23542514351006"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print('The expected error for the matrix is', 10**(17-16))\n",
"#Part b\n",
"print('The condition of K is so large because of the dimensions of the K matrix')\n",
"#Part c\n",
"np.linalg.cond(K[2:13,2:13])"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The error expected for u[2:13,2:13] is 1e-15\n"
]
}
],
"source": [
"#Note that 52 = 5.2e+01\n",
"print('The error expected for u[2:13,2:13] is', 10**(1-16))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2. Apply a 100-N downward force to the central top node (n 4)\n",
"\n",
"a. Create the LU matrix for K[2:13,2:13]\n",
"\n",
"b. Use cross-sectional area of $0.1~mm^2$ and steel and almuminum moduli, $E=200~GPa~and~E=70~GPa,$ respectively. Solve the forward and backward substitution methods for \n",
"\n",
"* $\\mathbf{Ly}=\\mathbf{F}\\frac{1}{EA}$\n",
"\n",
"* $\\mathbf{Uu}=\\mathbf{y}$\n",
"\n",
"_your array `F` is zeros, except for `F[5]=-100`, to create a -100 N load at node 4._\n",
"\n",
"c. Plug in the values for $\\mathbf{u}$ into the full equation, $\\mathbf{Ku}=\\mathbf{F}$, to solve for the reaction forces\n",
"\n",
"d. Create a plot of the undeformed and deformed structure with the displacements and forces plotted as vectors (via `quiver`). Your result for aluminum should match the following result from [extra-FEA_material](./extra-FEA_material.ipynb). _note: The scale factor is applied to displacements $\\mathbf{u}$, not forces._\n",
"\n",
"![Deformed structure with loads applied](../images/deformed_truss.png)"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"U_al is [ 5.56730617 -6.07142857 1.23717915 -11.42857143 3.09294787\n",
" -15.35714286 4.94871659 -11.42857143 0.61858957 -6.07142857\n",
" 6.18589574]\n",
"U_st is [ 1.94855716 -2.125 0.4330127 -4. 1.08253175 -5.375\n",
" 1.73205081 -4. 0.21650635 -2.125 2.16506351]\n",
"The Reaction Forces for Aluminum are [[ 0.02783653 -0. -0.00103098 -0.01649572 -0.01030983 -0.\n",
" 0. -0. 0. -0. 0. ]\n",
" [ 0. -0.03035714 0.00178571 0.02857143 0. -0.\n",
" 0. -0. 0. -0. 0. ]\n",
" [-0.00463942 -0.00876335 0.01030983 -0. -0.00257746 0.02216613\n",
" -0.01649572 -0. 0. -0. 0. ]\n",
" [ 0.00803571 0.01517857 0. -0.05714286 -0.00446429 0.03839286\n",
" 0. -0. 0. -0. 0. ]\n",
" [-0.01855769 -0. -0.00103098 0.01649572 0.02577457 -0.\n",
" -0.00412393 -0.01649572 -0.00206197 -0. 0. ]\n",
" [ 0. -0. -0.00178571 0.02857143 0. -0.07678571\n",
" 0.00714286 0.02857143 0. -0. 0. ]\n",
" [ 0. -0. -0.00412393 -0. -0.00257746 -0.02216613\n",
" 0.0412393 -0. -0.00051549 0.00876335 -0.02061965]\n",
" [ 0. -0. 0. -0. 0.00446429 0.03839286\n",
" 0. -0.05714286 -0.00089286 0.01517857 0. ]\n",
" [ 0. -0. 0. -0. -0.01030983 -0.\n",
" -0.00412393 0.01649572 0.00309295 -0. -0.00515491]\n",
" [ 0. -0. 0. -0. 0. -0.\n",
" -0.00714286 0.02857143 0. -0.03035714 0.00892857]\n",
" [ 0. -0. 0. -0. 0. -0.\n",
" -0.01649572 -0. -0.00051549 -0.00876335 0.02577457]]\n",
"The Reaction Forces for Steel are [[ 0.00974279 -0. -0.00036084 -0.0057735 -0.00360844 -0.\n",
" 0. -0. 0. -0. 0. ]\n",
" [ 0. -0.010625 0.000625 0.01 0. -0.\n",
" 0. -0. 0. -0. 0. ]\n",
" [-0.0016238 -0.00306717 0.00360844 -0. -0.00090211 0.00775814\n",
" -0.0057735 -0. 0. -0. 0. ]\n",
" [ 0.0028125 0.0053125 0. -0.02 -0.0015625 0.0134375\n",
" 0. -0. 0. -0. 0. ]\n",
" [-0.00649519 -0. -0.00036084 0.0057735 0.0090211 -0.\n",
" -0.00144338 -0.0057735 -0.00072169 -0. 0. ]\n",
" [ 0. -0. -0.000625 0.01 0. -0.026875\n",
" 0.0025 0.01 0. -0. 0. ]\n",
" [ 0. -0. -0.00144338 -0. -0.00090211 -0.00775814\n",
" 0.01443376 -0. -0.00018042 0.00306717 -0.00721688]\n",
" [ 0. -0. 0. -0. 0.0015625 0.0134375\n",
" 0. -0.02 -0.0003125 0.0053125 0. ]\n",
" [ 0. -0. 0. -0. -0.00360844 -0.\n",
" -0.00144338 0.0057735 0.00108253 -0. -0.00180422]\n",
" [ 0. -0. 0. -0. 0. -0.\n",
" -0.0025 0.01 0. -0.010625 0.003125 ]\n",
" [ 0. -0. 0. -0. 0. -0.\n",
" -0.0057735 -0. -0.00018042 -0.00306717 0.0090211 ]]\n"
]
}
],
"source": [
"#Part a\n",
"#From notebook 2\n",
"def LUNaive(A):\n",
" [m,n] = np.shape(A)\n",
" if m!=n: error('Matrix A must be square')\n",
" nb = n+1\n",
" # Gauss Elimination\n",
" U = A.astype(float)\n",
" L = np.eye(n)\n",
"\n",
" for k in range(0,n-1):\n",
" for i in range(k+1,n):\n",
" if U[k,k] != 0.0:\n",
" factor = U[i,k]/U[k,k]\n",
" L[i,k]=factor\n",
" U[i,:] = U[i,:] - factor*U[k,:]\n",
" return L,U\n",
"L2,U2 = LUNaive(K[2:13,2:13])\n",
"#Part b\n",
"A2 = .1\n",
"E_al = 70000\n",
"E_st = 200000\n",
"F = np.array([0,0,0,0,0,-100,0,0,0,0,0])\n",
"F_al = F/(E_al*A2)\n",
"F_st = F/(E_st*A2)\n",
"#From notebook 2\n",
"def solveLU(L,U,b):\n",
" n=len(b)\n",
" x=np.zeros(n)\n",
" y=np.zeros(n) \n",
" # forward substitution\n",
" for k in range(0,n):\n",
" y[k] = b[k] - L[k,0:k]@y[0:k]\n",
" # backward substitution\n",
" for k in range(n-1,-1,-1):\n",
" x[k] = (y[k] - U[k,k+1:n]@x[k+1:n])/U[k,k]\n",
" return x\n",
"U_al = solveLU(L2,U2,F_al)\n",
"U_st = solveLU(L2,U2,F_st)\n",
"print('U_al is', U_al)\n",
"print('U_st is', U_st)\n",
"#Part c\n",
"F_al = K[2:13,2:13]*U_al\n",
"F_st = K[2:13,2:13]*U_st\n",
"print('The Reaction Forces for Aluminum are', F_al)\n",
"print('The Reaction Forces for Steel are', F_st)"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 720x360 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"l = 300\n",
"nodes = np.array([[1,0,0],[2,0.5,3**0.5/2],[3,1,0],[4,1.5,3**0.5/2],[5,2,0],[6,2.5,3**0.5/2],[7,3,0]])\n",
"nodes[:,1:3]*=l\n",
"elems = np.array([[1,1,2],[2,2,3],[3,1,3],[4,2,4],[5,3,4],[6,3,5],[7,4,5],[8,4,6],[9,5,6],[10,5,7],[11,6,7]])\n",
"ix = 2*np.block([[np.arange(0,5)],[np.arange(1,6)],[np.arange(2,7)],[np.arange(0,5)]])\n",
"iy = ix+1\n",
"r = np.block([n[1:3] for n in nodes])\n",
"s = 5\n",
"U_Al = np.zeros(2*len(nodes))\n",
"plt.figure(figsize = (10,5))\n",
"plt.plot(r[ix],r[iy],'-',color='k')\n",
"plt.plot(r[ix]+U_Al[ix]*s,r[iy]+U_Al[iy]*s,'o',color='b')\n",
"plt.quiver(r[ix],r[iy],U_Al[ix],U_Al[iy],color=(1,0,0,1),label='applied forces')\n",
"plt.quiver(r[ix],r[iy],U_Al[ix],U_Al[iy],color=(0,0,1,1),label='displacements')\n",
"plt.xlabel('x (mm)')\n",
"plt.ylabel('y (mm)');"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 720x360 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"U_St = np.zeros(2*len(nodes))\n",
"plt.figure(figsize = (10,5))\n",
"plt.plot(r[ix],r[iy],'-',color='k')\n",
"plt.plot(r[ix]+U_St[ix]*s,r[iy]+U_St[iy]*s,'o',color='b')\n",
"plt.quiver(r[ix],r[iy],U_St[ix],U_St[iy],color=(1,0,0,1),label='applied forces')\n",
"plt.quiver(r[ix],r[iy],U_St[ix],U_St[iy],color=(0,0,1,1),label='displacements')\n",
"plt.xlabel('x (mm)')\n",
"plt.ylabel('y (mm)');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3. Determine cross-sectional area\n",
"\n",
"a. Using aluminum, what is the minimum cross-sectional area to keep total y-deflections $<0.2~mm$?\n",
"\n",
"b. Using steel, what is the minimum cross-sectional area to keep total y-deflections $<0.2~mm$?\n",
"\n",
"c. What are the weights of the aluminum and steel trusses with the chosed cross-sectional areas?\n",
"\n",
"d. The current price (2020/03) of [aluminum](https://tradingeconomics.com/commodity/aluminum) is 1545 dollars/Tonne and [steel](https://tradingeconomics.com/commodity/steel) is 476 dollars/Tonne [2]. Which material is cheaper to create the truss?"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"7.681081081081081\n",
"7.690990990990992\n",
"7.700900900900901\n",
"7.710810810810811\n",
"7.720720720720721\n",
"7.730630630630631\n",
"7.740540540540541\n",
"7.750450450450451\n",
"7.760360360360361\n",
"7.770270270270271\n",
"7.780180180180181\n",
"7.79009009009009\n",
"7.800000000000001\n",
"7.80990990990991\n",
"7.819819819819821\n",
"7.82972972972973\n",
"7.83963963963964\n",
"7.84954954954955\n",
"7.85945945945946\n",
"7.86936936936937\n",
"7.87927927927928\n",
"7.88918918918919\n",
"7.899099099099099\n",
"7.90900900900901\n",
"7.918918918918919\n",
"7.92882882882883\n",
"7.938738738738739\n",
"7.948648648648649\n",
"7.958558558558559\n",
"7.968468468468469\n",
"7.978378378378379\n",
"7.988288288288289\n",
"7.998198198198199\n",
"8.00810810810811\n",
"8.018018018018019\n",
"8.027927927927928\n",
"8.03783783783784\n",
"8.04774774774775\n",
"8.057657657657659\n",
"8.067567567567568\n",
"8.077477477477478\n",
"8.087387387387388\n",
"8.097297297297299\n",
"8.107207207207209\n",
"8.117117117117118\n",
"8.127027027027028\n",
"8.136936936936937\n",
"8.146846846846847\n",
"8.156756756756756\n",
"8.166666666666668\n",
"8.176576576576577\n",
"8.186486486486487\n",
"8.196396396396397\n",
"8.206306306306306\n",
"8.216216216216218\n",
"8.226126126126127\n",
"8.236036036036037\n",
"8.245945945945946\n",
"8.255855855855856\n",
"8.265765765765765\n",
"8.275675675675677\n",
"8.285585585585586\n",
"8.295495495495496\n",
"8.305405405405406\n",
"8.315315315315315\n",
"8.325225225225227\n",
"8.335135135135136\n",
"8.345045045045046\n",
"8.354954954954955\n",
"8.364864864864865\n",
"8.374774774774774\n",
"8.384684684684686\n",
"8.394594594594595\n",
"8.404504504504505\n",
"8.414414414414415\n",
"8.424324324324324\n",
"8.434234234234236\n",
"8.444144144144145\n",
"8.454054054054055\n",
"8.463963963963964\n",
"8.473873873873874\n",
"8.483783783783784\n",
"8.493693693693695\n",
"8.503603603603604\n",
"8.513513513513514\n",
"8.523423423423424\n",
"8.533333333333333\n",
"8.543243243243245\n",
"8.553153153153154\n",
"8.563063063063064\n",
"8.572972972972973\n",
"8.582882882882883\n",
"8.592792792792794\n",
"8.602702702702704\n",
"8.612612612612613\n",
"8.622522522522523\n",
"8.632432432432433\n",
"8.642342342342342\n",
"8.652252252252254\n",
"8.662162162162163\n",
"8.672072072072073\n",
"8.681981981981982\n",
"8.691891891891892\n",
"8.701801801801803\n",
"8.711711711711713\n",
"8.721621621621622\n",
"8.731531531531532\n",
"8.741441441441442\n",
"8.751351351351351\n",
"8.761261261261263\n",
"8.771171171171172\n",
"8.781081081081082\n",
"8.790990990990991\n",
"8.800900900900901\n",
"8.810810810810812\n",
"8.820720720720722\n",
"8.830630630630631\n",
"8.840540540540541\n",
"8.85045045045045\n",
"8.86036036036036\n",
"8.870270270270272\n",
"8.880180180180181\n",
"8.89009009009009\n",
"8.9\n",
"8.90990990990991\n",
"8.919819819819821\n",
"8.929729729729731\n",
"8.93963963963964\n",
"8.94954954954955\n",
"8.95945945945946\n",
"8.96936936936937\n",
"8.97927927927928\n",
"8.98918918918919\n",
"8.9990990990991\n",
"9.00900900900901\n",
"9.018918918918919\n",
"9.02882882882883\n",
"9.03873873873874\n",
"9.04864864864865\n",
"9.058558558558559\n",
"9.068468468468469\n",
"9.078378378378378\n",
"9.08828828828829\n",
"9.0981981981982\n",
"9.108108108108109\n",
"9.118018018018018\n",
"9.127927927927928\n",
"9.13783783783784\n",
"9.147747747747749\n",
"9.157657657657658\n",
"9.167567567567568\n",
"9.177477477477478\n",
"9.187387387387387\n",
"9.197297297297299\n",
"9.207207207207208\n",
"9.217117117117118\n",
"9.227027027027027\n",
"9.236936936936937\n",
"9.246846846846848\n",
"9.256756756756758\n",
"9.266666666666667\n",
"9.276576576576577\n",
"9.286486486486487\n",
"9.296396396396396\n",
"9.306306306306308\n",
"9.316216216216217\n",
"9.326126126126127\n",
"9.336036036036036\n",
"9.345945945945946\n",
"9.355855855855857\n",
"9.365765765765767\n",
"9.375675675675677\n",
"9.385585585585586\n",
"9.395495495495496\n",
"9.405405405405405\n",
"9.415315315315317\n",
"9.425225225225226\n",
"9.435135135135136\n",
"9.445045045045045\n",
"9.454954954954955\n",
"9.464864864864866\n",
"9.474774774774776\n",
"9.484684684684686\n",
"9.494594594594595\n",
"9.504504504504505\n",
"9.514414414414414\n",
"9.524324324324326\n",
"9.534234234234235\n",
"9.544144144144145\n",
"9.554054054054054\n",
"9.563963963963964\n",
"9.573873873873875\n",
"9.583783783783785\n",
"9.593693693693695\n",
"9.603603603603604\n",
"9.613513513513514\n",
"9.623423423423423\n",
"9.633333333333335\n",
"9.643243243243244\n",
"9.653153153153154\n",
"9.663063063063063\n",
"9.672972972972973\n",
"9.682882882882884\n",
"9.692792792792794\n",
"9.702702702702704\n",
"9.712612612612613\n",
"9.722522522522523\n",
"9.732432432432434\n",
"9.742342342342344\n",
"9.752252252252253\n",
"9.762162162162163\n",
"9.772072072072072\n",
"9.781981981981982\n",
"9.791891891891893\n",
"9.801801801801803\n",
"9.811711711711713\n",
"9.821621621621622\n",
"9.831531531531532\n",
"9.841441441441443\n",
"9.851351351351353\n",
"9.861261261261262\n",
"9.871171171171172\n",
"9.881081081081081\n",
"9.890990990990991\n",
"9.900900900900902\n",
"9.910810810810812\n",
"9.920720720720722\n",
"9.930630630630631\n",
"9.94054054054054\n",
"9.950450450450452\n",
"9.960360360360362\n",
"9.970270270270271\n",
"9.98018018018018\n",
"9.99009009009009\n",
"10.0\n"
]
}
],
"source": [
"#Part a\n",
"A3 = np.linspace(.1,10,1000);\n",
"for i in range (0,1000):\n",
" F_al = F/(E_al*A3[i]);\n",
" U_al = solveLU(L2,U2,F_al);\n",
" U_al3 = U_al[1::2];\n",
" if min(U_al3)>-.2:\n",
" print((A3[i]))"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The minimum cross-sectional area for aluminum is 7.681 mm^2\n"
]
}
],
"source": [
"A3_al = 7.681\n",
"print('The minimum cross-sectional area for aluminum is', A3_al, 'mm^2')"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2.6963963963963966\n",
"2.7063063063063066\n",
"2.7162162162162167\n",
"2.7261261261261267\n",
"2.7360360360360363\n",
"2.7459459459459463\n",
"2.7558558558558564\n",
"2.765765765765766\n",
"2.775675675675676\n",
"2.785585585585586\n",
"2.795495495495496\n",
"2.8054054054054056\n",
"2.8153153153153156\n",
"2.8252252252252257\n",
"2.8351351351351357\n",
"2.8450450450450453\n",
"2.8549549549549553\n",
"2.8648648648648654\n",
"2.8747747747747754\n",
"2.884684684684685\n",
"2.894594594594595\n",
"2.904504504504505\n",
"2.9144144144144146\n",
"2.9243243243243247\n",
"2.9342342342342347\n",
"2.9441441441441447\n",
"2.9540540540540543\n",
"2.9639639639639643\n",
"2.9738738738738744\n",
"2.9837837837837844\n",
"2.993693693693694\n",
"3.003603603603604\n",
"3.013513513513514\n",
"3.0234234234234236\n",
"3.0333333333333337\n",
"3.0432432432432437\n",
"3.0531531531531537\n",
"3.0630630630630633\n",
"3.0729729729729733\n",
"3.0828828828828834\n",
"3.0927927927927934\n",
"3.102702702702703\n",
"3.112612612612613\n",
"3.122522522522523\n",
"3.132432432432433\n",
"3.1423423423423427\n",
"3.1522522522522527\n",
"3.1621621621621627\n",
"3.1720720720720723\n",
"3.1819819819819823\n",
"3.1918918918918924\n",
"3.2018018018018024\n",
"3.211711711711712\n",
"3.221621621621622\n",
"3.231531531531532\n",
"3.241441441441442\n",
"3.2513513513513517\n",
"3.2612612612612617\n",
"3.2711711711711717\n",
"3.2810810810810813\n",
"3.2909909909909913\n",
"3.3009009009009014\n",
"3.3108108108108114\n",
"3.320720720720721\n",
"3.330630630630631\n",
"3.340540540540541\n",
"3.350450450450451\n",
"3.3603603603603607\n",
"3.3702702702702707\n",
"3.3801801801801807\n",
"3.3900900900900908\n",
"3.4000000000000004\n",
"3.4099099099099104\n",
"3.4198198198198204\n",
"3.42972972972973\n",
"3.43963963963964\n",
"3.44954954954955\n",
"3.45945945945946\n",
"3.4693693693693697\n",
"3.4792792792792797\n",
"3.4891891891891897\n",
"3.4990990990990998\n",
"3.5090090090090094\n",
"3.5189189189189194\n",
"3.5288288288288294\n",
"3.538738738738739\n",
"3.548648648648649\n",
"3.558558558558559\n",
"3.568468468468469\n",
"3.5783783783783787\n",
"3.5882882882882887\n",
"3.5981981981981987\n",
"3.608108108108109\n",
"3.6180180180180184\n",
"3.6279279279279284\n",
"3.6378378378378384\n",
"3.6477477477477485\n",
"3.657657657657658\n",
"3.667567567567568\n",
"3.677477477477478\n",
"3.6873873873873877\n",
"3.6972972972972977\n",
"3.7072072072072078\n",
"3.717117117117118\n",
"3.7270270270270274\n",
"3.7369369369369374\n",
"3.7468468468468474\n",
"3.7567567567567575\n",
"3.766666666666667\n",
"3.776576576576577\n",
"3.786486486486487\n",
"3.7963963963963967\n",
"3.8063063063063067\n",
"3.8162162162162168\n",
"3.826126126126127\n",
"3.8360360360360364\n",
"3.8459459459459464\n",
"3.8558558558558564\n",
"3.8657657657657665\n",
"3.875675675675676\n",
"3.885585585585586\n",
"3.895495495495496\n",
"3.9054054054054057\n",
"3.9153153153153157\n",
"3.9252252252252258\n",
"3.935135135135136\n",
"3.9450450450450454\n",
"3.9549549549549554\n",
"3.9648648648648654\n",
"3.9747747747747755\n",
"3.984684684684685\n",
"3.994594594594595\n",
"4.004504504504505\n",
"4.014414414414415\n",
"4.024324324324325\n",
"4.034234234234234\n",
"4.044144144144145\n",
"4.054054054054054\n",
"4.063963963963964\n",
"4.0738738738738745\n",
"4.083783783783784\n",
"4.093693693693694\n",
"4.103603603603604\n",
"4.113513513513514\n",
"4.123423423423423\n",
"4.133333333333334\n",
"4.143243243243243\n",
"4.153153153153153\n",
"4.163063063063063\n",
"4.172972972972973\n",
"4.182882882882883\n",
"4.192792792792793\n",
"4.202702702702703\n",
"4.212612612612613\n",
"4.222522522522523\n",
"4.232432432432432\n",
"4.242342342342343\n",
"4.252252252252252\n",
"4.262162162162162\n",
"4.272072072072072\n",
"4.281981981981982\n",
"4.291891891891892\n",
"4.301801801801802\n",
"4.311711711711712\n",
"4.321621621621622\n",
"4.331531531531532\n",
"4.341441441441441\n",
"4.351351351351352\n",
"4.361261261261261\n",
"4.371171171171171\n",
"4.381081081081081\n",
"4.390990990990991\n",
"4.4009009009009015\n",
"4.410810810810811\n",
"4.420720720720721\n",
"4.430630630630631\n",
"4.440540540540541\n",
"4.45045045045045\n",
"4.460360360360361\n",
"4.47027027027027\n",
"4.48018018018018\n",
"4.49009009009009\n",
"4.5\n",
"4.5099099099099105\n",
"4.51981981981982\n",
"4.52972972972973\n",
"4.53963963963964\n",
"4.54954954954955\n",
"4.559459459459459\n",
"4.56936936936937\n",
"4.579279279279279\n",
"4.589189189189189\n",
"4.599099099099099\n",
"4.609009009009009\n",
"4.6189189189189195\n",
"4.628828828828829\n",
"4.638738738738739\n",
"4.648648648648649\n",
"4.658558558558559\n",
"4.668468468468468\n",
"4.678378378378379\n",
"4.688288288288288\n",
"4.698198198198198\n",
"4.708108108108108\n",
"4.718018018018018\n",
"4.7279279279279285\n",
"4.737837837837838\n",
"4.747747747747748\n",
"4.757657657657658\n",
"4.767567567567568\n",
"4.777477477477477\n",
"4.787387387387388\n",
"4.797297297297297\n",
"4.807207207207207\n",
"4.817117117117117\n",
"4.827027027027027\n",
"4.8369369369369375\n",
"4.846846846846847\n",
"4.856756756756757\n",
"4.866666666666667\n",
"4.876576576576577\n",
"4.886486486486486\n",
"4.896396396396397\n",
"4.906306306306306\n",
"4.916216216216217\n",
"4.926126126126126\n",
"4.936036036036036\n",
"4.9459459459459465\n",
"4.955855855855856\n",
"4.965765765765766\n",
"4.975675675675676\n",
"4.985585585585586\n",
"4.995495495495495\n",
"5.005405405405406\n",
"5.015315315315315\n",
"5.025225225225226\n",
"5.035135135135135\n",
"5.045045045045045\n",
"5.0549549549549555\n",
"5.064864864864865\n",
"5.074774774774775\n",
"5.084684684684685\n",
"5.094594594594595\n",
"5.104504504504504\n",
"5.114414414414415\n",
"5.124324324324324\n",
"5.134234234234235\n",
"5.1441441441441444\n",
"5.154054054054054\n",
"5.1639639639639645\n",
"5.173873873873874\n",
"5.183783783783784\n",
"5.193693693693694\n",
"5.203603603603604\n",
"5.213513513513513\n",
"5.223423423423424\n",
"5.233333333333333\n",
"5.243243243243244\n",
"5.2531531531531535\n",
"5.263063063063063\n",
"5.2729729729729735\n",
"5.282882882882883\n",
"5.292792792792793\n",
"5.302702702702703\n",
"5.312612612612613\n",
"5.322522522522522\n",
"5.332432432432433\n",
"5.342342342342342\n",
"5.352252252252253\n",
"5.3621621621621625\n",
"5.372072072072072\n",
"5.3819819819819825\n",
"5.391891891891892\n",
"5.401801801801802\n",
"5.411711711711712\n",
"5.421621621621622\n",
"5.431531531531531\n",
"5.441441441441442\n",
"5.451351351351351\n",
"5.461261261261262\n",
"5.4711711711711715\n",
"5.481081081081081\n",
"5.4909909909909915\n",
"5.500900900900901\n",
"5.510810810810811\n",
"5.520720720720721\n",
"5.530630630630631\n",
"5.540540540540541\n",
"5.550450450450451\n",
"5.56036036036036\n",
"5.570270270270271\n",
"5.5801801801801805\n",
"5.59009009009009\n",
"5.6000000000000005\n",
"5.60990990990991\n",
"5.61981981981982\n",
"5.62972972972973\n",
"5.63963963963964\n",
"5.64954954954955\n",
"5.65945945945946\n",
"5.669369369369369\n",
"5.67927927927928\n",
"5.6891891891891895\n",
"5.699099099099099\n",
"5.7090090090090095\n",
"5.718918918918919\n",
"5.728828828828829\n",
"5.738738738738739\n",
"5.748648648648649\n",
"5.758558558558559\n",
"5.768468468468469\n",
"5.778378378378378\n",
"5.788288288288289\n",
"5.7981981981981985\n",
"5.808108108108108\n",
"5.8180180180180185\n",
"5.827927927927928\n",
"5.837837837837838\n",
"5.847747747747748\n",
"5.857657657657658\n",
"5.867567567567568\n",
"5.877477477477478\n",
"5.887387387387387\n",
"5.897297297297298\n",
"5.9072072072072075\n",
"5.917117117117117\n",
"5.9270270270270276\n",
"5.936936936936937\n",
"5.946846846846847\n",
"5.956756756756757\n",
"5.966666666666667\n",
"5.976576576576577\n",
"5.986486486486487\n",
"5.996396396396396\n",
"6.006306306306307\n",
"6.0162162162162165\n",
"6.026126126126126\n",
"6.036036036036037\n",
"6.045945945945946\n",
"6.055855855855857\n",
"6.065765765765766\n",
"6.075675675675676\n",
"6.085585585585586\n",
"6.095495495495496\n",
"6.105405405405405\n",
"6.115315315315316\n",
"6.1252252252252255\n",
"6.135135135135135\n",
"6.145045045045046\n",
"6.154954954954955\n",
"6.164864864864866\n",
"6.174774774774775\n",
"6.184684684684685\n",
"6.194594594594595\n",
"6.204504504504505\n",
"6.2144144144144144\n",
"6.224324324324325\n",
"6.2342342342342345\n",
"6.244144144144144\n",
"6.254054054054055\n",
"6.263963963963964\n",
"6.273873873873875\n",
"6.283783783783784\n",
"6.293693693693694\n",
"6.303603603603604\n",
"6.313513513513514\n",
"6.3234234234234235\n",
"6.333333333333334\n",
"6.3432432432432435\n",
"6.353153153153153\n",
"6.363063063063064\n",
"6.372972972972973\n",
"6.382882882882884\n",
"6.392792792792793\n",
"6.402702702702703\n",
"6.412612612612613\n",
"6.422522522522523\n",
"6.4324324324324325\n",
"6.442342342342343\n",
"6.4522522522522525\n",
"6.462162162162162\n",
"6.472072072072073\n",
"6.481981981981982\n",
"6.491891891891893\n",
"6.501801801801802\n",
"6.511711711711712\n",
"6.521621621621622\n",
"6.531531531531532\n",
"6.5414414414414415\n",
"6.551351351351352\n",
"6.5612612612612615\n",
"6.571171171171171\n",
"6.581081081081082\n",
"6.590990990990991\n",
"6.600900900900902\n",
"6.610810810810811\n",
"6.620720720720721\n",
"6.630630630630631\n",
"6.640540540540541\n",
"6.6504504504504505\n",
"6.660360360360361\n",
"6.6702702702702705\n",
"6.680180180180181\n",
"6.690090090090091\n",
"6.7\n",
"6.709909909909911\n",
"6.71981981981982\n",
"6.72972972972973\n",
"6.73963963963964\n",
"6.74954954954955\n",
"6.7594594594594595\n",
"6.76936936936937\n",
"6.7792792792792795\n",
"6.78918918918919\n",
"6.7990990990991\n",
"6.809009009009009\n",
"6.81891891891892\n",
"6.828828828828829\n",
"6.838738738738739\n",
"6.848648648648649\n",
"6.858558558558559\n",
"6.8684684684684685\n",
"6.878378378378379\n",
"6.8882882882882885\n",
"6.898198198198199\n",
"6.908108108108109\n",
"6.918018018018018\n",
"6.927927927927929\n",
"6.937837837837838\n",
"6.947747747747748\n",
"6.957657657657658\n",
"6.967567567567568\n",
"6.9774774774774775\n",
"6.987387387387388\n",
"6.9972972972972975\n",
"7.007207207207208\n",
"7.017117117117118\n",
"7.027027027027027\n",
"7.036936936936938\n",
"7.046846846846847\n",
"7.056756756756757\n",
"7.066666666666667\n",
"7.076576576576577\n",
"7.0864864864864865\n",
"7.096396396396397\n",
"7.1063063063063066\n",
"7.116216216216217\n",
"7.126126126126127\n",
"7.136036036036036\n",
"7.145945945945947\n",
"7.155855855855856\n",
"7.165765765765766\n",
"7.175675675675676\n",
"7.185585585585586\n",
"7.195495495495496\n",
"7.205405405405406\n",
"7.215315315315316\n",
"7.225225225225226\n",
"7.235135135135136\n",
"7.245045045045045\n",
"7.254954954954956\n",
"7.264864864864865\n",
"7.274774774774775\n",
"7.284684684684685\n",
"7.294594594594595\n",
"7.304504504504505\n",
"7.314414414414415\n",
"7.324324324324325\n",
"7.334234234234235\n",
"7.344144144144145\n",
"7.354054054054054\n",
"7.363963963963965\n",
"7.373873873873874\n",
"7.383783783783784\n",
"7.393693693693694\n",
"7.403603603603604\n",
"7.413513513513514\n",
"7.423423423423424\n",
"7.433333333333334\n",
"7.443243243243244\n",
"7.453153153153154\n",
"7.463063063063063\n",
"7.472972972972974\n",
"7.482882882882883\n",
"7.492792792792793\n",
"7.502702702702703\n",
"7.512612612612613\n",
"7.522522522522523\n",
"7.532432432432433\n",
"7.542342342342343\n",
"7.552252252252253\n",
"7.562162162162163\n",
"7.572072072072072\n",
"7.581981981981983\n",
"7.591891891891892\n",
"7.601801801801802\n",
"7.611711711711712\n",
"7.621621621621622\n",
"7.631531531531532\n",
"7.641441441441442\n",
"7.651351351351352\n",
"7.661261261261262\n",
"7.671171171171172\n",
"7.681081081081081\n",
"7.690990990990992\n",
"7.700900900900901\n",
"7.710810810810811\n",
"7.720720720720721\n",
"7.730630630630631\n",
"7.740540540540541\n",
"7.750450450450451\n",
"7.760360360360361\n",
"7.770270270270271\n",
"7.780180180180181\n",
"7.79009009009009\n",
"7.800000000000001\n",
"7.80990990990991\n",
"7.819819819819821\n",
"7.82972972972973\n",
"7.83963963963964\n",
"7.84954954954955\n",
"7.85945945945946\n",
"7.86936936936937\n",
"7.87927927927928\n",
"7.88918918918919\n",
"7.899099099099099\n",
"7.90900900900901\n",
"7.918918918918919\n",
"7.92882882882883\n",
"7.938738738738739\n",
"7.948648648648649\n",
"7.958558558558559\n",
"7.968468468468469\n",
"7.978378378378379\n",
"7.988288288288289\n",
"7.998198198198199\n",
"8.00810810810811\n",
"8.018018018018019\n",
"8.027927927927928\n",
"8.03783783783784\n",
"8.04774774774775\n",
"8.057657657657659\n",
"8.067567567567568\n",
"8.077477477477478\n",
"8.087387387387388\n",
"8.097297297297299\n",
"8.107207207207209\n",
"8.117117117117118\n",
"8.127027027027028\n",
"8.136936936936937\n",
"8.146846846846847\n",
"8.156756756756756\n",
"8.166666666666668\n",
"8.176576576576577\n",
"8.186486486486487\n",
"8.196396396396397\n",
"8.206306306306306\n",
"8.216216216216218\n",
"8.226126126126127\n",
"8.236036036036037\n",
"8.245945945945946\n",
"8.255855855855856\n",
"8.265765765765765\n",
"8.275675675675677\n",
"8.285585585585586\n",
"8.295495495495496\n",
"8.305405405405406\n",
"8.315315315315315\n",
"8.325225225225227\n",
"8.335135135135136\n",
"8.345045045045046\n",
"8.354954954954955\n",
"8.364864864864865\n",
"8.374774774774774\n",
"8.384684684684686\n",
"8.394594594594595\n",
"8.404504504504505\n",
"8.414414414414415\n",
"8.424324324324324\n",
"8.434234234234236\n",
"8.444144144144145\n",
"8.454054054054055\n",
"8.463963963963964\n",
"8.473873873873874\n",
"8.483783783783784\n",
"8.493693693693695\n",
"8.503603603603604\n",
"8.513513513513514\n",
"8.523423423423424\n",
"8.533333333333333\n",
"8.543243243243245\n",
"8.553153153153154\n",
"8.563063063063064\n",
"8.572972972972973\n",
"8.582882882882883\n",
"8.592792792792794\n",
"8.602702702702704\n",
"8.612612612612613\n",
"8.622522522522523\n",
"8.632432432432433\n",
"8.642342342342342\n",
"8.652252252252254\n",
"8.662162162162163\n",
"8.672072072072073\n",
"8.681981981981982\n",
"8.691891891891892\n",
"8.701801801801803\n",
"8.711711711711713\n",
"8.721621621621622\n",
"8.731531531531532\n",
"8.741441441441442\n",
"8.751351351351351\n",
"8.761261261261263\n",
"8.771171171171172\n",
"8.781081081081082\n",
"8.790990990990991\n",
"8.800900900900901\n",
"8.810810810810812\n",
"8.820720720720722\n",
"8.830630630630631\n",
"8.840540540540541\n",
"8.85045045045045\n",
"8.86036036036036\n",
"8.870270270270272\n",
"8.880180180180181\n",
"8.89009009009009\n",
"8.9\n",
"8.90990990990991\n",
"8.919819819819821\n",
"8.929729729729731\n",
"8.93963963963964\n",
"8.94954954954955\n",
"8.95945945945946\n",
"8.96936936936937\n",
"8.97927927927928\n",
"8.98918918918919\n",
"8.9990990990991\n",
"9.00900900900901\n",
"9.018918918918919\n",
"9.02882882882883\n",
"9.03873873873874\n",
"9.04864864864865\n",
"9.058558558558559\n",
"9.068468468468469\n",
"9.078378378378378\n",
"9.08828828828829\n",
"9.0981981981982\n",
"9.108108108108109\n",
"9.118018018018018\n",
"9.127927927927928\n",
"9.13783783783784\n",
"9.147747747747749\n",
"9.157657657657658\n",
"9.167567567567568\n",
"9.177477477477478\n",
"9.187387387387387\n",
"9.197297297297299\n",
"9.207207207207208\n",
"9.217117117117118\n",
"9.227027027027027\n",
"9.236936936936937\n",
"9.246846846846848\n",
"9.256756756756758\n",
"9.266666666666667\n",
"9.276576576576577\n",
"9.286486486486487\n",
"9.296396396396396\n",
"9.306306306306308\n",
"9.316216216216217\n",
"9.326126126126127\n",
"9.336036036036036\n",
"9.345945945945946\n",
"9.355855855855857\n",
"9.365765765765767\n",
"9.375675675675677\n",
"9.385585585585586\n",
"9.395495495495496\n",
"9.405405405405405\n",
"9.415315315315317\n",
"9.425225225225226\n",
"9.435135135135136\n",
"9.445045045045045\n",
"9.454954954954955\n",
"9.464864864864866\n",
"9.474774774774776\n",
"9.484684684684686\n",
"9.494594594594595\n",
"9.504504504504505\n",
"9.514414414414414\n",
"9.524324324324326\n",
"9.534234234234235\n",
"9.544144144144145\n",
"9.554054054054054\n",
"9.563963963963964\n",
"9.573873873873875\n",
"9.583783783783785\n",
"9.593693693693695\n",
"9.603603603603604\n",
"9.613513513513514\n",
"9.623423423423423\n",
"9.633333333333335\n",
"9.643243243243244\n",
"9.653153153153154\n",
"9.663063063063063\n",
"9.672972972972973\n",
"9.682882882882884\n",
"9.692792792792794\n",
"9.702702702702704\n",
"9.712612612612613\n",
"9.722522522522523\n",
"9.732432432432434\n",
"9.742342342342344\n",
"9.752252252252253\n",
"9.762162162162163\n",
"9.772072072072072\n",
"9.781981981981982\n",
"9.791891891891893\n",
"9.801801801801803\n",
"9.811711711711713\n",
"9.821621621621622\n",
"9.831531531531532\n",
"9.841441441441443\n",
"9.851351351351353\n",
"9.861261261261262\n",
"9.871171171171172\n",
"9.881081081081081\n",
"9.890990990990991\n",
"9.900900900900902\n",
"9.910810810810812\n",
"9.920720720720722\n",
"9.930630630630631\n",
"9.94054054054054\n",
"9.950450450450452\n",
"9.960360360360362\n",
"9.970270270270271\n",
"9.98018018018018\n",
"9.99009009009009\n",
"10.0\n"
]
}
],
"source": [
"#Part b\n",
"for i in range (0,1000):\n",
" F_st = F/(E_st*A3[i]);\n",
" U_st = solveLU(L2,U2,F_st);\n",
" U_st3 = U_st[1::2];\n",
" if min(U_st3)>-.2:\n",
" print((A3[i]))"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The minimum cross-sectional area for steel is 2.696 mm^2\n"
]
}
],
"source": [
"A3_st = 2.696\n",
"print('The minimum cross-sectional area for steel is', A3_st, 'mm^2')"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The weight of the truss made of aluminum is 0.06843771000000001\n",
"The weight of the truss made of steel is 0.0711744\n"
]
}
],
"source": [
"#Part c\n",
"beams = 11\n",
"density_al = 2700/10**9\n",
"density_st = 8000/10**9\n",
"weight_al = l*A3_al*beams*density_al\n",
"weight_st = l*A3_st*beams*density_st\n",
"print('The weight of the truss made of aluminum is', weight_al)\n",
"print('The weight of the truss made of steel is', weight_st)"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The cost for the aluminum truss is $ 0.10573626195000002\n",
"The cost for the steel truss is $ 0.0338790144\n"
]
}
],
"source": [
"#Part d\n",
"Cost_al = weight_al*1.545\n",
"Cost_st = weight_st*.476\n",
"print('The cost for the aluminum truss is $', Cost_al)\n",
"print('The cost for the steel truss is $', Cost_st)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 4. Future Predictions using past data\n",
"\n",
"The data from the price of aluminum and steel are in the data files `../data/al_prices.csv` and `../data/steel_price.csv`. If you're going to produce these supports for 5 years, how would you use the price history of steel and aluminum to compare how much manufacturing will cost?\n",
"\n",
"a. Separate the aluminum and steel data points into training and testing data (70-30%-split)\n",
"\n",
"b. Fit the training data to polynomial functions of order n. _Choose the highest order._\n",
"\n",
"c. Plot the error between your model and the training data and the error between your model and you testing data as a function of the polynomial function order, n. [Create the training-testing curves](../notebooks/03_Linear-regression-algebra.ipynb)\n",
"\n",
"d. Choose a polynomial function to predict the price of aluminum and steel in the year 2025. \n",
"\n",
"e. Based upon your price model would you change your answer in __3.b__?"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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AE9wN998c175ylfm0EMPzb/+67/mK1/5Sk4//fRcddVVefDBB3PCCSfkz//8z5P0Zg7PPPPMHHDAAdljjz3y1re+NRdffHG22267fPGLX8yee+6ZU089NXvssUf+5E/+JIceemgOPfTQfPOb38x9992X8847Ly94wQvywAMP5I1vfGNuvvnmLF26NDfddFPOOeecKcPjoBNPPDF77bVXrrrqqjzvec/LokWLcuedd+bHP/5xlixZkrPPPjtvfetbc9VVV2XhwoX5yEc+ksMOOyznnHNOLr300qxatSoPP/xw/vmf//lxvXcbDZWttfFv+7Phfn+W3udbTnx0xynDYXGcPlX13PQ+K/NlSf4tyaer6gOttVPHLOV7SZ5eVfsl+Vl6n7H5+i6vCQAA2LRO//J1uf7n92/SMZc+eaecduyzpr3f9ddfn/POOy9nnXVWkuSMM87IbrvtljVr1uT3fu/3cvzxx2fp0qUb7HPffffl8MMPzxlnnJF3vetdOffcc/Pe9773MWO31vLd7343X/rSl/L+978/X/va1/Kxj30sS5Ysyec+97lcc801Ofjggyet7YQTTsi2226bJDnqqKNyxhm9D7T40Y9+lG984xuZN29eTj311Hz/+9/Pt7/97SxevDgf/OAHs2jRolx77bW57rrrcswxx+Smm25Kklx55ZW5+uqrs+uuu077fRo21jxnVR2Q3p1TF0+0tdbO73rQqvpqkj9orY0zY7hdkle31n7U3/dNSf7TJONekORFSfaoqpVJTmutfbKq3pbkkvQ+UuTc1tp1XWsHAACemJ72tKflec973rr1Cy64IJ/85CezZs2a/PznP8/111//mFC57bbb5uijj06S/M7v/E4uu+yykWO/6lWvWtfnlltuSZJcfvnlec973pMkOfDAA/OsZ00ehCc7/fXVr371BqfpHnfccVm8ePG68f/0T/80SfKsZz0rT37yk3PzzTcnSY488shNEiiTMUJlVZ2WXlBbmuSr6X00x+VJxg6VrbVvJfnWwPoxG+sz0H7F0Poj6c1cjjrO6yZp/2p6tQMAAFuQLjOKM2X77bdft3zTTTflr//6r/Pd7343u+yyS0488cSRH7WxaNGidcvz58/PmjVrRo69zTbbPKZPa22T1jy8PtX4w/s9HuN8TuXxSY5Icntr7aQkB2bEx28AAAA8Udx///3Z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\n",
"text/plain": [
"<Figure size 1080x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"#Part a-c\n",
"data_al = np.loadtxt('../data/al_price.csv', delimiter = ',', skiprows = 1)\n",
"Y_al = data_al[:,0]\n",
"C_al = data_al[:,1]\n",
"np.random.seed(103)\n",
"i_rand = np.random.randint(0,len(Y_al), size = len(Y_al))\n",
"train_per_al = .7\n",
"Y_al_train = Y_al[i_rand[:int(len(Y_al)*train_per_al)]]\n",
"C_al_train = C_al[i_rand[:int(len(Y_al)*train_per_al)]]\n",
"Y_al_test = Y_al[i_rand[int(len(Y_al)*train_per_al):]]\n",
"C_al_test = C_al[i_rand[int(len(Y_al)*train_per_al):]]\n",
"z = np.block([[Y_al_train**0]]).T\n",
"z_test = np.block([[Y_al_test**0]]).T\n",
"max_N = 30\n",
"SSE_train_al = np.zeros(max_N)\n",
"SSE_test_al = np.zeros(max_N)\n",
"for i in range(1,max_N):\n",
" z = np.hstack((z,Y_al_train.reshape(-1,1)**i))\n",
" z_test = np.hstack((z_test,Y_al_test.reshape(-1,1)**i))\n",
" A = np.linalg.solve(z.T@z,z.T@C_al_train)\n",
" st = np.std(C_al_train)\n",
" sr = np.std(C_al_train-z@A)\n",
" r2 = 1-sr/st\n",
" SSE_train_al[i] = np.sum((C_al_train-z@A)**2)/len(C_al_train)\n",
" SSE_test_al[i] = np.sum((C_al_test-z_test@A)**2)/len(C_al_test)\n",
"fig = plt.figure(figsize = (15,10))\n",
"plt.semilogy(np.arange(2,max_N),SSE_train_al[2:],label='Training Error')\n",
"plt.semilogy(np.arange(2,max_N),SSE_test_al[2:],label='Test Error')\n",
"plt.xlabel('Polynomial Order')\n",
"plt.ylabel('Sum of Squares Error')\n",
"plt.legend()\n",
"plt.title('Aluminum Error vs Order');"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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RK6//vokyete97occsghufDCCyf1aa2ltZahoenH4K644oo9nud3fud3HnixA9773vfm1FNPnXH76OhoFi1aNOP6bPfrYjZ7v6T/PPiutCQnPqAzAwAAHCBuueWW/Mqv/EpOP/30fPnLX87HPvaxvP71r891112XzZs355xzzskf//EfJ+mNHL7tbW/LKaeckiOPPDIXXHBBPv7xj2f58uX58Ic/nKOOOiqvfe1rc+SRR+Z3f/d3c/rpp+f000/PZz/72WzcuDFXXHFFnvjEJ+a+++7Li170otxyyy05+eSTc/PNN+eyyy7bbXgcdEM3WP4AACAASURBVO655+ahD31orrvuujz+8Y/PkiVLcscdd+TWW2/N0UcfnUsvvTQXXHBBrrvuuixevDhvfvObc8YZZ+Syyy7L1VdfnU2bNmXr1q359Kc//YDeuz2Gytba7G/7AwAAMAev/+gNufEH9+zVY558zKG56NmPmvN+N954Y6644opccsklSZKLL744hx9+eEZHR/NLv/RLOfvss3PyySdP2mfjxo158pOfnIsvvjivetWrcvnll+fVr371LsdureUrX/lKPvKRj+RP/uRP8olPfCJvfetbc/TRR+eDH/xgvv71r+e0006bsbZzzjkny5YtS5KcddZZufjii5Mk3/nOd/KZz3wmQ0NDee1rX5uvfe1r+dznPpeRkZG84Q1vyJIlS/LNb34zN9xwQ57xjGfk5ptvTpJcc801uf7667N69eo5v09TzWqcs6pOSXJykpHxttbaex7w2QEAAA4QJ510Uh7/+MdPrF955ZV55zvfmdHR0fzgBz/IjTfeuEuoXLZsWZ7+9KcnSX7u534un//856c99q/+6q9O9Pnud7+bJPnCF76QP/qjP0qSPPaxj82jHjVzEJ5p+uvznve8SdN0n/vc52ZkZGTi+H/wB3+QJHnUox6VY445JrfcckuS5Mwzz9wrgTKZRaisqouS/If0QuU/JHl6ki8kESoBAIAHpMuI4nxZsWLFxPLNN9+cv/7rv85XvvKVHHbYYTn33HOzZcuWXfZZsmTJxPLw8HBGR0enPfbSpUt36dNa26s1T13f3fGn7vdA7Pbur31nJ3lqkh+21s5L8tgkS/daBQAAAAeYe+65JytXrsyhhx6a22+/PZ/85Cf3+jlOP/30vO9970uSfPOb38yNN964V49/xhlnTNyB9qabbsrtt9+ehz/84Xv1HMnspr9ubq2NVdVoVR2a5Mdxkx4AAOBB7LTTTsvJJ5+cU045JSeeeGKe9KQn7fVzvOIVr8iLXvSiPOYxj8lpp52WU045JatWrZq27+A1lQ996ENnFXJf8YpX5Ld/+7fz6Ec/OosXL8573vOeSSOre0vtaci1qv57kv+c5AVJfj/JpiTX90ctDwpr165t69at299lAADAg8JNN92URz7ykfu7jP1udHQ0o6OjGRkZyc0335wzzzwzN9988wP+io8HarqfT1Vd21pbO13/2dz99f/uL15SVZ9Icmhr7RsPuFIAAICD2KZNm/LUpz41o6Ojaa3lb//2b/d7oOxiNjfqOWO6ttba5+anJAAAgAe/ww47LNdee+3+LuMBm00M/oOB5ZEkP5/k2iRPmZeKAAAAWDBmM/312YPrVXVckjfOW0UAAAAsGLP5SpGp1ic5ZW8XAgAAwMIzm2sq35pk/BaxQ0lOTfL1+SwKAACAhWE211QOfpfGaJIrW2tfnKd6AAAA5s2GDRvy1Kc+NUnywx/+MMPDw3nIQx6SJPnKV74y6+9xvPzyy/OMZzwjRx999C7bzj333Hzxi1+c+M7JlStX5vOf//xeegUHntlcU/nufVEIAADAfDviiCNy/fXXJ0le97rX5ZBDDsmFF1445+NcfvnlOe2006YNlUnyV3/1V/mVX/mVGfcfHR2d9PUhU9dnu9+BYDbTX7+ZndNfJ21K0lprj9nrVQEAAOxj7373u/P2t78927ZtyxOf+MS87W1vy9jYWM4777xcf/31aa3lZS97WR760Ifm+uuvzznnnJNly5bNeoTzta99be64447ceuutOfroo/PkJz85V199dTZt2pStW7fmk5/8ZC688MJ86lOfSlXloosuytlnn52rr746F198cY488sjccMMN+eY3v7kP3o3Zm03E/Xj/+f/pP78wyf1JjGACAAAPzMdfnfxwL4ekox+dPP3iOe3yrW99Kx/60Ifyz//8z1m0aFFe9rKX5aqrrspJJ52UO++8cyLI3X333TnssMPy1re+NW9729ty6qmnTnu83/u938vrXve6JMljHvOYvOc970mSfO1rX8vnPve5jIyM5LLLLss111yT66+/PqtXr8573/ve3Hjjjfn617+eO+64I49//ONzxhlnJEm+9KUv5cYb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\n",
"text/plain": [
"<Figure size 1080x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"data_st = np.loadtxt('../data/steel_price.csv', delimiter = ',', skiprows = 1)\n",
"Y_st= data_st[:,0]\n",
"C_st = data_st[:,1]\n",
"np.random.seed(103)\n",
"i_rand = np.random.randint(0,len(Y_st), size = len(Y_st))\n",
"train_per_st = .7\n",
"Y_st_train = Y_st[i_rand[:int(len(Y_st)*train_per_st)]]\n",
"C_st_train = C_st[i_rand[:int(len(Y_st)*train_per_st)]]\n",
"Y_st_test = Y_st[i_rand[int(len(Y_st)*train_per_st):]]\n",
"C_st_test = C_st[i_rand[int(len(Y_st)*train_per_st):]]\n",
"z = np.block([[Y_st_train**0]]).T\n",
"z_test = np.block([[Y_st_test**0]]).T\n",
"max_N = 30\n",
"SSE_train_st = np.zeros(max_N)\n",
"SSE_test_st = np.zeros(max_N)\n",
"for i in range(1,max_N):\n",
" z = np.hstack((z,Y_st_train.reshape(-1,1)**i))\n",
" z_test = np.hstack((z_test,Y_st_test.reshape(-1,1)**i))\n",
" A = np.linalg.solve(z.T@z,z.T@C_st_train)\n",
" st = np.std(C_st_train)\n",
" sr = np.std(C_st_train-z@A)\n",
" r2 = 1-sr/st\n",
" SSE_train_st[i] = np.sum((C_st_train-z@A)**2)/len(C_st_train)\n",
" SSE_test_st[i] = np.sum((C_st_test-z_test@A)**2)/len(C_st_test)\n",
"fig = plt.figure(figsize = (15,10))\n",
"plt.semilogy(np.arange(2,max_N),SSE_train_st[2:],label='Training Error')\n",
"plt.semilogy(np.arange(2,max_N),SSE_test_st[2:],label='Test Error')\n",
"plt.xlabel('Polynomial Order')\n",
"plt.ylabel('Sum of Squares Error')\n",
"plt.legend()\n",
"plt.title('Steel Error vs Order');"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Predicted future cost of aluminum: 3184.478041718633 ($/tonne)\n"
]
},
{
"data": {
"image/png": "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cfDBBwNw5513cv/99wNw7733MnXq1GrLIEmSJLFgNgw6H+49ElIZNGiSd6JVYglcyxo3bsyYMWMYO3YsDRo04M477/zW6ykllixZssr77dmzJ5deeukKX1+2BLZq1YqHH354lY+zPH379uWiiy5izJgxNG7c+JvlZWVlVbL/8rp168aYMWMYM2YMQ4cOBeDMM8/k5JNPBiyBkiRJqmZvPwG3d4XR98KeveHnL0CbvfJOtUosgTnq1q0b7777LpMmTWKHHXbgrLPOonPnznz00Uc8+eST7LnnnnTu3JnjjjuOuXPnAvD444/Tvn179tlnHx555JFv9nXvvffSu3dvAD799FOOPvpodtllF3bZZReef/55Lr30Ut577z06derExRdfzKRJk+jQoQMACxYs4Kc//SkdO3Zk11135dlnn/1mn8cccwyHH3442267LZdccsl33sPf//53HnroIf74xz/Sq1cvhg0bxgEHHMCJJ55Ix44dAbj++uvp0KEDHTp04MYbbwRg0qRJtG/fntNOO40OHTrQq1cvhg4dyt577822227Lyy+/XOnPsU+fPlx77bU8/PDDjBo1il69elX7qKQkSZKKzFcz4d+nwwM/hIbN4dSn4LAroMG6eSdbZevkHSA3Qy6FT96s2n1u2hGOWPEpmeUtXryYIUOGcPjhhwPw1ltvcc8993D77bczY8YMLr/8coYOHUqTJk24+uqruf7667nkkks4/fTTeeaZZ9hmm204/vjjl7vvc845h/32249+/fpRVlbG3Llzueqqqxg7dixjxowBshK21G233QbAm2++ycSJEzn00EN5++23ARgzZgyvvfYaDRs2ZPvtt+fss89miy22+Gbb0047jREjRtC9e3eOPfZYhg0bxssvv8zYsWNp164do0eP5p577uGll14ipcQee+zBfvvtxwYbbMC7777Lv/71L+666y523313HnjgAUaMGMGAAQO48sorefTRR7/z3oYPH06nTp0AOO644/j1r3/9zWvHHnsst956K9deey2lpaWV+j5IkiRJFUoJxv4bhlySnQa636XQ7UJYp0HeyVZb8ZbAnMyfP/+bEtOtWzdOPfVUpk6dSps2bejatSsAL774IuPHj2fvvfcG4Ouvv2bPPfdk4sSJtGvXjm233RaAk046ibvuuus7x3jmmWe+uUauXr16rLfeenzx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\n",
"text/plain": [
"<Figure size 1080x720 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"#Part d\n",
"Y_al_pred = np.append(Y_al, 2025)\n",
"Z_al = np.block([[Y_al], [Y_al**1]]).T\n",
"A_al = np.linalg.solve(Z_al.T@Z_al, Z_al.T@C_al)\n",
"Z_al_pred = np.block([[Y_al_pred], [Y_al_pred**1]]).T\n",
"fig = plt.figure(figsize = (15,10))\n",
"plt.plot(Y_al, Z_al@A_al, '-o', label = 'Initial Fit')\n",
"plt.plot(Y_al_pred, Z_al_pred@A_al, label = 'Prediction from Fit')\n",
"plt.title('Prediction of Aluminum Cost in 2025')\n",
"plt.xlabel('Year')\n",
"plt.ylabel('Cost ($/tonne)')\n",
"plt.legend(loc = 'best')\n",
"print('Predicted future cost of aluminum:', (Z_al_pred@A_al)[-1], '($/tonne)')"
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {},
"outputs": [
{
"ename": "LinAlgError",
"evalue": "Singular matrix",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mLinAlgError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-68-9735207d46e0>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mY_st_pred\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mY_st\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2025\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mZ_st\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mblock\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mY_st\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mY_st\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mT\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mA_st\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlinalg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msolve\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mZ_st\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mT\u001b[0m\u001b[0;34m@\u001b[0m\u001b[0mZ_st\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mZ_st\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mT\u001b[0m\u001b[0;34m@\u001b[0m\u001b[0mC_st\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0mZ_st_pred\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mblock\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mY_st_pred\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mY_st_pred\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mT\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mfig\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfigsize\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;36m15\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m<__array_function__ internals>\u001b[0m in \u001b[0;36msolve\u001b[0;34m(*args, **kwargs)\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.7/site-packages/numpy/linalg/linalg.py\u001b[0m in \u001b[0;36msolve\u001b[0;34m(a, b)\u001b[0m\n\u001b[1;32m 401\u001b[0m \u001b[0msignature\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'DD->D'\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misComplexType\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;34m'dd->d'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 402\u001b[0m \u001b[0mextobj\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_linalg_error_extobj\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_raise_linalgerror_singular\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 403\u001b[0;31m \u001b[0mr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgufunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msignature\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msignature\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mextobj\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mextobj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 404\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 405\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mwrap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mastype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult_t\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.7/site-packages/numpy/linalg/linalg.py\u001b[0m in \u001b[0;36m_raise_linalgerror_singular\u001b[0;34m(err, flag)\u001b[0m\n\u001b[1;32m 95\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 96\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_raise_linalgerror_singular\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0merr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mflag\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 97\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mLinAlgError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Singular matrix\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 98\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 99\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_raise_linalgerror_nonposdef\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0merr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mflag\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mLinAlgError\u001b[0m: Singular matrix"
]
}
],
"source": [
"Y_st_pred = np.append(Y_st, 2025)\n",
"Z_st = np.block([[Y_st], [Y_st**1]]).T\n",
"A_st = np.linalg.solve(Z_st.T@Z_st, Z_st.T@C_st)\n",
"Z_st_pred = np.block([[Y_st_pred], [Y_st_pred**1]]).T\n",
"fig = plt.figure(figsize = (15,10))\n",
"plt.plot(Y_st, Z_st@A_st, '-o', label = 'Initial Fit')\n",
"plt.plot(Y_st_pred, Z_st_pred@A_st, label = 'Prediction from Fit')\n",
"plt.title('Prediction of Steel Cost in 2025')\n",
"plt.xlabel('Year')\n",
"plt.ylabel('Cost ($/tonne)')\n",
"plt.legend(loc = 'best')\n",
"print('Predicted future cost of aluminum:', (Z_al_pred@A_st)[-1], '($/tonne)')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"I would not change the answer from 3b since both the aluminum and the steel costs should increase."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# References\n",
"\n",
"1. <https://en.wikipedia.org/wiki/Direct_stiffness_method>\n",
"\n",
"2. Aluminum and steel price history on <https://tradingeconomics.com>"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.7.3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}