Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Gabriella Puppo
Indice
Problema della trave elastica
Visualizzazione della soluzione
Problema della membrana elastica
Trave elastica
Vogliamo risolvere il problema:
24 -12 0 0 0 0 6 0 0 0
-12 24 -12 0 0 -6 0 6 0 0
0 -12 24 -12 0 0 -6 0 6 0
0 0 -12 24 -12 0 0 -6 0 6
0 0 0 -12 24 0 0 0 -6 0
0 -6 0 0 0 8 2 0 0 0
6 0 -6 0 0 2 8 2 0 0
0 6 0 -6 0 0 2 8 2 0
0 0 6 0 -6 0 0 2 8 2
0 0 0 6 0 0 0 0 2 8
Numero di condizionamento
Il numero di condizionamento
del problema della trave è molto
più grande di quello del filo
elastico
Andamento
Il numero di condizionamento per il
problema della trave elastica cresce
come N 4. La curva a pallini è stata
ottenuta interpolando i dati sul
condizionamento con un polinomio
di grado 4, con il metodo dei minimi
quadrati
Soluzione del problema della
trave
La function che calcola la soluzione del problema della trave deve:
function [uu,uux,x]=trave(f,n)
% Risolve il problema della trave elastica
% per condizioni al bordo omogenee di
% Dirichlet, con carico assegnato f
% e N punti interni
a=mat_trave(n);
h=1/(n+1); % spaziatura di griglia
Calcolo del vettore di carico: uso la regola di Simpson per stimare
gli integrali. Con questa regola di quadratura devo valutare f
anche sui nodi intermedi x i +h/2 (nodi sfalsati).
u=a\b';
% Ora aggiungo le condizioni al contorno
uu(2:n+1)=u(1:n); uu(1)=0; uu(n+2)=0;
uux(2:n+1)=u(n+1:2*n); uux(1)=0; uux(n+2)=0;
% Calcola il vettore delle ascisse
for i=0:n+1; x(i+1) = i*h; end
Trave con carico uniforme
Rosso: N=10, curva blu N=20 f=inline('-1+0*x');
Ho usato i seguenti comandi: [uu,uux,x]=trave(f,10);
subplot(1,2,1)
plot(x,uu,'r','Linewidth',2)
[uu,uux,x]=trave(f,20);
subplot(1,2,2)
plot(x,uu,'b','Linewidth',2)
Trave con carico puntiforme
Visualizzazione dei risultati
function [uu,xx]=visualizza_trave(u,ux,x)
% [UU,XX]=VISUALIZZA_TRAVE(U,UX,X) calcola
% i valori UU dell'interpolante cubico a tratti
% di Hermite sulla griglia XX, utilizzando i
% valori U di una funzione e i valori della sua
% derivata UX sui nodi X.
% La griglia XX e' costruita infittendo X
%
n=length(u)-1; %Numero intervalli
h=1/n;
m=10; hh=h/m; % Raffinamento di griglia
xx(1)=x(1); uu(1)=u(1);
for i=1:n
for jj=1:m
ii=m*(i-1)+jj+1;
y=jj*hh/h;
xx(ii)=x(i)+jj*hh;
phi1=1-y^2+2*dx^2*(dx-1); Calcolo delle
phi2=dx^2-2*dx^2*(dx-1); funzioni di base
phi3=dx-dx^2+dx^2*(dx-1); di elemento
phi4=dx^2*(dx-1);
uu(ii)=u(i)*phi1 +u(i+1)*phi2+ ... Calcolo
ux(i)*phi3 +ux(i+1)*phi4; dell’interpolante
sull’ elemento i,
end nel punto y
end
Trave con carico puntiforme
Esercizi
f(x)=2*exp(-x^2)*(x^2-6*x+1-7*x^4+14*x^3+2*x^6-4*x^5)
con soluzione esatta:
exa=x^2*(x-1)^2*exp(-x^2)
Membrana elastica
inizio=(i-1)*n+1;
e finisce alla riga
fine=i*n;
function a=laplaciano(n)
% A=LAPLACIANO(N) calcola la matrice del laplaciano
% sul quadrato, con N nodi interni su ogni lato.
b=ones(n-1,1);
g=4*eye(n)-diag(b,-1)-diag(b,1);
% g contiene i blocchi sulla diagonale
for i=1:n
inizio=(i-1)*n+1;
fine=i*n;
a(inizio:fine, inizio:fine)=g;
end
% costruisce le due diagonali lontane
b=ones(n^2-n,1);
a=a -diag(b,n) -diag(b,-n);
Metodo FEM in 2D
A questo punto, posso creare una function che risolva il problema
agli elementi finiti della membrana elastica. Questa function deve:
Creare la matrice;
Creare il vettore di carico (per ora considero
un carico uniforme)
Risolvere il sistema lineare
Ottengo questo programma
function uquad=membrana_unif(n)
% UQUAD=membrana(N) trova la soluzione del
% problema della membrana elastica, sul
% quadrato unitario, con N
% nodi interni per lato, con un carico
% uniforme
h = 1/(n+1);
a=laplaciano(n);
b= -h^2*ones(n^2,1);
u=a\b;
…continua...
Attenzione!
>> uu=membrana_unif(9);
>> mesh(uu)
>> x=linspace(0,1,21);
>> y=linspace(0,1,21);
>> mesh(x,y,u)
N.B.: ci sono 21
nodi per lato,
perché devo
considerare anche i
nodi sui bordi
Vorrei ora poter definire un carico più generale. Devo costruire
una funzione f(x,y), che mi dia i valori di f sul quadrato
>> f=inline('x.^2-y.^2');
>> x=linspace(-1,1,21);
>> y=linspace(-1:1,21);
>> f=inline('x.^2-y.^2');
>> x=linspace(-1,1,21);
>> y=linspace(-1:1,21);
>> [xx,yy]=meshgrid(x,y);
>> fxy=f(xx,yy);
function uquad=membrana(f,n)
% UQUAD=membrana(N) trova la soluzione del
% problema della membrana elastica, sul
% quadrato unitario, con N
% nodi interni per lato, con un carico
% assegnato tramite la funzione f(x,y)
a=laplaciano(n); h=1/(n+1);
% Calcola il carico sui nodi interni del quadrato:
x=linspace(0+h,1-h,n);
y=linspace(0+h,1-h,n);
[xx,yy]=meshgrid(x,y);
fxy=feval(f,xx,yy);
Per impostare il sistema lineare, devo costruire il vettore dei
termini noti, impostando il carico come vettore colonna, e
moltiplicando per h 2
>> u=membrana(f,100);