Anteprima
Vedrai una selezione di 5 pagine su 18
Matlab - esame calcolo numerico con elementi di programmazione Pag. 1 Matlab - esame calcolo numerico con elementi di programmazione Pag. 2
Anteprima di 5 pagg. su 18.
Scarica il documento per vederlo tutto.
Matlab - esame calcolo numerico con elementi di programmazione Pag. 6
Anteprima di 5 pagg. su 18.
Scarica il documento per vederlo tutto.
Matlab - esame calcolo numerico con elementi di programmazione Pag. 11
Anteprima di 5 pagg. su 18.
Scarica il documento per vederlo tutto.
Matlab - esame calcolo numerico con elementi di programmazione Pag. 16
1 su 18
D/illustrazione/soddisfatti o rimborsati
Disdici quando
vuoi
Acquista con carta
o PayPal
Scarica i documenti
tutte le volte che vuoi
Estratto del documento

FUNCTION TRAPEZI

function [ T_new, Nnodi, err ] = Trapezi(a, b, toll, f)

%%%% Approssimazione di un integrale definito con la formula dei trapezi

% e il criterio di Runge: [ T_N, Nnodi, err ] = Trapezi(a, b, rho, f_int)

%% Input:

% a,b: estremi dell'intervallo di integrazione

% rho: accuratezza

% f_int(x): funzione integranda

%% Output:

% T_N: approssimazione finale dell'integrale

% Nnodi: numero di nodi finale

% err: errore finale

%%% Approssimazione con la formula del trapezio

T_1 = (b-a) / 2 * ( f(a) + f(b) );

% Inizializzazioni

N = 1; % Numero di nodi iniziale: N+1

h = (b-a)/N; % Passo di integrazione

err = 10*toll;

T_old = T_1;

% Ciclo iterativo

while abs(err) > toll

N = N*2;

h = h/2;

xnodi = linspace(a,b,N+1);

T_new = h / 2 * ( f(xnodi(1)) + 2*sum(f(xnodi(2:N))) + f(xnodi(N+1)) );

err = (T_new - T_old) / 3;

T_old = T_new;

end

Nnodi = N+1;

end

FUNCTION UPWIND

function [ Uij ] = UpWind ( alpha, N, M, Ui0, U0j )

%% Uij = UpWind(alpha, N, M, Ui0, U0j)

% Soluzione dell'equazione del

trasporto con il metodo upwind

Input:
<ul>
  <li>alpha: numero di Courant</li>
  <li>N+1: numero di nodi spaziali</li>
  <li>M+1: numero di nodi temporali</li>
  <li>Ui0(1:N+1,1): condizione iniziale</li>
  <li>U0j(1,1:M+1): condizione al bordo sinistro</li>
</ul>

Output:
<ul>
  <li>Uij(1:N+1,1:M+1): soluzione approssimata nei nodi</li>
</ul>

Inizializzazione del vettore delle approssimazioni
<pre><code>Uij = nan(N+1,M+1);</code></pre>

Condizione iniziale
<pre><code>Uij(:,1) = Ui0;</code></pre>

Condizione al bordo sinistro
<pre><code>Uij(1,:) = U0j;</code></pre>

Algoritmo del metodo upwind
<pre><code>for j = 1:M
  for i = 2:N+1
    Uij(i,j+1) = (1-alpha) * Uij(i,j) + alpha * Uij(i-1,j);
  end
end</code></pre>

<pre><code>%oppure
for j = 1:M
  Uij(2:N,j+1) = (1-alpha) * Uij(2:N,j) + alpha * Uij(1:N-1,j);
end
end</code></pre>

func upwind 2

FUNC APPROX TRIGONOMETRICA

function[ p_ndeg, ak, bk ] = PolApproxTrig(xnodi, fnodi, nord, xeval)
  % Costruisce il polinomio trigonometrico di grado ndeg per approssimare
  % dati periodici: [p_ndeg,ak,bk] = PolApproxTrig(xnodi,fnodi,ndeg,xeval)

Input:
<ul>
  <li>xnodi(nnodi): vettore dei nodi</li>
  <li>fnodi(nnodi): funzione da approssimare calcolata nei nodi</li>
  <li>ndeg: grado del polinomio</li>
  <li>xeval: punto in cui valutare il polinomio</li>
</ul>

polinomio trigonometrico% xeval(nx): vettore dei punti in cui calcolare il polinomio trigonometrico%

% Output:% p_ndeg(nx): polinomio trigonometrico calcolato in xeval% ak(ndeg+1),bk(ndeg): coefficienti del polinomio%

