vuoi
o PayPal
tutte le volte che vuoi
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```htmldiscretizzazione (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 =
``` ```htmllinspace(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);