Improving code to reduce run-time

2 views (last 30 days)
AH2019
AH2019 on 17 Apr 2019
Commented: Stephen23 on 17 Apr 2019
Hi
I need to improve following code for decreasing run-time.
The main deficiencies are
  • The run-time, especially for Ln 137 [ i.e. bc(2) = solve(subs(fd1,[psi(1),X],[bc(1),1/2+sqrt(1/4-(z/h)^2)]),psi(N)) ] is too much.
  • In the case of N>10, the
Please hint me
clc;
clear all
tic
N = 10;
L = 5;
h = 1;
n = 1;
md = 1;
P = 0;
rhom = 2702;
rhoc = 3960;
Em = 70e9;
Ec = 380e9;
nu = 0.3;
% X =(y/h+1/2);
sc = 1/h;
syms X z omega
om = sym('om',[1,N]);
om(1) = 0;
phi1 = sym('phi1',[1,N]);
x = zeros(1,N);
A = zeros(2,N,N);
l = sym('l',[1,N]);
df = sym('df',[1,N]);
df1 = sym('df1',[1,N]);
df1o = sym('df1o',[1,N]);
df2 = sym('df2',[1,N]);
psi = sym('psi',[1,N]);
dis = sym('dis',[1,N]);
M = zeros(N-2,N-2);
bc = sym('bc',[1,2]);
mm = sym('mm',[1,N-2]);
F = sym('F',[1,N]);
q = 1:N;
Vc =(X)^n;
Vm = 1-Vc;
rho = rhom*Vm+rhoc*Vc;
E = Em*Vm+Ec*Vc;
G = E/(2*(1+nu));
m0 = int(int(rho/sc,X,1/2-sqrt(1/4-(z/h)^2),1/2+sqrt(1/4-(z/h)^2)),z,-h/2,h/2);
for i=1:N
x(i) = 1/2*(1-cos((i-1)*vpa(pi)/(N-1)));
end
for m=1:N
phi1(m) = (X-x(m));
end
aphi = cumprod(phi1);
for r=1:2
for j=1:N
for m=1:N
if j==m
phi1(m) = 1;
else
phi1(m) = (x(j)-x(m));
end
end
dphi = cumprod(phi1);
l(j) = aphi(N)/((X-x(j))*dphi(N));
for i=1:N
A(r,i,j) = limit(diff(l(j),X,r),X,x(i));
end
end
end
for i=1:N
for j=1:N
df(j) = A(1,i,j)*psi(j);
end
df1o(i) = sum(df);
end
for i=1:N
for j=1:N
df(j) = A(2,i,j)*psi(j);
end
df2(i) = sum(df);
end
for i=1:N
df2(i) = df2(i)*subs(G,X,x(i));
end
for i=1:N
df1(i) = df1o(i)*sc*subs(diff(G,X),X,x(i));
end
for i=1:N
dis(i)= subs((rho*om(1)^2*L^2-md^2*vpa(pi^2)*E)*(L^2*psi(i)+md^2*vpa(pi^2)*(X-1/2)*h),X,x(i));
end
ode = L^4*sc^2*df2+L^4*sc*df1+dis;
for j=1:N-2
for i=1:N-2
M(i,j)= diff(ode(i+1),psi(j+1));
end
end
for j=1:N-2
mm(j) = ode(j+1);
for i=1:N-2
mm(j)= subs(mm(j),psi(i+1),0);
end
end
mat = -(M^(-1)*mm');
df1s = subs(df1o,psi(2:N-1),mat');
fd1 = polyfit(x,df1s,N-1)*(X.^(N-q))';
bc(1) = solve(subs(fd1,X,1/2-sqrt(1/4-(z/h)^2)),psi(1));
bc(2) = solve(subs(fd1,[psi(1),X],[bc(1),1/2+sqrt(1/4-(z/h)^2)]),psi(N));
bc(1) = subs(bc(1),psi(N),bc(2));
F(1) = bc(1);
F(N) = bc(2);
F = subs(F,F(2:N-1), subs(mat',[psi(1),psi(N)],[bc(1),bc(2)]));
f = polyfit(x,F,N-1)*(X.^(N-q))';
INT = int(G*diff(f,X),X,1/2-sqrt(1/4-(z/h)^2),1/2+sqrt(1/4-(z/h)^2))*L^2;
INT = matlabFunction(INT);
INT = integral(INT,-h/2,h/2,'ArrayValued',1);
solve(INT+m0*omega^2*L^2+md^2*vpa(pi^2)*P,omega);
om(2) = abs(ans(1));
lp=1;
while abs(om(lp+1)-om(lp))>1e-10
lp=lp+1;
for i=1:N
dis(i)= subs((rho*om(lp)^2*L^2-md^2*vpa(pi^2)*E)*(L^2*psi(i)+md^2*vpa(pi^2)*(X-1/2)*h),X,x(i));
end
ode = L^4*sc^2*df2+L^4*sc*df1+dis;
ode = subs(ode,[psi(1),psi(N)],[bc(1),bc(2)]);
for j=1:N-2
for i=1:N-2
M(i,j)= diff(ode(i+1),psi(j+1));
end
end
for j=1:N-2
mm(j) = ode(j+1);
for i=1:N-2
mm(j)= subs(mm(j),psi(i+1),0);
end
end
mat = -(M^(-1)*mm');
df1s = subs(df1o,psi(2:N-1),mat');
fd1 = polyfit(x,df1s,N-1)*(X.^(N-q))';
bc(1) = solve(subs(fd1,X,1/2-sqrt(1/4-(z/h)^2)),psi(1));
bc(2) = solve(subs(fd1,[psi(1),X],[bc(1),1/2+sqrt(1/4-(z/h)^2)]),psi(N));
bc(1) = subs(bc(1),psi(N),bc(2));
F(1) = bc(1);
F(N) = bc(2);
F = subs(F,F(2:N-1), mat');
f = polyfit(x,F,N-1)*(X.^(N-q))';
INT = int(G*diff(f,X),X,1/2-sqrt(1/4-(z/h)^2),1/2+sqrt(1/4-(z/h)^2))*L^2;
INT = matlabFunction(INT);
INT = integral(INT,-h/2,h/2,'ArrayValued',1);
solve(INT+m0*omega^2*L^2+md^2*vpa(pi^2)*P,omega);
om(1+lp) = abs(ans(1));
end
toc
  1 Comment
Stephen23
Stephen23 on 17 Apr 2019
"I need to improve following code..."
Start by using consistent indentation and code alignment.

Sign in to comment.

Answers (0)

Categories

Find more on Function Creation in Help Center and File Exchange

Tags

Products


Release

R2014a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!