ΜΑΣ 473/673: Μέθοδοι Πεπερασμένων Στοιχείων Ένα δυσδιάστατο παράδειγμα με το λογισμικό MATLAB Θεωρούμε το εξής Π.Σ.Τ.: Να βρεθεί η u(x, y) έτσι ώστε όπου f (x, y) = 1. u u f ( x, y), x ( 1,1) ( 1,1) x y u 0, x Θα δούμε πως μπορούμε να προσεγγίσουμε την λύση u(x, y) με την Μ.Π.Σ., χρησιμοποιώντας κατά τμήματα γραμμικές συναρτήσεις σε ένα ομοιόμορφο πλέγμα από τρίγωνα (όπως αυτό που φαίνεται στο πιο κάτω σχήμα για το χωρίο (0,1) (0, 1)). Θα εκμεταλλευτούμε ορισμένες εντολές βιβλιοθήκης της MATLAB για την κατασκευή του πίνακα ακαμψίας που εμφανίζεται στο γραμμικό σύστημα. Υποθέτουμε ότι έχουμε Ν + κομβικά σημεία (σε κάθε κατεύθυνση), άρα το μήκος πλέγματος είναι h = 1/(N+1) και ο συνολικός αριθμός των εσωτερικών κομβικών σημείων είναι Ν. (Σημειώστε ότι στο πιο πάνω σχήμα τα κομβικά σημεία είναι Ν +1 σε κάθε κατεύθυνση, αλλά για πρακτικούς λόγους εμείς θα επιλέξουμε Ν + ). Για παράδειγμα, αν διαλέξουμε Ν = 0, τότε στη MATLAB γράφουμε >> N=0; >> h=/(n+1); >> Ntotal=Ν^; 1
Η εντολή numgrid δημιουργεί το πιο πάνω πλέγμα και δουλεύει ως εξής: >> help numgrid NUMGRID Number the grid points in a two dimensional region. G = NUMGRID(REGION,N) numbers the points on an N-by-N grid in the subregion of -1<=x<=1 and -1<=y<=1 determined by REGION. SPY(NUMGRID(REGION,N)) plots the points. DELSQ(NUMGRID(REGION,N)) generates the 5-point discrete Laplacian. The regions currently available are: 'S' - the entire square. 'L' - the L-shaped domain made from 3/4 of the entire square. 'C' - like the 'L', but with a quarter circle in the 4-th square. 'D' - the unit disc. 'A' - an annulus. 'H' - a heart-shaped cardioid. 'B' - the exterior of a "Butterfly". 'N' - a nested dissection ordering of the square. Άρα για την περίπτωση μας, θα ορίσουμε το πλέγμα, ας πούμε grid, χρησιμοποιώντας την πιο πάνω εντολή με δεδομένα εισόδου το 'S' και το Ν +. >> grid=numgrid('s',n+); Μπορούμε να δούμε τα κομβικά σημεία με την εντολή >> spy(grid) Μπορούμε, επίσης, να δούμε και την αρίθμηση των σημείων εδώ το κάνουμε με πιο λίγα σημεία για να μπορέσουμε να δούμε τον πίνακα: >> numgrid('s',8)
ans = 0 0 0 0 0 0 0 0 0 1 7 13 19 5 31 0 0 8 14 0 6 3 0 0 3 9 15 1 7 33 0 0 4 10 16 8 34 0 0 5 11 17 3 9 35 0 0 6 1 18 4 30 36 0 0 0 0 0 0 0 0 0 Η εντολή delsq παίρνει σαν δεδομένο εισόδου το πλέγμα (δηλ. για μας το grid) και δίνει σαν δεδομένο εξόδου τον πίνακα ακαμψίας που αντιστοιχεί στην Λαπλασιανή. Άρα, γράφουμε >> A=delsq(grid); Τα στοιχεία του διανύσματος φορτίου b ( N 1) ισούνται με b f ( x, y) ( x, y) dxdy ( x, y) dxdy h i i i μια και οι Φi είναι οι συναρτήσεις στέγης (στις δύο διαστάσεις). Άρα, γράφουμε >> b = h^*ones(ntotal,1); >> ksi = A\b; Η λύση του συστήματος A b μας δίνει τις τιμές της προσεγγιστικής λύσης στα (εσωτερικά) κομβικά σημεία. Σημειώστε ότι στα κομβικά σημεία που βρίσκονται στο σύνορο του Ω ξέρουμε ότι η λύση είναι μηδέν. Για να μπορέσουμε, όμως, να δούμε το γράφημα της πρέπει να καταχωρήσουμε τις τιμές του σε ένα πίνακα του οποίου το στοιχείο στη θέση i, j να αντιστοιχεί με την τιμή της στο κομβικό σημείο με συντεταγμένες (xi, yj). Υπάρχουν διάφοροι τρόποι για να γίνει αυτό ένας είναι ο εξής: αρχικά ορίζουμε ένα μηδενικό πίνακα μεγέθους (Ν + )(Ν + ) και μετά με διπλό βρόγχο (i, j = 1,, N) καταχωρούμε την τιμή N ( i 1) j στη θέση (i+1, j+1) του πίνακα. Στη MATLAB γράφουμε >> uh=zeros(n+, N+); for i=1:n for j=1:n uh(i+1,j+1)=ksi(n*(i-1)+j); 3
Το μόνο που μας μένει είναι η κατασκευή του γραφήματος της, μέσω της εντολής surf: >> x=[-1:h:1]; >> y=[-1:h:1]; >> surf(x,y,uh) >> xlabel('x') >> ylabel('y') >> zlabel('u_h') >> title('approximate solution to Poisson''s equation') Θα ήταν καλύτερα αν η πιο πάνω διαδικασία γραφτεί σε ένα m-file, όπως φαίνεται πιο κάτω: function [] = femdunif(n) Finite element method on a uniform triangular mesh for -(u_xx+u_yy)=1 in (-1,1)^ u=0 on boundary Compute and plot solution for a given number n of (internal) subdivisions n (i.e. meshwidth h = 1/(n+1)) in each direction. h=/(n+1); grid=numgrid('s',n+); A=delsq(grid); N=n^; fh=h^*ones(n,1); U=A\fh; mesh size numerical grid on square 'S' construction of the stiffness matrix total number of interior nodes construction of the load vector FE solution at interior points compute solution values over all grid points uh=zeros(n+,n+); for i=1:n for j=1:n uh(i+1,j+1)=u(n*(i-1)+j); 4
plot solution x=[-1:h:1]; y=[-1:h:1]; surf(x,y,uh) xlabel('x') ylabel('y') zlabel('u_h') title('approximate solution to Poisson''s equation') Τρέχουμε το m-file για n = 50 και παίρνουμε το πιο κάτω γράφημα. >> femdunif(50) 5