metodi fem per problemi ellittici lineari a tratti gabriella puppo

37
Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

Upload: clara-bertolini

Post on 01-May-2015

224 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

Metodi FEM per problemi ellittici lineari a tratti

Gabriella Puppo

Page 2: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

Principali argomenti

Costruzione della matrice di rigiditàCondizionamentoProblemi misti e di DirichletAndamento dell’ errore

Page 3: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

Matrice di rigidità

La matrice di rigidità per il filo elastico, con condizioni al bordo di Dirichlet, è data da:

Moltiplicando per h, ottengo una matrice che dipende solo dal numero degli intervalli

Page 4: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

function tridiag

Questa function calcola la matrice tridiagonale del filo elastico:

function a=tridiag(n)% A=TRIDIAG(N) Crea la matrice N per N tridiagonale del% filo elasticoa=2*eye(n);for i=1:n-1 a(i,i+1)=-1; a(i+1,i)=-1;end

Page 5: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

La stessa matrice può essere costruita in diversi modi. Il listato a sinistra è meno efficiente, perché non usa le istruzioni vettoriali:

function tridiag2

function a=tridiag2(n)for i=1:n for j=1:n if i==j a(i,j)=2; elseif i==j-1 | i==j+1 a(i,j)=-1; else a(i,j)=0; end endend

Page 6: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

function tridiag3

Se invece utilizzo le potenzialità vettoriali di Matlab, posso scrivere la function in questo modo:

function a=tridiag3(n)b=ones(n,1);b1=ones(n-1,1);a=2*diag(b,0)-diag(b1,-1)-diag(b1,1);

Page 7: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

Condizionamento della matrice di rigidità

Costruire uno script che calcoli il numero di condizionamento della matrice di rigidità, come funzione del numero N di intervalli, e ne disegni il grafico.

nmax=200;for n=1:nmax a=tridiag(n); c(n)=cond(a);endplot(c,'Linewidth',2)title('Numero di condizionamento')

Page 8: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

Lo script precedente fornisce il grafico seguente:

Page 9: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

Si dimostra che il numero di condizionamento cresce come N 2

Per verificarlo, possiamo interpolare nel senso dei minimi quadrati con un polinomio di grado 2:

p=polyfit(1:nmax,c,2)p = 4.0529e-01 8.1048e-01 -2.5681e-01

Per verificare che questo polinomio rappresenta accuratamente i nostri dati, sovrapponiamo i grafici del polinomio e del numero di condizionamento

Page 10: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

Per verificare che questo polinomio rappresenta accuratamente i nostri dati, sovrapponiamo i grafici del polinomio (in verde) e del numero di condizionamento(pallini blu)

Page 11: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

… ma se non sapessi m a priori, come potrei determinarlo?

Esercizio.

Calcolare i polinomi di interpolazione dei dati sul condizionamento per diversi valori del grado m e osservare i coefficienti dei polinomi ottenuti.

Page 12: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

Problema del filo elastico, con carico uniforme

Per scrivere una function che risolva il problema del filo elastico con condizioni omogenee di Dirichlet al bordo, e con carico uniforme, dobbiamo:

- Impostare in input il numero di intervalli;

-Costruire la matrice di rigidità

- Preparare il vettore di carico

- Risolvere il sistema lineare

- Aggiungere le condizioni al bordo

Page 13: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

function filo_unif

function [u,x]=filo_unif(n)% Risolve il problema del filo elastico % per condizioni al bordo omogenee di% Dirichlet, con carico uniforme% e N punti internia=tridiag(n);h=1/(n+1); % spaziatura di grigliab=-h^2*ones(n,1); % ho portato h a sinistrau=a\b;% Ora aggiungo le condizioni al contornou(2:n+1)=u; u(1)=0; u(n+2)=0;% Calcola il vettore delle ascissefor i=0:n+1; x(i+1) = i*h; end

Page 14: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

La soluzione del problema del filo elastico ha questo andamento:

Page 15: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

Scriviamo ora una function che ci permetta di calcolare la posizione di equilibrio del filo, per carichi f da definire dall’esterno.

Per risolvere un problema specifico, con una funzione carico assegnata, dovremo creare una function come file.m o come oggetto inline che contenga l’espressione del carico

Page 16: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

Problema del filo elastico, con carico assegnato

Per scrivere una function che risolva il problema del filo elastico con condizioni omogenee di Dirichlet al bordo, e con carico assegnato dall’esterno, dobbiamo:

- Impostare in input la funzione carico e il numero di intervalli;

-Costruire la matrice di rigidità

- Preparare il vettore di carico

- Risolvere il sistema lineare

- Aggiungere le condizioni al bordo

Page 17: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

function [x,u]=filo_dir(f,n)% Risolve il problema del filo elastico su (0,1)% per condizioni al bordo omogenee di% Dirichlet, con carico definito dalla funzione% F e N punti internia=tridiag(n);h=1/(n+1); % spaziatura di griglia% calcola la posizione dei nodi interni:for i=1:n; x(i) = i*h; endb=h^2*feval(f,x); b=b'; % ho portato h a sinistrau=a\b;% Ora aggiungo le condizioni al contornou(2:n+1)=u; u(1)=0; u(n+2)=0;x(2:n+1)=x; x(1)=0; x(n+2)=1;

Ho ottenuto il seguente listato:

Page 18: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

Esempio

Risolviamo il problema del filo elastico soggetto ad un caricodefinito dalla funzione:

f(x) = - sin( 2 x)

Page 19: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

Devo dare i seguenti comandi:

>> f=inline('sin(2*pi*x)');>> [x,u]=filo_dir(f,50);>> plot(x,u,'Linewidth',2)

