Esercizio in MATLAB
Calcolo Numerico
C.d.L in Ingegneria Informatica
a. a. 2008/2009
Elaborato 2
1. Scrivere una function Matlab che calcola, a seconda del numero di parametri di
input, l’inversa di una matrice A o la soluzione di un sistema lineare (o m sistemi
lineari con stessa matrice dei coefficienti) Ax=b
utilizzando :
• L’algoritmo di fattorizzazione LU con memorizzazione in place e il pivoting
parziale con scambio virtuale delle righe, e gli algoritmi di forward substitution
e back substitution.
Per lo sviluppo dell’elaborato si seguano le seguenti specifiche:
• parametri di INPUT:
A, matrice quadrata di reali di dimensione n×n
b, facoltativo, vettore di dimensione n(matrice di dimensione n×m), termine
noto del sistema Ax=b,( termini noti di m sistemi con A matrice dei coefficienti).
• parametri di OUTPUT:
Nel caso di un parametro di input:
x, matrice quadrata di reali di dimensione n×n, inversa di A.
Nel caso di due parametri di input:
x, vettore di dimensione n, soluzione del sistema (matrice di dimensione n×m,
le cui colonne sono le soluzioni degli m sistemi)
La function deve arrestarsi con un messaggio di errore per l’utente nel caso di
singolarità del sistema.
qualcuno potrebbe aiutarmi a fare questo esercizio? sn veramente negato in matlab grazie
C.d.L in Ingegneria Informatica
a. a. 2008/2009
Elaborato 2
1. Scrivere una function Matlab che calcola, a seconda del numero di parametri di
input, l’inversa di una matrice A o la soluzione di un sistema lineare (o m sistemi
lineari con stessa matrice dei coefficienti) Ax=b
utilizzando :
• L’algoritmo di fattorizzazione LU con memorizzazione in place e il pivoting
parziale con scambio virtuale delle righe, e gli algoritmi di forward substitution
e back substitution.
Per lo sviluppo dell’elaborato si seguano le seguenti specifiche:
• parametri di INPUT:
A, matrice quadrata di reali di dimensione n×n
b, facoltativo, vettore di dimensione n(matrice di dimensione n×m), termine
noto del sistema Ax=b,( termini noti di m sistemi con A matrice dei coefficienti).
• parametri di OUTPUT:
Nel caso di un parametro di input:
x, matrice quadrata di reali di dimensione n×n, inversa di A.
Nel caso di due parametri di input:
x, vettore di dimensione n, soluzione del sistema (matrice di dimensione n×m,
le cui colonne sono le soluzioni degli m sistemi)
La function deve arrestarsi con un messaggio di errore per l’utente nel caso di
singolarità del sistema.
qualcuno potrebbe aiutarmi a fare questo esercizio? sn veramente negato in matlab grazie
Risposte
piccolo hint
%fattorizzazione lu senza pivot
function [L U b]= miolu(A,b)
if size(A,1)== size(b,1)
A=[A b];
else
error('Il numero di righe di b non e pari a quello di A')
end
[m n]=size(A);
for k=2:m
if A(k-1,k-1)==0
error(['Il minore principale di ordine ' num2str(k-1) 'e''nullo']) % num2str significa "number to strig"
end
A(k:end, k-1)=A(k:end,k-1)./A(k-1,k-1);
for j=k:n
A(k:end,j)=A(k:end,j)-A(k:end,k-1).*A(k-1,j);
end
end
if A(m,m)==0
error(['Il minore principale di ordine ' num2str(m) 'e''nullo'])
end
L=eye(m);
L=L+tril(A(1:m,1:m),-1);
U=triu(A(1:m,1:m));
b=A(:,m+1:n);
un mio amico l ha fatto cosi voi ke ne pensate?
function x=gausspiv(A,b)
[n,m]=size(A);
if n~=m
error('La matrice A deve essere quadrata [n x n]');
end
if nargin == 1
b=eye(n);
end
[l,p]=size(b); %#ok<NASGU>
if n~=l
error('Dimensione di b non valida');
end
piv=1:n;
zero=eps(norm(A,inf)); % calcolo dello zero macchina per A
for k = 1 : n-1
r = min(find(abs(A(piv(k:n),k))==max(abs(A(piv(k:n),k))))+ (k-1));
if abs(A(piv(r),k)) > zero
if r~=k
piv([k r])=piv([r k]);
end
for z = k+1 : n
A(piv(z),k) = A(piv(z),k) / A(piv(k),k);
for s=k+1 : n
A(piv(z),s)=A(piv(z),s) - A(piv(z),k) * A(piv(k),s);
end
end
else
error('Il sistema è singolare');
end
end
if abs(A(piv(n),n)) < zero
error('Il sistema è singolare');
end
%Algoritmo del forward substitution Ly=Pb
y(1,:)=b(piv(1),:);
for t=2:n
som=0;
for k=1:t-1
som=som+A(piv(t),k) .* y(k,:);
end
y(t,:) = b(piv(t),:) - som;
end
%Algoritmo del back sostitution Ux=y
x(n,:)=y(piv(n),:) / A(piv(n),n);
for t=n-1:-1:1
som=0;
for k = t+1:n
som=som+A(piv(t),k).*x(k,:);
end
x(t,:)= (y(t,:) - som)/A(piv(t),t);
end