<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>FireTeam &#187; calcolo scientifico</title>
	<atom:link href="http://www.fireteam.it/tag/calcolo-scientifico/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.fireteam.it</link>
	<description>#fuoco@AzzurraNet</description>
	<lastBuildDate>Tue, 16 Mar 2010 15:55:56 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Introduzione al Calcolo Scientifico</title>
		<link>http://www.fireteam.it/2009/09/introduzione-al-calcolo-scientifico/</link>
		<comments>http://www.fireteam.it/2009/09/introduzione-al-calcolo-scientifico/#comments</comments>
		<pubDate>Thu, 03 Sep 2009 20:41:36 +0000</pubDate>
		<dc:creator>saverio</dc:creator>
				<category><![CDATA[Programmazione C]]></category>
		<category><![CDATA[calcolo scientifico]]></category>

		<guid isPermaLink="false">http://www.fireteam.it/?p=596</guid>
		<description><![CDATA[Caratteristiche fondamentali del software scientifico:
Efficienza, Accuratezza, Affidabilità, Modularità, API standard, Portabilità, Facilità d’uso, Facilità di manutenzione
Problem Solving:
Formulazione del problema P, Descrizione di P mediante un modello matematico:M(P) approssimazione di M(P) mediante metodi numerici Mh(P), Sviluppo dell’algoritmo risolutivo Mh(P),Implementazione in uno specifico ambiente di calcolo
Da che cosa dipende il tempo di esecuzione di un software?
Un’ implementazione [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.fireteam.it/wp-content/uploads/2009/09/calcolo-massa-corporea.png"><img class="alignright size-full wp-image-598" title="calcolatrice" src="http://www.fireteam.it/wp-content/uploads/2009/09/calcolo-massa-corporea.png" alt="calcolatrice" width="190" height="208" /></a>Caratteristiche fondamentali del software scientifico:<br />
Efficienza, Accuratezza, Affidabilità, Modularità, API standard, Portabilità, Facilità d’uso, Facilità di manutenzione</p>
<p>Problem Solving:<br />
Formulazione del problema P, Descrizione di P mediante un modello matematico:M(P) approssimazione di M(P) mediante metodi numerici Mh(P), Sviluppo dell’algoritmo risolutivo Mh(P),Implementazione in uno specifico ambiente di calcolo</p>
<h2>Da che cosa dipende il tempo di esecuzione di un software?</h2>
<p>Un’ implementazione efficiente dipende oltre che dal numero di operazioni floating-point anche dagli accessi alla MEMORIA<br />
T1 = Nmem x tmem + N flop x t flop    mem=tempo di accesso alla memoria, flop=tempo operazioni floating point<br />
Nmem &amp; Nflop: dipende dall&#8217;algoritmo; tmem &amp; tflop: dipende dalla tecnologia.</p>
<p><span id="more-596"></span>Ridurre il numero di accessi alla memoria, ridurre il tempo di accesso alla memoria &#8211;&gt; riuso dei dati nei registri<br />
La complessità di tempo dell’algoritmo (Nflop) e la velocità del processore (tflop) sono fisse</p>
<h2>Vantaggi e caratteristiche delle BLAS</h2>
<p>Modularità: sw scritto in termini di building blocks; Chiarezza: codice più breve e più leggibile;<br />
Efficienza: implementazioni ottimizzate da parte dei costruttori di computer; Portabilità: interfacce standard, dipendenza dall’architettura incapsulata in BLAS; Affidabilità, robustezza: gestione accurata di “dettagli” algoritmici e implementativi e di situazioni di errore (es: overflow)</p>
<p>Traffico parassita:<br />
Parametro di valitazione del traffico parassita: q = #accessi alla memoria / #operazioni floating point<br />
SAXPY: y=y+ax  &#8211;&gt; preleva x (n accessi), preleva y (n accessi), preleva a (1 accesso), calcolo = (2n op. fl.p.), riponi y (n accessi)<br />
q = m/f = (3n+1) / (2n)<br />
DOT: a = x(trasposto) * y &#8211;&gt; preleva x (n accessi), preleva y (n accessi), calcolo = (2n op. fl.p.), riponi in a (1 accesso)<br />
q = m/f = (2n+1) / (2n)  &#8211;&gt; quasi 1.<br />
GAXPY: y=y+Mx  &#8211;&gt; preleva y (n accessi), preleva M (n^2 accessi), preleva x (n accessi), calcolo y+Mx = (2n^2 op. fl.p.), riponi y (n accessi)<br />
q = m/f = (3n+n^2) / (2n^2)<br />
Strategia: Suddivisione della matrice in blocchi di dimensione pari alla cache</p>
<h2>Tecnica di LOOP UNROLLING</h2>
<p>Lo “srotolamento” del ciclo consistente nel modificare il controllo del ciclo e nel replicare opportunamente le istruzioni all’interno del ciclo viene detto Tecnica di LOOP UNROLLING<br />
Vantaggi del loop unrolling: Utilizzo ottimale dei processori con architettura pipelined, riduzione dell’overhead del ciclo di iterazione riduzione del numero di trasferimenti fra i vari livelli memoria, aumento delle operazioni concorrenti;L’overhead del programma e il numero di trasferimenti di dati dai livelli più bassi di memoria ai registri, si riducono di un fattore proporzionale alla nuova lunghezza del ciclo (profondità dell’unrolling); Svantaggi del loop unrolling: unrolling;Aumento della memoria destinata al programma; Perdita della generalità del codice</p>
<p>Una matrice si dice simmetrica quando A[i][j] = A[j][i]</p>
<p>Cholesky e matrici simmetriche:<br />
Applicando l&#8217;algoritmo di Gauss senza pivoting ad una matrice simmetrica, abbiamo che le sottomatrici attive sono anch’esse simmetriche. Questo è vero in generale e si dimostra.<br />
Si può sfruttare la simmetria considerando solo un triangolo della matrice.<br />
Se si usa il pivoting parziale si perde la simmetria della matrice.<br />
Quindi, in generale, l&#8217;utilizzo di una tecnica di pivoting nell’algoritmo di Gauss NON CONSENTE di sfruttare, in termini di efficienza computazionale la simmetria della matrice<br />
In quali condizioni si può evitare il pivoting?<br />
- Matrici a diagonale dominante (al generico passo K, le sottomatrici attive sono a diagonale dominante – il pivot starebbe sempre sulla diagonale)<br />
- Matrici simmetriche e definite positive (una matrice è def positiva se det(A)&gt;0) (criterio di Sylvester)<br />
Se una matrice è simmetrica, la fattorizzazione A=LU (senza pivoting) si specializza in A=LDL^T (A=LU, D^-U=LT quindi U=DL^T, A=LDL^T) L=matrice triangolare inferiore(moltiplicatori), D=matrice diagonale(elementi diagonali di U))<br />
Come si specializza la fattorizzazione LDL^T di una matrice simmetrica e definita positiva?<br />
Esiste un’unica matrice L triangolare inferiore tale che: A=LL^T<br />
A=LLT &#8211;&gt; Algoritmo di Cholesky    T(chol)=O((n^3)/6))=Tgauss(n)/2<br />
L’Algoritmo di Cholesky ha una complessità di TEMPO che è la metà di quella dell’Algoritmo di Gauss!!<br />
A è simmetrica allora si memorizza solo una metà degli elementi; L è triangolare allora si memorizzano solo gli elementi non nulli<br />
L’Algoritmo di Cholesky ha una complessità di SPAZIO che è la metà di quella dell’Algoritmo di Gauss!!<br />
Quando è possibile applicare la fattorizzazione LL^T ad una matrice simmetrica e a diagonale dominante? ovvero quando una matrice simmetrica a diagonale dominante è anche definita positiva?<br />
- non singolare (det(A)&gt;0)<br />
- simmetrica<br />
- a diagonale dominante<br />
- ha gli elementi sulla diag non negativi</p>
<p>Matrici TOEPLITZ ottenute l’una da una rotazione dell’altra.</p>
<p>Matrice bidiagonale:<br />
- bidiagonale inferiore se: a(i,j)=0 per j&gt;i e per i&gt;j+1<br />
- bidiagonale superiore se: a(i,j)=0 per i&gt;j e per j&gt;i+1</p>
<p>Matrice tridiagonale: se a(i,j)=0 per |i-j|&gt;1<br />
In una matrice tridiagonale di dim nxn gli elementi che bisogna effettivamente conservare sono quelli delle tre diagonali cioè sono 3n-2.</p>
<p>Matrice a banda: ampiezza di banda inferiore=p, ampiezza di banda superiore=q  se a(i,j)=0 per i&gt;j+p e per j&gt;i+q</p>
<p>Si consideri la seguente matrice a banda 6&#215;6 con p=1 e q=2</p>
<p>a(1,1) a(1,2) a(1,3)<br />
a(2,1) a(2,2) a(2,3) a(2,4)<br />
a(3,2) a(3,3) a(3,4) a(3,5)<br />
a(4,3) a(4,4) a(4,5) a(4,6)<br />
a(5,4)  a(5,5) a(5,6)<br />
a(6,5) a(6,6)</p>
<p>questa matrice viene memorizzata nel seguente modo:</p>
<p>*            *     a(1,3) a(2,4) a(3,5) a(4,6)<br />
*         a(1,2) a(2,3) a(3,4) a(4,5) a(5,6)<br />
a(1,1) a(2,2) a(3,3) a(4,4) a(5,5) a(6,6)<br />
a(2,1) a(3,2) a(4,3) a(5,4) a(6,5)    *<br />
ossia l’elemento a(i,j) è memorizzato nella colonna di posto j e nella riga di posto 3+i-j=q+1+i-j</p>
<p>Fattorizzazione LU senza pivoting di una matrice tridiagonale e risoluzione dei sistemi lineari associati:<br />
si ha che i fattori L ed U di una matrice tridiagonale (che ammette fattorizzazione LU) sono matrici bidiagonali</p>
<p>Fattorizzazione LU di una matrice partizionata a blocchi:<br />
se abbiamo una matrice tridiagonale (w=p+q+1), conduce alle matrici bidiagonali dove<br />
L-&gt; w=p+1=1+1=2; U-&gt; w=q+1=1+1=2<br />
Gli elementi di U e di A appartenenti alla banda superiore coincidono; gli elementi di L da determinare sono L2 e L3; gli elementi di U da determinare sono le matrici diagonali U1, U2, U3</p>
<p>Come si specializzano gli algoritmi di Forward e Back Substitution per matrici a blocchi?<br />
Si risolve Lz=y O(n^2) operazioni poi Ux=z (z è stato ricavato precedentemente)</p>
<h3>ALGORITMO FORWARD:</h3>
<p>for i=1 to n do<br />
y[i]=b[i]-L[i]y[i-1]<br />
endfor<br />
(L[1]y[0]=0)</p>
<h3>ALGORITMO DI BACK</h3>
<p>for i=N to 1 do<br />
U[i]x[i]=y[i]-F[i]y[i+1]<br />
endfor<br />
(F[n]x[n+1]=0)</p>
<h2>FATTORIZZAZIONE LU DI UNA MATRICE A BLOCCHI</h2>
<p>Supponiamo di avere una matrice partizionata in 9=3&#215;3 blocchi<br />
(A11, A12, A13, A21, A22, A23, A31, A32, A33).<br />
Sappiamo che A=LU.<br />
Effettuando il prodotto:<br />
A11=L11 U11     A12=L11 U12                  A13=L11 U13<br />
A21=L21 U11     A22=L21 U12+L22 U22    A23=L21 U13+L22 U23<br />
A31=L31 U11     A32=L31 U12+L32 U22    A33=L31 U13+L32 U23+L33 U33<br />
Da queste uguaglianze si ricavano le espressioni per il calcolo dei blocchi di L e di U<br />
Ricordando l’algoritmo di fattorizzazione LU abbiamo che fissiamo la colonna e la riga e sotto abbiamo la matrice attiva.<br />
<span style="text-decoration: underline;">PASSO1:</span><br />
- fattorizzazione LU del “pannello verticale”<br />
- calcolo un pannello orizzontale di U<br />
- aggiorna la matrice attiva<br />
alla fine del passo 1 abbiamo:<br />
- il primo pannello verticale di L<br />
- il primo pannello orizzontale di U</p>
<p>Nel <span style="text-decoration: underline;">PASSO 2</span> scendiamo di un livello quindi alla fine avremo:<br />
- il secondo pannello verticale di L<br />
- il secondo pannello orizzontale di U</p>
<h2>ALGORITMO LU BLOCK PARTITIONED</h2>
<p>A dcomposta in nxn blocchi di dim nbxnb</p>
<p>For k=1, n step nb do<br />
- applica la fatt LU al pannello A(k:n,k:k+nb-1)<br />
- calcola il pannello U(k:k+nb-1, k+nb:n)<br />
- aggiorna la matrice attiva</p>
<h4>Sistema sparso:</h4>
<p>Un sistema di equazioni lineari si dice “sparso” se ha molti coefficienti nulli; il grado di sparsità è SP=numero di coefficienti nulli / numero totale di coefficienti. In generale in un sistema dove A=nxm e p è il numero di coefficienti non nulli: SP=(n x m) – p / n x m. Dunque 0=&lt;SP&gt;=1, e più SP è prossimo a 1 maggiore è il grado si sparsità della matrice.</p>
<h2>I metodi iterativi:</h2>
<p>Per sistemi con elevato grado di sparsità l’algoritmo di Gauss non è molto efficiente in quanto non solo effettua operazioni su coefficienti nulli ma può anche portarli a essere non nulli. Per tale motivo c’è bisogno di metodi alternativi detti iterativi, che lavorano sui coefficienti non nulli. Per tale motivo è anche possibile implementare opportune tecniche di memorizzazione di matrici sparse per migliorare la complessità di spazio. Una di queste tecniche è quella dei tre vettori – CSR -  R contenente gli elementi non nulli per riga della matrice A, IC contente l’indice di colonna in A degli elementi presenti in R, J contente la posizione in R del primo elemento non nullo per ciascuna riga di A.</p>
<h3>Metodi iterativi: Jacobi</h3>
<p>Procedimento iterativo:a partire da arbitrari valori iniziali delle incognite x1(^0), x2(^0), x3(^0) , esegue una sequenza di iterazioni in ognuna delle quali si calcolano nuovi valori per le incognite utilizzando i valori calcolati nella iterazione precedente. Dunque dato un sistema Ax=b:<br />
ad ogni passo i=1…n   -&gt;   xi(^k+1)=1/aii (bi – sum per j=1 to n con j!=i di (aij  xj(^k) )).<br />
La complessità di tale metodo per il calcolo delle n componenti ad ciascuna iterazione è<br />
Tjac(n)=n(2n-1) operazioni=n^2 operazioni, ma siccome le operazioni vengono effettuate solo sui p coefficienti non nulli (SP=1- p/n^2) allora Tjac(n)= p operazioni= n^2 (1-SP) operazioni</p>
<h3>Metodi iterativi: Gauss-Seidel</h3>
<p>Il procedimento è simile a quella di Jacobi, la differenza sostanziale è che mentre in Jacobi ad ogni iterazione k il nuovo valore delle incognite è calcolato utilizzando unicamente i valori x1(^k-1), x2(^k-1), x3(^k-1) calcolati all’iterata precedente, in Gauss Seidel invece ad ogni passo k nel calcolare una xi(^k) possono essere utilizzati i valori xj(^k), per j&lt;i e xj(^k-1) per j&gt;=i (ossia i valori delle soluzioni del passo precedente k-1). Ad esempio nel calcolare x2(^k) viene utilizzato x1(^k) e x2(^k-1), x3(^k-1). . Dunque dato un sistema Ax=b:<br />
ad ogni passo i=1…n   -&gt;   xi(^k+1)=1/aii (bi – [sum per j=1 to i-1 di (aij  xj(^k+1))] &#8211; [sum per j=i+1 to n di (aij  xj(^k))]). Analogamente a quanto accade per jacobi, Tgs(n)= p operazioni= n^2 (1-SP) operazioni.</p>
<h3>Convergenza e consistenza dei metodi iterativi:</h3>
<p>In generale Gauss-Seidel converge più velocemente alla soluzione rispetto a Jacobi. Tuttavia i metodi iterativi non sempre convergono alla soluzione del sistema.<br />
Un metodo iterativo si dice convergente se la successione generata dal metodo è convergente, qualunque siano i valori iniziali, cioè se lim (k-&gt;inf) di xi(^k)= xi(^*) per ogni i=1…n e per ogni xi(^0) approssimazione iniziale. Se il metodo converge allora esso convergerà alla soluzione; per tale caratteristica i metodi si dicono consistenti, ossia che quando converge esso converge alla soluzione. Un metodo iterativo si dive convergente se ||C||&lt;1, dove ||C|| indica la norma della matrice C nxn dei coefficienti cij del sistema. Inoltre Jacobi converge con certezza anche quando la matrice è a diagonale strettamente dominante. Tali condizioni tuttavia sono solo sufficienti non necessarie in quanto il metodo può convergere anche se queste condizioni non sono soddisfatte.</p>
<h3>Efficienza di un metodo iterativo:</h3>
<p>La complessità totale di un metodo iterativo è: Ttot(n)= k Tit(n); dove k indica il numero di iterazioni eseguite (parametro dipendente dalla velocità di convergenza) e Tit(n) indica la complessità di tempo di 1 iterazione (parametro dipendente dal costo di ciascuna iterazione). Sia per Jacobi che per Gauss Seidel il numero di operazioni effettuate è relativo solo ai coefficienti p non nulli dunque T(n)= p operazioni= n^2 (1-SP) operazioni.</p>
<h3>Velocità di convergenza:</h3>
<p>||C|| oltre a garantire la convergenza serve a determinare la velocità di convergenza dato che  quanto più piccolo è questo valore tanto più velocemente si convergerà alla soluzione ottima.<br />
Indicando con eps(^k)=x(^k)- x(^*) l’errore di troncamento ammissibile alla k-esima iterazione (differenza all’iterata k tra l’approssimazione e la soluzione), dove || eps(^k)||&lt;=||C^k || ||eps(^0)||, è possibili trovare il numero minimo di iterazioni per avere || eps(^k)||&lt;tol (tol=tolleranza desiderata): k=[ ln (tol) – ln (||eps(^0)||) ]/ ln (||C||).<br />
La convergenza del metodo equivale alla convergenza a 0 dell’errore di troncamento alla k-esima iterazione, cioè di di eps(^k).</p>
<h3>Criteri di arresto:</h3>
<p>Il metodo iterativo può essere arrestato o agendo sull’errore assoluto e in tal caso il criterio d’arresto sarà: ||x(^k) – x*||&lt;=tol, dove in generale tol=10(^-m) è l’approssimazione corretta a m cifre decimali; oppure sull’errore relativo ||x(^k) – x*|| / ||x*||&lt;=tol, dove in generale tol=10(^-m) è l’approssimazione corretta a m-1 cifre significative; tuttavia utilizzando questi criteri si presuppone la conoscenza della soluzione x* ottima e quindi la necessità di determinare stime calcolabili dell’errore ad ogni iterazione. Mentre criteri d’arresto effettivamente utilizzabili sono quelli basate su quantità già calcolate e quindi basati o sulla stima dell’errore assoluto ||x(^k+1) – x(^k)||&lt;=tol; o sull’errore relativo ||x(^k) – x(^k-1)|| / ||x(^k-1)||&lt;=tol.<br />
Altro criterio di arresto, aggiuntivo e/o sostitutivo, è quello basato sull’impostazione di un numero massimo Maxit di iterazioni che permette l’arresto anche nel caso in cui il metodo non converge e limita il costo computazionale del procedimento iterativo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fireteam.it/2009/09/introduzione-al-calcolo-scientifico/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
