diff --git a/Part A/membrane_solution3.m b/Part A/membrane_solution3.m index d495083..91e2d25 100644 --- a/Part A/membrane_solution3.m +++ b/Part A/membrane_solution3.m @@ -1,17 +1,14 @@ function [w] = membrane_solution3(T,P) - % T = Tension (microNewton/micrometer) - % P = Pressure (MPa) - - od = ones(8,1); - od(3:3:end) = 0; - k = -4*diag(ones(9,1))+diag(ones(9-3,1),3)+diag(ones(9-3,1),-3)+diag(od,1)+diag(od,-1); - - - y = -(10/4)^2*(P/T)*ones(9,1); - w = k\y; - % Solves for displacement (micrometers) - % Solution represents a 2D data set w(x,y) +% membrane_solution3: dispalacement of node for membrane with 3x3 interior +% nodes +% [w] = membrane_solution3(T,P) +% input: +% T = Tension (microNewton/micrometer) +% P = Pressure (MPa) +% output: +% w = vector of displacement of interior nodes +<<<<<<< HEAD [x,y] = meshgrid(0:10/4:10,0:10/4:10); z = zeros(size(x)); z(2:end-1,2:end-1) = reshape(w,[3 3]); @@ -22,4 +19,27 @@ function [w] = membrane_solution3(T,P) xlabel('X Position (micron)') % Membrane displacement is shown on chart -end \ No newline at end of file +end +======= +od = ones(8,1); +od(3:3:end) = 0; +k = -4*diag(ones(9,1))+diag(ones(9-3,1),3)+diag(ones(9-3,1),-3)+diag(od,1)+diag(od,-1); + + +y = -(10/4)^2*(P/T)*ones(9,1); +w = k\y; + +% Solves for displacement (micrometers) +% Solution represents a 2D data set w(x,y) + +[x,y] = meshgrid(0:10/4:10,0:10/4:10); +z = zeros(size(x)); +z(2:end-1,2:end-1) = reshape(w,[3 3]); +surf(x,y,z) +title('Membrane Displacement') +zlabel('Displacement (micrometer)') + +% Membrane displacement is shown on chart + +end +>>>>>>> 3217bec2baefdb9797b60fd7e29f12b838227cd0 diff --git a/Part C/membrane_solution.asv b/Part C/membrane_solution.asv new file mode 100644 index 0000000..72568a0 --- /dev/null +++ b/Part C/membrane_solution.asv @@ -0,0 +1,27 @@ +function [w] = membrane_solution(T,P,n) +% membrane_solution: dispalacement of node for membrane with nxn interior nodes +% [w] = membrane_solution(T,P,n) +% input: +% T = Tension (microNewton/micrometer) +% P = Pressure (MPa) +% output: +% w = vector of displacement of interior nodes + +od = ones(n^2-1,1); +od(n:n:end) = 0; +k = -4*diag(ones(n^2,1))+diag(ones((n^2)-n,1),n)+diag(ones((n^2)-n,1),-n)+diag(od,1)+diag(od,-1); + +y = -(10/(n+1))^2*(P/T)*ones(n^2,1); +w = k\y; +% Solves for displacement (micrometers) +% Output w is a vector +% Solution represents a 2D data set w(x,y) + +[x,y] = meshgrid(0:10/(n+1):10,0:10/(n+1):10); +z = zeros(size(x)); +z(2:end-1,2:end-1) = reshape(w,[n n]); +surf(x,y,z) +title('Membrane Displacement') +zlabel('Displacement (micrometer)') +% Membrane displacement is shown on chart +end \ No newline at end of file diff --git a/Part C/membrane_solution.m b/Part C/membrane_solution.m index f9c96d6..a3b6d3e 100644 --- a/Part C/membrane_solution.m +++ b/Part C/membrane_solution.m @@ -1,23 +1,28 @@ function [w] = membrane_solution(T,P,n) - % T = Tension (microNewton/micrometer) - % P = Pressure (MPa) - % n = # of interior nodes +% membrane_solution: dispalacement of node for membrane with nxn interior nodes +% [w] = membrane_solution(T,P,n) +% input: +% T = Tension (microNewton/micrometer) +% P = Pressure (MPa) +% n = number of rows and columns of interior nodes +% output: +% w = vector of displacement of interior nodes - od = ones(n^2-1,1); - od(n:n:end) = 0; - k = -4*diag(ones(n^2,1))+diag(ones((n^2)-n,1),n)+diag(ones((n^2)-n,1),-n)+diag(od,1)+diag(od,-1); +od = ones(n^2-1,1); +od(n:n:end) = 0; +k = -4*diag(ones(n^2,1))+diag(ones((n^2)-n,1),n)+diag(ones((n^2)-n,1),-n)+diag(od,1)+diag(od,-1); - y = -(10/(n+1))^2*(P/T)*ones(n^2,1); - w = k\y; - % Solves for displacement (micrometers) - % Output w is a vector - % Solution represents a 2D data set w(x,y) +y = -(10/(n+1))^2*(P/T)*ones(n^2,1); +w = k\y; +% Solves for displacement (micrometers) +% Output w is a vector +% Solution represents a 2D data set w(x,y) - [x,y] = meshgrid(0:10/(n+1):10,0:10/(n+1):10); - z = zeros(size(x)); - z(2:end-1,2:end-1) = reshape(w,[n n]); - surf(x,y,z) - title('Membrane Displacement') - zlabel('Displacement (micrometer)') - % Membrane displacement is shown on chart +[x,y] = meshgrid(0:10/(n+1):10,0:10/(n+1):10); +z = zeros(size(x)); +z(2:end-1,2:end-1) = reshape(w,[n n]); +surf(x,y,z) +title('Membrane Displacement') +zlabel('Displacement (micrometer)') +% Membrane displacement is shown on chart end \ No newline at end of file diff --git a/Part E/SE_diff.m b/Part E/SE_diff.m index e7202ff..5b269a6 100644 --- a/Part E/SE_diff.m +++ b/Part E/SE_diff.m @@ -1,4 +1,16 @@ function [pw_se,w]=SE_diff(T,P,n) +% SE_diff: difference between strain energy and work done by pressure in +% membrane +% [pw_se,w]=SE_diff(T,P,n) +% input: +% T = Tension (microNewton/micrometer) +% P = Pressure (MPa) +% n = number of rows and columns of interior nodes +% output: +% pw_se = difference between strain energy and work done by pressure in +% membrane +% w = vector of displacement of interior nodes + E = 1e6; %TPa Units may need to be changed v = .31; %Poissons ratio t = .3; %nm diff --git a/Part E/membrane_solution.m b/Part E/membrane_solution.m index f9c96d6..a3b6d3e 100644 --- a/Part E/membrane_solution.m +++ b/Part E/membrane_solution.m @@ -1,23 +1,28 @@ function [w] = membrane_solution(T,P,n) - % T = Tension (microNewton/micrometer) - % P = Pressure (MPa) - % n = # of interior nodes +% membrane_solution: dispalacement of node for membrane with nxn interior nodes +% [w] = membrane_solution(T,P,n) +% input: +% T = Tension (microNewton/micrometer) +% P = Pressure (MPa) +% n = number of rows and columns of interior nodes +% output: +% w = vector of displacement of interior nodes - od = ones(n^2-1,1); - od(n:n:end) = 0; - k = -4*diag(ones(n^2,1))+diag(ones((n^2)-n,1),n)+diag(ones((n^2)-n,1),-n)+diag(od,1)+diag(od,-1); +od = ones(n^2-1,1); +od(n:n:end) = 0; +k = -4*diag(ones(n^2,1))+diag(ones((n^2)-n,1),n)+diag(ones((n^2)-n,1),-n)+diag(od,1)+diag(od,-1); - y = -(10/(n+1))^2*(P/T)*ones(n^2,1); - w = k\y; - % Solves for displacement (micrometers) - % Output w is a vector - % Solution represents a 2D data set w(x,y) +y = -(10/(n+1))^2*(P/T)*ones(n^2,1); +w = k\y; +% Solves for displacement (micrometers) +% Output w is a vector +% Solution represents a 2D data set w(x,y) - [x,y] = meshgrid(0:10/(n+1):10,0:10/(n+1):10); - z = zeros(size(x)); - z(2:end-1,2:end-1) = reshape(w,[n n]); - surf(x,y,z) - title('Membrane Displacement') - zlabel('Displacement (micrometer)') - % Membrane displacement is shown on chart +[x,y] = meshgrid(0:10/(n+1):10,0:10/(n+1):10); +z = zeros(size(x)); +z(2:end-1,2:end-1) = reshape(w,[n n]); +surf(x,y,z) +title('Membrane Displacement') +zlabel('Displacement (micrometer)') +% Membrane displacement is shown on chart end \ No newline at end of file diff --git a/Part F/Rel_error.asv b/Part F/Rel_error.asv new file mode 100644 index 0000000..56dbd19 --- /dev/null +++ b/Part F/Rel_error.asv @@ -0,0 +1,14 @@ +function re = Rel_error (T) +% Rel_error: calculates relative error of a vector +% [w] = membrane_solution(T,P,n) +% input: +% T = Tension (microNewton/micrometer) +% P = Pressure (MPa) +% n = number of rows and columns of interior nodes +% output: +% w = vector of displacement of interior nodes + +re = zeros(1,length(T)-1); +for i = 2:length(T) + re(i-1)= abs(T(i)-T(i-1))/T(i-1); +end \ No newline at end of file diff --git a/Part F/Rel_error.m b/Part F/Rel_error.m index f5f8fff..5e17536 100644 --- a/Part F/Rel_error.m +++ b/Part F/Rel_error.m @@ -1,4 +1,11 @@ function re = Rel_error (T) +% Rel_error: calculates relative error of a vector +% re = Rel_error (T) +% input: +% T = vector of numbers +% output: +% re = relative error of vector + re = zeros(1,length(T)-1); for i = 2:length(T) re(i-1)= abs(T(i)-T(i-1))/T(i-1); diff --git a/Part F/SE_diff.m b/Part F/SE_diff.m index bf9e129..bc4cf5e 100644 --- a/Part F/SE_diff.m +++ b/Part F/SE_diff.m @@ -1,4 +1,16 @@ function [pw_se,w]=SE_diff(T,P,n) +% SE_diff: difference between strain energy and work done by pressure in +% membrane +% [pw_se,w]=SE_diff(T,P,n) +% input: +% T = Tension (microNewton/micrometer) +% P = Pressure (MPa) +% n = number of rows and columns of interior nodes +% output: +% pw_se = difference between strain energy and work done by pressure in +% membrane +% w = vector of displacement of interior nodes + E = 1000000; %TPa Units may need to be changed v = .31; %Poissons ratio t = .0003; %um diff --git a/Part F/membrane_solution.m b/Part F/membrane_solution.m index ae80fce..ef0fae2 100644 --- a/Part F/membrane_solution.m +++ b/Part F/membrane_solution.m @@ -1,25 +1,31 @@ function [w] = membrane_solution(T,P,n) - % T = Tension (microNewton/micrometer) - % P = Pressure (MPa) - % n = # of interior nodes +% membrane_solution: dispalacement of node for membrane with nxn interior nodes +% [w] = membrane_solution(T,P,n) +% input: +% T = Tension (microNewton/micrometer) +% P = Pressure (MPa) +% n = number of rows and columns of interior nodes +% output: +% w = vector of displacement of interior nodes - od = ones(n^2-1,1); - od(n:n:end) = 0; - k = -4*diag(ones(n^2,1))+diag(ones((n^2)-n,1),n)+diag(ones((n^2)-n,1),-n)+diag(od,1)+diag(od,-1); - y = -(10/(n+1))^2*(P/T)*ones(n^2,1); - w = k\y; - - % Solves for displacement (micrometers) - % Output w is a vector - % Solution represents a 2D data set w(x,y) +od = ones(n^2-1,1); +od(n:n:end) = 0; +k = -4*diag(ones(n^2,1))+diag(ones((n^2)-n,1),n)+diag(ones((n^2)-n,1),-n)+diag(od,1)+diag(od,-1); - [x,y] = meshgrid(0:10/(n+1):10,0:10/(n+1):10); - z = zeros(size(x)); - z(2:end-1,2:end-1) = reshape(w,[n n]); - surf(x,y,z) - title('Membrane Displacement') - zlabel('Displacement (micrometer)') - - % Membrane displacement is shown on chart +y = -(10/(n+1))^2*(P/T)*ones(n^2,1); +w = k\y; + +% Solves for displacement (micrometers) +% Output w is a vector +% Solution represents a 2D data set w(x,y) + +[x,y] = meshgrid(0:10/(n+1):10,0:10/(n+1):10); +z = zeros(size(x)); +z(2:end-1,2:end-1) = reshape(w,[n n]); +surf(x,y,z) +title('Membrane Displacement') +zlabel('Displacement (micrometer)') + +% Membrane displacement is shown on chart end \ No newline at end of file diff --git a/Part F/tension_sol.m b/Part F/tension_sol.m index dd534c9..b0f0132 100644 --- a/Part F/tension_sol.m +++ b/Part F/tension_sol.m @@ -1,3 +1,13 @@ function [T,ea] = tension_sol(P,n) +% tension_sol: outputs tension of a membrane given the pressure and number +% of nodes +% [T,ea] = tension_sol(P,n) +% input: +% P = Pressure (MPa) +% n = number of rows and columns of interior nodes +% output: +% T = Tension (microNewton/micrometer) +% ea = approximate relative error (%) + y =@(T) SE_diff(T,P,n); [T,fx,ea,iter]=bisect(y,.01,1); diff --git a/Part G/PartGplot.png b/Part G/PartGplot.png deleted file mode 100644 index 0f2b734..0000000 Binary files a/Part G/PartGplot.png and /dev/null differ diff --git a/Part G/SE_diff.m b/Part G/SE_diff.m index bf9e129..1eaddea 100644 --- a/Part G/SE_diff.m +++ b/Part G/SE_diff.m @@ -1,4 +1,16 @@ function [pw_se,w]=SE_diff(T,P,n) +% SE_diff: calculates difference between strain energy and work done by pressure in +% membrane +% [pw_se,w]=SE_diff(T,P,n) +% input: +% T = Tension (microNewton/micrometer) +% P = Pressure (MPa) +% n = number of rows and columns of interior nodes +% output: +% pw_se = difference between strain energy and work done by pressure in +% membrane +% w = vector of displacement of interior nodes + E = 1000000; %TPa Units may need to be changed v = .31; %Poissons ratio t = .0003; %um diff --git a/Part G/membrane_solution.m b/Part G/membrane_solution.m index ae80fce..af4d17d 100644 --- a/Part G/membrane_solution.m +++ b/Part G/membrane_solution.m @@ -1,25 +1,30 @@ function [w] = membrane_solution(T,P,n) - % T = Tension (microNewton/micrometer) - % P = Pressure (MPa) - % n = # of interior nodes +% membrane_solution: dispalacement of node for membrane with nxn interior nodes +% [w] = membrane_solution(T,P,n) +% input: +% T = Tension (microNewton/micrometer) +% P = Pressure (MPa) +% n = number of rows and columns of interior nodes +% output: +% w = vector of displacement of interior nodes - od = ones(n^2-1,1); - od(n:n:end) = 0; - k = -4*diag(ones(n^2,1))+diag(ones((n^2)-n,1),n)+diag(ones((n^2)-n,1),-n)+diag(od,1)+diag(od,-1); +od = ones(n^2-1,1); +od(n:n:end) = 0; +k = -4*diag(ones(n^2,1))+diag(ones((n^2)-n,1),n)+diag(ones((n^2)-n,1),-n)+diag(od,1)+diag(od,-1); - y = -(10/(n+1))^2*(P/T)*ones(n^2,1); - w = k\y; - - % Solves for displacement (micrometers) - % Output w is a vector - % Solution represents a 2D data set w(x,y) +y = -(10/(n+1))^2*(P/T)*ones(n^2,1); +w = k\y; - [x,y] = meshgrid(0:10/(n+1):10,0:10/(n+1):10); - z = zeros(size(x)); - z(2:end-1,2:end-1) = reshape(w,[n n]); - surf(x,y,z) - title('Membrane Displacement') - zlabel('Displacement (micrometer)') - - % Membrane displacement is shown on chart +% Solves for displacement (micrometers) +% Output w is a vector +% Solution represents a 2D data set w(x,y) + +[x,y] = meshgrid(0:10/(n+1):10,0:10/(n+1):10); +z = zeros(size(x)); +z(2:end-1,2:end-1) = reshape(w,[n n]); +surf(x,y,z) +title('Membrane Displacement') +zlabel('Displacement (micrometer)') + +% Membrane displacement is shown on chart end \ No newline at end of file diff --git a/Part G/part_g.m b/Part G/part_g.m index 4583bb5..6505df9 100644 --- a/Part G/part_g.m +++ b/Part G/part_g.m @@ -9,12 +9,12 @@ for i = 1:length(P) end clf setDefaults -x = wmax; +x = wmax'; y = P'; -Z = [x.^3]'; +Z = x.^3; a = Z\y; x_fcn = linspace(min(x),max(x)); -plot(x,y,'o',x_fcn,a.*x_fcn) +plot(x,y,'o',x_fcn,a.*x_fcn.^3) title('Pressure vs. Maximum Deflection') -xlabel('Max w') -ylabel('Pressure vs.. Max Deflection') \ No newline at end of file +xlabel('Maximum Deflection (um)') +ylabel('Pressure (MPa)') \ No newline at end of file diff --git a/Part G/tension_sol.m b/Part G/tension_sol.m index dd534c9..b0f0132 100644 --- a/Part G/tension_sol.m +++ b/Part G/tension_sol.m @@ -1,3 +1,13 @@ function [T,ea] = tension_sol(P,n) +% tension_sol: outputs tension of a membrane given the pressure and number +% of nodes +% [T,ea] = tension_sol(P,n) +% input: +% P = Pressure (MPa) +% n = number of rows and columns of interior nodes +% output: +% T = Tension (microNewton/micrometer) +% ea = approximate relative error (%) + y =@(T) SE_diff(T,P,n); [T,fx,ea,iter]=bisect(y,.01,1); diff --git a/README.md b/README.md index 25ffb94..0c9f8c6 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,14 @@ # Part A ```matlab function [w] = membrane_solution3(T,P) - % T = Tension (microNewton/micrometer) - % P = Pressure (MPa) +% membrane_solution3: dispalacement of node for membrane with 3x3 interior +% nodes +% [w] = membrane_solution3(T,P) +% input: +% T = Tension (microNewton/micrometer) +% P = Pressure (MPa) +% output: +% w = vector of displacement of interior nodes od = ones(8,1); od(3:3:end) = 0; @@ -40,9 +46,14 @@ end # Part C ```matlab function [w] = membrane_solution(T,P,n) - % T = Tension (microNewton/micrometer) - % P = Pressure (MPa) - % n = # of interior nodes +% membrane_solution: dispalacement of node for membrane with nxn interior nodes +% [w] = membrane_solution(T,P,n) +% input: +% T = Tension (microNewton/micrometer) +% P = Pressure (MPa) +% n = number of rows and columns of interior nodes +% output: +% w = vector of displacement of interior nodes od = ones(n^2-1,1); od(n:n:end) = 0; @@ -76,6 +87,18 @@ end # Part E ```matlab function [pw_se,w]=SE_diff(T,P,n) +% SE_diff: calculates difference between strain energy and work done by pressure in +% membrane +% [pw_se,w]=SE_diff(T,P,n) +% input: +% T = Tension (microNewton/micrometer) +% P = Pressure (MPa) +% n = number of rows and columns of interior nodes +% output: +% pw_se = difference between strain energy and work done by pressure in +% membrane +% w = vector of displacement of interior nodes + E = 1; %TPa Units may need to be changed v = .31; %Poissons ratio t = .3; %nm @@ -102,6 +125,12 @@ end se = E*t*h^2/(2*(1-v^2))*sum(sum(0.25.*dwdx.^4+.25.*dwdy.^4+0.5.*(dwdx.*dwdy).^2)); pw_se = pw-se; ``` +### Approach +- Using the membrane_solution function, a vector of the displacements is formed +- Next, the average displacement for each element is calculated. For each elements, the dispalcement at all four courners is taken and then averaged +- Using these values, the work done by pressure can be calculated +- For the change in dispalcement over the x and y coordinate system, the values of the change on the left and right (y-axis) or top and bottom (x-axis) are taken and averaged +- Using these values, the strain enegery can be calculated # Part F ```matlab @@ -115,7 +144,17 @@ pw_se = pw-se; end ``` ```matlab - function [T,ea] = tension_sol(P,n) +function [T,ea] = tension_sol(P,n) +% tension_sol: outputs tension of a membrane given the pressure and number +% of nodes +% [T,ea] = tension_sol(P,n) +% input: +% P = Pressure (MPa) +% n = number of rows and columns of interior nodes +% output: +% T = Tension (microNewton/micrometer) +% ea = approximate relative error (%) + y =@(T) SE_diff(T,P,n); [T,fx,ea,iter]=bisect(y,.01,1); ``` @@ -160,6 +199,13 @@ root = xr; fx = func(xr, varargin{:}); ``` ```matlab function re = Rel_error (T) + Rel_error: calculates relative error of a vector +% re = Rel_error (T) +% input: +% T = vector of numbers +% output: +% re = relative error of vector + re = zeros(1,length(T)-1); for i = 2:length(T) re(i-1)= abs(T(i)-T(i-1))/T(i-1); @@ -174,7 +220,9 @@ end |35|0.0602|0.09%| |40|0.0603|0.06%| - +### Approach +- This problem uses the bisect method for locating roots and the SE_diff function for calculating the difference in work and strain energy of the membrane +- The script runs through all iterations of different amounts of nodes, zeroing the SE_diff function output and saving the values for tension in the T variable as a vector # Part G ```matlab P = linspace(.001,.01,10); @@ -194,4 +242,15 @@ Z=x.^3; a=Z\y; x_fcn=linspace(min(x),max(x)); plot(x,y,'o',x_fcn,a*x_fcn.^3) +title('Pressure vs Maximum Deflection') +xlabel('Maximum Deflection (um)') +ylabel('Pressure (MPa)') +print('Part g','-dpng') ``` +![](https://github.uconn.edu/ltd13002/ME3255_Final_Project/blob/master/Part%20G/Part%20g.png) + +### Approach +- This script uses the tension_sol function as described in the part above, running though all iterations of pressure +- Additionally, the max deflection for each pressure and tension is calculated at each iteration +- From there, a general linear regression is calculated with the formula P(x) = A*w^3 +- The results are plotted