Ottengo:

Vedi lo script script_filo

Page 20: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

Risolviamo il problema del filo elastico soggetto ad un caricopuntiforme, cioe’:

f(x) = - delta( x-0.5 )

Esempio 2

Page 21: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

function che descrive un carico puntiforme:

function f=delta(x)% F=DELTA(X): Costruisce un vettore riga, che contiene% un carico a forma di delta, quindi F(N/2)=-N, dove% N e' la lunghezza di X, cioe' F(N/2) = -N su un intervallo% di ampiezza 1/Nn=length(x);f=zeros(1,n);if mod(n,2)==0 % controlla se n e' pari f(n/2)= -n/2; f(n/2 +1)= -n/2;else f((n+1)/2)= -n;end

Page 22: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

Risolviamo il problema per diversi valori di N:

[x,u]=filo_dir(@delta,9);plot(x,u,'r','Linewidth',2)hold on[x,u]=filo_dir(@delta,99);plot(x,u,'g','Linewidth',2)[x,u]=filo_dir(@delta,999); plot(x,u,'c','Linewidth',2)

Page 23: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

Si ottiene il seguente grafico:

Page 24: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

Problema misto

Il problema di Poisson, con condizioni al bordo miste, dà matrici che hanno un numero di condizionamento più elevato rispetto al caso con condizioni di Dirichlet.Costruire un programma che costruisca un grafico con:

1) L’andamento del numero di condizionamento per il problema di Dirichlet, in funzione del numero di incognite, N.

2) L’andamento del numero di condizionamento per il problema misto, in funzione del numero di incognite, N.

Page 25: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

Esempio (qui la condizione di Neumann è posta in x=0)

% Paragona il numero di condizionamento della matrice del filo% elastico, con condizioni di Dirichlet, e con condizioni miste, a% parita’ di numero di nodi.nmax=100;for n=1:nmax a=tridiag(n); cd(n)=cond(a); a(1,1)=1; cn(n)=cond(a);endni=1:nmax;plot(ni,cd,'go'); hold on; plot(ni,cn,'b+')legend('Dirichlet','Problema misto')title('Numero di condizionamento')

Page 26: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

Ottengo questo risultato

Page 27: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

Filo vincolato e filo libero ad un estremo

Abbiamo visto come le condizioni al contorno influenzano il numero di condizionamento della matrice di rigidità.

Vorrei ora vedere come le condizioni al contorno influenzano la soluzione, cioè vorrei vedere come la forma del filo dipende dalle condizioni al contorno, a parità di h.

Considero due carichi diversi:1) Carico uniforme: f(x) = - 1;2) Carico puntiforme.

Page 28: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

Matrice di rigidità

Per il problema misto, la matrice di rigidità ha una riga in più, einoltre a(1,1) = 1.

function a=tridiag_mista(n)% A=TRIDIAG(N) Crea la matrice (N+1) per (N+1) tridiagonale % del filo elastico, con condizione di Neumann in x=0% e condizione di Dirichlet in x=1a=2*eye(n+1);for i=1:n a(i,i+1)= -1; a(i+1,i)= -1;enda(1,1)=1;

Page 29: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

Il programma che impone condizioni miste al bordo è:

function [x,u]=filo_misto(f,n)% Risolve il problema del filo elastico su (0,1)% per condizioni al bordo omogenee di% Neumann in x=0, e di Dirichlet in x=1, % con carico definito dalla funzione% F e N punti interni

continua ...

Page 30: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

a=tridiag_mista(n);h=1/(n+1); % spaziatura di griglia% calcola la posizione dei nodi interni:for i=1:n+1; x(i) = (i-1)*h; end %considera anche x=0b=h^2*feval(f,x); b=b'; % ho portato h a sinistrau=a\b;% Ora aggiungo la condizione al contorno% di Dirichlet a destrau(n+2)=0;x(n+2)=1;

…continua

Page 31: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

Posso ora paragonare le due soluzioni, con f(x) = 1:

>> f=inline('-1+0*x');>> [x,u]=filo_misto(f,100);>> [xd,ud]=filo_dir(f,100);>> plot(x,u,'Linewidth',2)>> hold on>> plot(xd,ud,'g','Linewidth',2)>> legend('Condiz. miste','Condiz. di Dirichlet')>> title('Filo elastico, f(x) = -1')

Page 32: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

Ottengo questa figura:

Page 33: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

Per confrontare le due soluzioni nel caso del carico puntiforme,devo dare questi comandi:

[x,u]=filo_misto('delta',100);[xd,ud]=filo_dir('delta',100);plot(x,u,'Linewidth',2)hold onplot(xd,ud,'g','Linewidth',2)legend('Condiz. miste','Condiz. di Dirichlet')title('Filo elastico, f(x) = -delta(0.5)')

Page 34: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

Ottengo questa figura

Page 35: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

Esercizio 1

Costruire una function che accetti anche condizioni al bordo di Dirichlet non omogenee.Suggerimento: è sufficiente modificare la prima e l’ ultima componente del vettore dei termini noti.

Page 36: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

Esercizio 2

Costruire una function che accetti anche una condizione al bordo di Neumann non omogenea.Suggerimento: è sufficiente modificare la prima e l’ ultima componente del vettore dei termini noti, per il problema di Neumann.

Page 37: Metodi FEM per problemi ellittici lineari a tratti Gabriella Puppo

Esercizio 3

Calcolare un problema in modo tale da conoscere la soluzione esatta: per esempio, assegno:

Calcolo ora il vettore di carico che darebbe quella soluzione, cioè:

Infine chiamo la function filo_dir, con il carico f(x).Calcolare la velocità di convergenza, al variare di N.