% Calcolo dei coefficientinnodi = length(xnodi);ak = nan(1,nord+1);bk = nan(1,nord);ak(1) = 2 / nnodi * sum( fnodi );for k=1:nordak(k+1) = 2 / nnodi * sum( fnodi .* cos(k*xnodi) );bk(k) = 2 / nnodi * sum( fnodi .* sin(k*xnodi) );end% Calcolo del polinomio trigonometricop_ndeg = ak(1) / 2;for k=1:nordp_ndeg = p_ndeg + ak(k+1) * cos(k*xeval) + bk(k) * sin(k*xeval);endendfunc approx trig 3METODO APPROSSIMAZIONEfunction [ x_new, dist_k, k_iter ] = Metodo_approx( x_old, epsilon, N_max, phi )% Metodo_approx: approssima il punto unito di una funzione con il metodo delle% approssimazioni successive%% [ x_fin, dist_fin, k_fin ] = Metodo_approx( x0, epsilon, N_max, phi )%% Input:% x0: approssimazione iniziale% epsilon: accuratezza richiesta% N_max: numero iterazioni% phi: funzione

di iterazione Output: x_fin: approssimazione del punto unito dist_fin: accuratezza raggiunta k_fin: iterazioni eseguite Inizializzazione del ciclo iterativo ```matlab dist_k = 10*epsilon; k_iter = 1; ``` Ciclo iterativo ```matlab while dist_k > epsilon && k_iter <= N_max x_new = phi(x_old); dist_k = abs(x_new-x_old); k_iter = k_iter + 1; x_old = x_new; end k_iter = k_iter - 1; ``` Funzione approx 4 ```matlab FUNCTION HEUN 1D function [ Ti, Yi ] = Heun1D(ffun,Tspan,Y0,n_step) % [ Ti, Yi ] = Heun1D(ffun,Tspan,Y0,n_step) % Soluzione di un'equazione differenziale del primo ordine % ai valori iniziali con il metodo di Heun %% INPUT % ffun(t,y): termine noto del problema differenziale (function) % Tspan(1:2): estremi dell'intervallo di integrazione % Y0(1): condizioni iniziali (vettore colonna) % n_step: numero di passi temporali %% OUTPUT % Ti(1:n_step+1): nodi di discretizzazione (equispaziati) % Yi(1:n_step+1): matrice delle approssimazioni % Passo di discretizzazione h = (Tspan(end)-Tspan(1))/n_step; ``` Punti di```html

discretizzazione (nodi equispaziati)Ti = linspace(Tspan(1),Tspan(end),n_step+1);Ti = Ti';% Inizializzazione degli arrayYi = nan(n_step+1,1);% Condizione inizialeYi(1) = Y0;% Metodo di Heunfor i = 1:n_stepY_old = Yi(i);K1 = ffun(Ti(i),Y_old);K2 = ffun(Ti(i+1),Y_old+h*K1);Yi(i+1) = Y_old + h * ( K1 + K2 ) / 2;endendfunc heun1D 5FUNCTION HEUN Dfunction [ Ti, Yi ] = HeunD(ffun,I,Y0,n_step)% [ Ti, Yi ] = Heun(ffun,Tspan,Y0,n_step)% Soluzione di un sistema differenziale Y’=ffun(t,Y), Y(t0)=Y0% di D equazioni differenziali con il metodo di Heun%% INPUT% Tspan(1:2): estremi dell'intervallo di integrazione% n_step: numero di passi temporali% ffun(1,1:D): vettore contenente il termine noto del problema differenziale% Y0(1,1:D): condizioni iniziali.%% OUTPUT% Ti(1:n+1,1): nodi di discretizzazione% Yi(1:n+1,D): matrice contenente le approssimazioni% Passo di discretizzazioneh = (I(end)-I(1))/n_step;% Punti di discretizzazione (nodi equispaziati)Ti =

``` ```html linspace(I(1),I(end),n_step+1); Ti = Ti';% Inizializzazioni D = length(Y0); Yi = nan(n_step+1,D); % Condizioni iniziali Yi(1,1:D) = Y0(:); % Metodo di Heun for i = 1:n_step Y_old = Yi(i,:); K1 = ffun(Ti(i), Y_old); K2 = ffun(Ti(i+1), Y_old + h * K1); Yi(i+1,:) = Y_old + h * ( K1 + K2 ) / 2; end end func heun D 6 METODO JACOBI function [X_new, dist_k, k_iter] = Metodo_Jacobi(A, B, X_old, epsilon, N_max) % Metodo_Jacobi: approssima la soluzione di un sistema lineare % con il metodo di Jacobi % [ X_fin, dist_fin, k_fin ] = Metodo_Jacobi( A, B, X0, epsilon, N_max ) % Input: % A, B: matrice dei coefficienti e termine noto del sistema lineare % X0: approssimazione iniziale % epsilon: accuratezza richiesta % N_max: numero iterazioni % Output: % X_fin: approssimazione della soluzione % dist_fin: accuratezza raggiunta % k_fin: iterazioni esguite % Viene stampato un warning se il numero di iterazioni massimo dato % in input non è sufficiente a raggiungere l'accuratezza richiesta. % Costruzione della

matrice di iterazione

L = tril(A,-1);

U = triu(A,1);

Minv = diag(1./diag(A));

CJ = - Minv * (L+U);

QJ = Minv * B;

clear L U

Inizializzazione del ciclo iterativo

dist_k = 10*epsilon;

k_iter = 1;

Ciclo iterativo

while dist_k > epsilon && k_iter <= N_max

X_new = CJ * X_old + QJ;

dist_k = norm(X_new-X_old,inf);

X_old = X_new;

k_iter = k_iter + 1;

end

k_iter = k_iter - 1;

Verifica sul numero di iterazioni eseguite

if k_iter+1 > N_max && dist_k > epsilon

fprintf('Il metodo NON ha raggiunto l'accuratezza richiesta dopo %7d iterazioni\n',N_max)

end

end

func jacobi 7

FUNCTION LAGRANGE

function [ plag, pnod ] = PolLagrange( xnodi, xx )

Polinomi di base di Lagrange: [plag,pnod] = PolLagrange(xnodi,xx)

Polinomio interpolatore nei punti xx: pn = fnodi * plag';

Input:

xnodi(1:nnodi): vettore dei nodi

xx(1:n): vettore dove calcolare i polinomi di base di Lagrange

Output:

plag(1:n,1:nnodi): matrice contenente i valori dei polinomi di base Lagrange

```html

