You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.
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?
function [w] =membrane_solution3(T,P)
% 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;
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)% Output w is a vector% 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,[33]);
surf(x,y,z)
title('Membrane Displacement')
zlabel('Displacement (micrometer)')
% Membrane displacement is shown on chartend
Approach
A matrix is set up using finite element analysis of the interior nodes of a 5x5 matrix
A vector for the y direction is then set up for the membrane
Using linear algebra, a vector for the displacement of the nodes is created
The vector can then be transformed to represent the actual surface as a matrix
Part B
% Part B Script
[w] =membrane_solution3(0.006,0.001);
Part C
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)% 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)
[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,[nn]);
surf(x,y,z)
title('Membrane Displacement')
zlabel('Displacement (micrometer)')
% Membrane displacement is shown on chartend
Approach
This problem uses the same steps as with the membrane_solution3 function, except it allows for the user to change the number of interior nodes
This required alterations of the all the indexing and sizing in the function along with a few calculations
Part D
% Part D Script
[w] =membrane_solution(0.006,0.001,10)
Part E
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
h =10/(n+1); %nm
w =membrane_solution(T,P,n);
z =zeros(n+2);
z(2:end-1,2:end-1) =reshape(w,[nn]);
num =n+1;
wbar =zeros(num);
for i =1:numfor j =1:numwbar(i,j) =mean([z(i,j),z(i+1,j),z(i,j+1),z(i+1,j+1)]);
endend
pw =sum(sum(wbar.*h^2.*P));
dwdx =zeros(num);
dwdy =zeros(num);
for i =1:numfor j =1:numdwdx(i,j) =mean([z(i+1,j)-z(i,j),z(i+1,j+1)-z(i,j+1)]);
dwdy(i,j) =mean([z(i,j+1)-z(i,j),z(i+1,j+1)-z(i+1,j)]);
endend
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 energy can be calculated
Part F
n=[3,20:5:40];
P=0.001; %MPa
T =zeros(1,length(n));
ea =zeros(1,length(n));
for i =1:length(n)
[T(i), ea(i)] =tension_sol(P,n(i));
end
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);
function [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,varargin)
% bisect: root location zeroes% [root,fx,ea,iter]=bisect(func,xl,xu,es,maxit,p1,p2,...):% uses bisection method to find the root of func% input:% func = name of function% xl, xu = lower and upper guesses% es = desired relative error (default = 0.0001%)% maxit = maximum allowable iterations (default = 50)% p1,p2,... = additional parameters used by func% output:% root = real root% fx = function value at root% ea = approximate relative error (%)% iter = number of iterationsifnargin<3,error('at least 3 input arguments required'),end
test =func(xl,varargin{:})*func(xu,varargin{:});
iftest>0,error('no sign change'),endifnargin<4||isempty(es), es=0.0001;endifnargin<5||isempty(maxit), maxit=50;end
iter =0; xr =xl; ea =100;
while (1)
xrold =xr;
xr = (xl+xu)/2;
iter =iter+1;
ifxr~=0,ea =abs((xr-xrold)/xr) *100;end
test =func(xl,varargin{:})*func(xr,varargin{:});
iftest<0
xu =xr;
elseiftest>0
xl =xr;
else
ea =0;
endifea<=es||iter>=maxit,break,endend
root =xr; fx =func(xr, varargin{:});
functionre=Rel_error (T)
Rel_error:calculatesrelativeerrorofavector% 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);
end
number of nodes
Tension (uN/um)
rel. error
3
0.0489
n/a
20
0.0599
22.6%
25
0.0601
0.27%
30
0.0602
0.15%
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
P =linspace(.001,.01,10);
n =20;
T =zeros(1,length(P));
wmax =zeros(1,length(P));
for i =1:length(P)
T(i) =tension_sol(P(i),n);
w =membrane_solution(T(i),P(i),n);
wmax(i) =max(w);
endclfsetDefaults
x =wmax';
y =P';
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')
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