Hello.I would need some help with my university program. I needed to do a program on finite element method. I made it as a function with input arguments firstly, but now i want to input them from keyboard since i needed to add the program to a larger code with a menu in it and here's my problem. As soon as i did that the program went bananas and i get error at axis set and at second figure(2).
To make a general ideea, here's the code:
function []=Metoda_elementului_finit_cu_dreptunghiuri(a,b,c,d,N,M) close all clc % a=input('a=');
% b=input('b=');
% d=input('c=');
% c=input('d=');
% N=input('N=');
% M=input('M=');
x=linspace(a,b,N+1); y=linspace(c,d,M+1); hx=(b-a)/N; %pasul pe axa Ox
hy=(d-c)/M; %pasul pe axa Oy
% crearea matricii nodurilor
Nod=zeros((N+1)*(M+1),3); k1=0; for j=1:M+1 for i=1:N+1 k=i+(N+1)*(j-1); Nod(k,1)=x(i); Nod(k,2)=y(j); Nod(k,3)=0; if((i~=1)&&(i~=N+1)&&(j~=1)&&(j~=M+1)) k1=k1+1; Nod(k,3)=k1; end end end display(Nod); %afisarea figurii pentru noduri
figure(1) %construirea liniilor verticale
for i=1:N+1 plot(x(i)*ones(1,M+1),y) hold on %pause(0.2)
end %construirea liniilor orizontale
for j=1:M+1 plot(x,y(j)*ones(1,N+1)) hold on %pause(0.2) end %evidentierea nodurilor cu stelute sau cercuri
for k=1:(N+1)*(M+1) if Nod(k,3)==0 plot (Nod(k,1),Nod(k,2),'*b')%noduri exterioare
hold on else plot(Nod(k,1),Nod(k,2),'or')%noduri interioare
hold on end axis([a-0.2,b+0.2,c-0.2,d+0.2]) end %matricea dreptunghiurilor
Dr=zeros(N*M,4); kT=0; for j=1:M+1 for i=1:N+1 k=i+(N+1)*(j-1);%al catelea nod in numerotarea globala
if(i<=N)&&(j<=M) kT=kT+1; Dr(kT,1)=k; Dr(kT,2)=k+N+1; Dr(kT,3)=k+N+2; Dr(kT,4)=k+1; end end end display(Dr); %calculam MR si L
MR=zeros((N-1)*(M-1)); L=zeros((N-1)*(M-1),1); nd=N*M; %identificam coordonatele varfurilor dreptunghiului curent
for k=1:nd xd=zeros(4,1); yd=zeros(4,1); for j=1:4 xd(j)=Nod(Dr(k,j),1); yd(j)=Nod(Dr(k,j),2); end %calculam coeficientii functiei psi,a(j),b(j),c(j),d(j)
D=zeros(4); for j=1:4 D(1:4,j)=[xd(j)*yd(j);xd(j);yd(j);1]; end Dinv=inv(D); A=Dinv(1:4,1); B=Dinv(1:4,2); C=Dinv(1:4,3); %calculam matricea termenilor liberii Me si Le
Me=zeros(4); Le=zeros(4,1); ariaDr=(xd(3)- xd(1))*(yd(2)-yd(1)); for i=1:4 for j=1:4 R=((A(i)*A(j)*(yd(2)^2 + yd(1)*yd(2) +... yd(1)^2 + xd(3)^2 + xd(3)*xd(1) + ... xd(1)^2 )*1/3)+(A(i)*B(j)+A(j)*B(i))... *(y(2)+y(1))+(A(i)*C(j)+A(j)*C(i))*(x(3)+... x(1))*1/2 +B(i)*B(j)+C(i)*C(j))*ariaDr; Me(i,j)=R; end Le(i)=(f(xd(i),yd(i))*ariaDr/4); end display(Me) display(Le) %se adauga Me si Le in MR si L(analog ca si in cazul triunghiurilor)
for i=1:4 for j=1:4 if((Nod(Dr(k,i),3)~=0) && (Nod(Dr(k,j),3)~=0)) MR(Nod(Dr(k,i),3),(Nod(Dr(k,j),3)))=... MR(Nod(Dr(k,i),3),(Nod(Dr(k,j),3)))+Me(i,j); end if(Nod(Dr(k,i),3)~=0) L(Nod(Dr(k,i),3))=L(Nod(Dr(k,i),3))+Le(i); end end end end display(MR); display(L); %se rezolva sistemul MR*alpha=L
alpha=inv(MR)*L; %sau MR\L se foloseste pentru calcul mai rapid
display(alpha) U1=zeros(N-1,M-1); for i=1:N-1 for j=1:M-1 k=i+(N-1)*(j-1); U1(i,j)=alpha(k); end end U=zeros(N+1,M+1); U(2:N,2:M)=U1; display(U)%solutie exacta
figure(2)[X,Y]=meshgrid(a:0.1:b,c:0.1:d); Z=2*sin(X).*sin(Y); display(Z) surf(X,Y,Z); %solutie aproximativa
figure(3) [X,Y]=meshgrid(a:hx:b,c:hy:d); surf(X,Y,U'); function[z]=f(x,y) z=2.*sin(x).*sin(y); end end
What i want to do exactly is remove all the input variable and uncomment the input ones below so i can add them from keyboard.
Best Answer