colonne% pnod(1:n): vettore (riga) contenente i valori del polinomio nodale

% Dimensioni vettorinnodi = length(xnodi);n = length(xx);

% Calcolo del polinomio nodale

pnod = nan(n,1);

for i=1:npnod(i) = prod(xx(i)-xnodi);end

% Calcolo dei polinomi di base di Lagrange

plag = nan(n,nnodi);

for k=1:nnodifor i=1:nplag(i,k) = prod(xx(i)-xnodi(1:k-1))*prod(xx(i)-xnodi(k+1:nnodi))/ ...(prod(xnodi(k)-xnodi(1:k-1))*prod(xnodi(k)-xnodi(k+1:nnodi)));endend

func lagrange 8FUNCTION ODE

function [ Xi, Yi ] = ODE( I, Ybc, p, q, r, N )

% [ Xi, Yi ] = ODE( I, Ybc, p, q, r, N )

% Approssimazione della soluzione del problema ai limiti lineare

% y''(x) = p(x) y'(x) + q(x) - r(x) a < x < b

% y(a) = alpha y(b) = beta

% con lo schema alle differenze finite lineare.

% INPUT:

% I = [a, b]: estremi dell'intervallo di integrazione

% Ybc = [alpha, beta]: condizioni al bordo

% p(x), q(x), r(x): termini noti del problema differenziale (function)

% N: numero di nodi interni

% OUTPUT:

% Xi(1:N+2): vettore

```

dei nodi (vettore riga)% Yi(1:N+2): vettore delle approssimazioni (vettore riga)%% Usa THOMAS_DIAG% % Passo spazialeh = ( I(2)-I(1) ) / (N+1);% Vettore dei nodiXi = linspace(I(1),I(2),N+2);% Costruzione della matrice del sistema lineareAdiag = 2 + h^2 * q(Xi(2:N+1)); % diagonale principale oppureA_diag = 2+h^2*q(xi(2:N+1)).*ones(1,N);Acosup = -1 + h * 0.5 * p(Xi(2:N)); % codiagonale superiore oppureA_coinf = -1-h/2*p(xi(3:N+1)) .* ones(1,N-1);Acoinf = -1 - h * 0.5 * p(Xi(3:N+1)); % codiagonale inferiore oppureA_cosup = -1+h/2*p(xi(2:N)) .* ones(1,N-1);% Termine notoB = h^2 * r(Xi(2:N+1)); % oppure B = h^2*r(xi(2:N+1)).*ones(1,N);B(1) = B(1) + ( 1 + h * 0.5 * p(Xi(2)) ) * Ybc(1);B(N) = B(N) + ( 1 - h * 0.5 * p(Xi(N+1)) ) * Ybc(2);% Soluzione del sistema lineare con l'algoritmo di ThomasYi = Thomas_diag(Adiag, Acoinf, Acosup, B);% Condizioni al bordoYi = [Ybc(1), Yi, Ybc(2)];endfunc ODE 9FUNCTION THOMASfunction [X] = Thomas_diag(D,A,S,B)%------------------------------------------

Soluzione di un sistema lineare tridiagonale con l'algoritmo di Thomas:

X = Thomas_diag(D,A,S,B)
-----------------------------------------
Input:
D: diagonale principale di A (vettore)
A: diagonale inferiore di A (vettore)
S: diagonale superiore di A (vettore)
B: termine noto

Output:
X: vettore soluzione

Verifica delle dimensioni dei vettori
in = length(D);
la = length(A);
ls = length(S);
lb = length(B);
if la~=ls || la~=n-1 || lb~=n
    error('Le dimensioni dei vettori non sono corrette')
end

Inizializzazione dei vettori Alfa, U, Y
Alfa = zeros(1,n-1);
U = zeros(1,n);
Y = zeros(1,n);

Fattorizzazione LU di A
U(1) = D(1);
Dettagli
Publisher
A.A. 2019-2020
18 pagine
2 download
SSD Scienze matematiche e informatiche MAT/08 Analisi numerica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher user.k di informazioni apprese con la frequenza delle lezioni di Calcolo numerico e programmazione e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università degli Studi di Roma La Sapienza o del prof Pitolli Francesca.