Show Menu
Cheatography

Metodi numerici Cheat Sheet (DRAFT) by

Formulario MATlab metodi numerici e calcolo scientifico

This is a draft cheat sheet. It is a work in progress and is not finished yet.

Sistemi lineari

Jacobi

n = size(A,1);
D = spdiags(diag(A),0,n,n);
N = A-D;
for k = 1:kmax
    x = D\(b-N*x);
    res_rel = norm(b-A*x)/norm(b);
    if res_rel <= toll
        break
    end
end

Gauss-­Seidel

M = tril(A);
N = A-M;
for k = 1:kmax
    x = M\(b-N*x);
    res_rel = norm(b-A*x)/norm(b);
    if res_rel <= toll
        break
    end
end

Gradiente

r = b-A*x;
for k = 1:kmax
    z = A*r;
    alpha = (r'r)/(r'z);
    x = x + alpha*r;
    r = r - alpha*z;
    res_rel = norm(r)/norm(b);
    if res_rel <= tol
        break
    end
end

Quadratura

Trapezi composita

x = linspace(a,b,n+1);
y = f(x);
h = (b-a)/n;
Itrap = (h/2)(y(1) + 2sum(y(2:end-1)) + y(end));

Simpson composita

x = linspace(a,b,2*n+1);
y = f(x);
h = (b-a)/n;
Isimpson = (h/6)(y(1) + 4sum(y(2:2:end-1)) + 2*sum(y(3:2:end-2)) + y(end));

PDE

Differenze finite DD

N = length(x) - 1;
h = x(2) - x(1);
xM = (x(1:end-1)+x(2:end))/2;
muVec = mu(xM);

d0 = 1/h^2*(muVec(1:end-1) + muVec(2:end));
d1 = -1/h^2*muVec(2:end);
d_1 = -1/h^2*muVec(1:end-1);

A = spdiags([d_1, d0, d1], [-1, 0, 1], N-1, N-1);
b = f(x(2:end-1));
b(1) = b(1) + (1/h^2)*muVec(1) *BC(1);
b(end) = b(end) + (1/h^2)*muVec(end)*BC(2);

u = A\b;
u = [BC(1); u; BC(2)];

Differenze finite ND

N = length(x) - 1;
h = x(2) - x(1);
xM = (x(1:end-1)+x(2:end))/2;

d0 = mu/h^2*([1; 2*ones(N-1,1)]);
d1 = -mu/h^2*ones(N,1);
d_1 = -mu/h^2*ones(N,1);

A = spdiags([d_1, d0, d1], [-1, 0, 1], N, N);
b = f(x(1:end-1));
b(1) = 1/2*b(1)-BC(1)/h;
b(end) = b(end) + 1/h^2*mu*BC(2);

u = A\b;
u = [u; BC(2)];

Elementi finiti DD

N = length(x) - 1;
h = diff(x);
xM = x(1:N) + 0.5*h;
muVec = mu(xM)./h;

d = muVec(1:N-1) + muVec(2:N);
d_1 = -muVec(2:N);
d1 = -muVec(1:N-1);

A = spdiags([d_1 d d1], [-1 0 1], N-1, N-1);

b = f(x(2:N)).*(h(1:N-1) + h(2:N))*0.5;
b(1) = b(1) + muVec(1)*BC(1);
b(N-1) = b(N-1) + muVec(N-1)*BC(2);

uDof = A\b;
u = [BC(1); uDof; BC(2)];

Elementi finiti ND

N = length(x) - 1;
h = diff(x);
xM = x(1:N) + 0.5*h;
muVec = mu(xM)./h;

d = [muVec(1); muVec(1:N-1) + muVec(2:N)];
d_1 = -[muVec(1); muVec(2:N)];
d1 = -[muVec(1); muVec(1:N-1)];

A = spdiags([d_1 d d1], [-1 0 1], N, N);

b = f(x(2:N)).*(h(1:N-1) + h(2:N))*0.5;
b = [0.5*f(x(1))*h(1) - BC(1); b];
b(end) = b(end) + muVec(end)*BC(2);

uDof = A\b;
u = [uDof; BC(2)];
 

Equazioni non lineari

Newton

for k=1:kmax
    x = x0 - m*f(x0)/df(x0);
    errx(k) = abs(x-x0)/abs(x);
    val_f = f(x);
    if val_f<=tolf
        break
    end
    if errx(k)<=tolr
        break
    end
    x0 = x;
end

Punto fisso

x_vec(1) = x0; 
for k=1:kmax
    x = phi(x0);
    x_vec(k+1) = x;
    errx(k) = abs(x-x0)/x;
    if errx(k)<=tolr
        break
    end
    val_f = abs(phi(x)-phi(x0));
    if val_f<=tolf
        break
    end
    x0 = x;
end
Attenzione in versione 2014 l'aggiunta di elementi in un vettore

ODE

Eulero esplicito

t = t0:dt:T;
u = zeros(length(t),1);
u(1) = u0;
for k = 1:length(t) - 1
    u(k+1) = u(k) + dt*f(t(k),u(k));
end
t = t';

Eulero implicito

t = t0:dt:T;
u = zeros(length(t),1);
u(1) = u0;
for k = length(t)-1
    u(k+1) = 1/(1 - dtlambda)u(k);
end
t = t';

Eulero sistemi

t = t0:dt:T;
dim_u = size(u0,1);
u = zeros(length(t),dim_u);
u(1,:) = u0;
for k = 1:length(t) - 1
    u(k+1,:) = u(k,:) + dt*f(t(k),u(k,:))';
end
t = t';