{"id":112,"date":"2020-07-24T09:33:20","date_gmt":"2020-07-24T09:33:20","guid":{"rendered":"http:\/\/www.paoloferraresi.it\/?p=112"},"modified":"2026-09-05T12:43:33","modified_gmt":"2026-09-05T12:43:33","slug":"metodi-iterativi-per-sistemi-di-equazioni-lineari-e-non-lineari","status":"publish","type":"post","link":"https:\/\/www.paoloferraresi.it\/?p=112","title":{"rendered":"Metodi iterativi per sistemi di equazioni lineari e non lineari"},"content":{"rendered":"\n<p class=\"has-text-align-left wp-block-paragraph\">\u00c8 dato il sistema lineare:<\/p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">Ax = b<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">con A \u03f5 \u211c<sup>n x n<\/sup> e x,b \u03f5 \u211c<sup>n<\/sup> con det(A) \u2260 0.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Per il teorema di Rouch\u00e9-Capelli, poich\u00e9 det(A) \u2260 0, ossia A non \u00e8 singolare, esiste ed \u00e8 unica la soluzione v \u03f5 \u211c<sup>n<\/sup> data da:<\/p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">v = A<sup>-1<\/sup>b<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tuttavia, poich\u00e9 il calcolo della matrice inversa A<sup>-1<\/sup> \u00e8 costoso e in generale malcondizionato, si cercano altri metodi per determinare la soluzione, i quali non richiedono il calcolo esplicito della matrice inversa A<sup>-1<\/sup>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Alla base dei metodi iterativi c\u2019\u00e8 l\u2019idea do costruire un\u2019opportuna successione di vettori x<sup>(k)<\/sup> tale che:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.paoloferraresi.it\/wp-content\/uploads\/2020\/07\/immagine.jpg\" alt=\"\" class=\"wp-image-118\" width=\"137\" height=\"42\" \/><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Metodo di Jacobi<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Per semplicit\u00e0, sia con A \u03f5 \u211c<sup>3 x 3<\/sup> con a<sub>ii<\/sub> \u2260 0 per ogni i = 1,\u2026,3 cio\u00e8 il sistema lineare:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"385\" height=\"110\" src=\"http:\/\/www.paoloferraresi.it\/wp-content\/uploads\/2020\/07\/immagine-2.jpg\" alt=\"\" class=\"wp-image-122\" srcset=\"https:\/\/www.paoloferraresi.it\/wp-content\/uploads\/2020\/07\/immagine-2.jpg 385w, https:\/\/www.paoloferraresi.it\/wp-content\/uploads\/2020\/07\/immagine-2-300x86.jpg 300w\" sizes=\"auto, (max-width: 385px) 100vw, 385px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Tale sistema pu\u00f2 essere riscritto come:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"428\" height=\"122\" src=\"http:\/\/www.paoloferraresi.it\/wp-content\/uploads\/2020\/07\/immagine-3.jpg\" alt=\"\" class=\"wp-image-123\" srcset=\"https:\/\/www.paoloferraresi.it\/wp-content\/uploads\/2020\/07\/immagine-3.jpg 428w, https:\/\/www.paoloferraresi.it\/wp-content\/uploads\/2020\/07\/immagine-3-300x86.jpg 300w\" sizes=\"auto, (max-width: 428px) 100vw, 428px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Tale riscrittura suggerisce direttamente la formulazione di un metodo iterativo nel modo seguente:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"516\" height=\"169\" src=\"http:\/\/www.paoloferraresi.it\/wp-content\/uploads\/2020\/07\/immagine-4.jpg\" alt=\"\" class=\"wp-image-124\" srcset=\"https:\/\/www.paoloferraresi.it\/wp-content\/uploads\/2020\/07\/immagine-4.jpg 516w, https:\/\/www.paoloferraresi.it\/wp-content\/uploads\/2020\/07\/immagine-4-300x98.jpg 300w\" sizes=\"auto, (max-width: 516px) 100vw, 516px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ove si assume che venga fornito un vettore x<sup>(0)<\/sup>, detto vettore d\u2019innesco, a partire dal quale viene generata la successione. Per l\u2019i-esima equazione si pu\u00f2 formalizzare in:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"536\" height=\"122\" src=\"http:\/\/www.paoloferraresi.it\/wp-content\/uploads\/2020\/07\/immagine-5.jpg\" alt=\"\" class=\"wp-image-125\" srcset=\"https:\/\/www.paoloferraresi.it\/wp-content\/uploads\/2020\/07\/immagine-5.jpg 536w, https:\/\/www.paoloferraresi.it\/wp-content\/uploads\/2020\/07\/immagine-5-300x68.jpg 300w\" sizes=\"auto, (max-width: 536px) 100vw, 536px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Per i = 1, \u2026, n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il costo in termini di operazioni per calcolare una nuova iterazione \u00e8 n<sup>2<\/sup>. Tale costo dovr\u00e0 essere a sua volta moltiplicato per il numero di iterazioni effettuate.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Infine, si tenga presente che se l\u2019ipotesi a<sub>ii<\/sub> \u2260 0 per ogni i non \u00e8 verificata, si possono scambiare fra loro equazioni del sistema cos\u00ec che risulti soddisfatta.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Metodo di Gauss-Seidel<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Una variante del metodo di Jacobi pu\u00f2 essere semplicemente ottenuta utilizzando le componenti della soluzione gi\u00e0 aggiornate. Pi\u00f9 precisamente, nel caso n = 3 il metodo Gauss-Seidel \u00e8 dato da:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"574\" height=\"174\" src=\"http:\/\/www.paoloferraresi.it\/wp-content\/uploads\/2020\/07\/immagine-6.jpg\" alt=\"\" class=\"wp-image-126\" srcset=\"https:\/\/www.paoloferraresi.it\/wp-content\/uploads\/2020\/07\/immagine-6.jpg 574w, https:\/\/www.paoloferraresi.it\/wp-content\/uploads\/2020\/07\/immagine-6-300x91.jpg 300w\" sizes=\"auto, (max-width: 574px) 100vw, 574px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Infatti, nella seconda equazione si utilizza il valore x<sub>1<\/sub><sup>(k+1)<\/sup> appena calcolato al posto del valore x<sub>1<\/sub><sup>(k)<\/sup> e nella terza equazione si utilizzano i valori x<sub>1<\/sub><sup>(k+1)<\/sup> e x<sub>2<\/sub><sup>(k+1)<\/sup> appena calcolati al posto di x<sub>1<\/sub><sup>(k)<\/sup> e x<sub>2<\/sub><sup>(k)<\/sup>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Per un sistema di generica dimensione n il metodo di Gauss-Seidel ha la seguente formulazione:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"623\" height=\"117\" src=\"http:\/\/www.paoloferraresi.it\/wp-content\/uploads\/2020\/07\/immagine-7.jpg\" alt=\"\" class=\"wp-image-127\" srcset=\"https:\/\/www.paoloferraresi.it\/wp-content\/uploads\/2020\/07\/immagine-7.jpg 623w, https:\/\/www.paoloferraresi.it\/wp-content\/uploads\/2020\/07\/immagine-7-300x56.jpg 300w\" sizes=\"auto, (max-width: 623px) 100vw, 623px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Per i = 1, \u2026, n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Come nel caso del metodo di Jacobi, il costo in termini di operazioni di tipo moltiplicativo per calcolare una nuova iterazione \u00e8 n<sup>2<\/sup>. Tale costo dovr\u00e0 essere moltiplicato per il numero di iterazioni.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se la matrice A \u00e8 diagonalmente dominante in senso stretto, ossia se per ogni i = 1,\u2026,n si ha:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"316\" height=\"103\" src=\"http:\/\/www.paoloferraresi.it\/wp-content\/uploads\/2020\/07\/immagine-8.jpg\" alt=\"\" class=\"wp-image-128\" srcset=\"https:\/\/www.paoloferraresi.it\/wp-content\/uploads\/2020\/07\/immagine-8.jpg 316w, https:\/\/www.paoloferraresi.it\/wp-content\/uploads\/2020\/07\/immagine-8-300x98.jpg 300w\" sizes=\"auto, (max-width: 316px) 100vw, 316px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Allora i metodi di Jacobi e Gauss-Seidel convergono.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esempio:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"247\" height=\"106\" src=\"http:\/\/www.paoloferraresi.it\/wp-content\/uploads\/2020\/07\/immagine-9.jpg\" alt=\"\" class=\"wp-image-130\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Quindi:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"411\" height=\"107\" src=\"http:\/\/www.paoloferraresi.it\/wp-content\/uploads\/2020\/07\/immagine-10.jpg\" alt=\"\" class=\"wp-image-131\" srcset=\"https:\/\/www.paoloferraresi.it\/wp-content\/uploads\/2020\/07\/immagine-10.jpg 411w, https:\/\/www.paoloferraresi.it\/wp-content\/uploads\/2020\/07\/immagine-10-300x78.jpg 300w\" sizes=\"auto, (max-width: 411px) 100vw, 411px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">La soluzione analitica \u00e8 semplice e fornisce x = [1,2,3]<sup>T<\/sup>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La matrice \u00e8 diagonalmente dominante, poich\u00e9 per ogni elemento della diagonale, la somma degli altri due elementi di riga \u00e8 minore.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il seguente codice in C# trova la soluzione con il metodo iterativo di Gauss-Seidel:<\/p>\n\n\n<pre><span style=\"color: #0000ff;font-size: 10pt\">using System;<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">namespace GaussSeidel<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">{<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp; class Program<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp; {<\/span><br><span style=\"color: #0000ff;font-size: 8pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/\/ &lt;summary&gt; Solve Ax=b, with the Gauss-Seildel iterative method<\/span><br><span style=\"color: #0000ff;font-size: 8pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/\/ static bool GaussSeidel(A, b, x, MaxIter=20, AbsError = 1e-15)&lt;\/summary&gt;<\/span><br><span style=\"color: #0000ff;font-size: 8pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/\/ &lt;param name=\"double[,] A\"&gt;A matrix&lt;\/param&gt;<\/span><br><span style=\"color: #0000ff;font-size: 8pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/\/ &lt;param name=\"double[] x\"&gt;b vector&lt;\/param&gt;<\/span><br><span style=\"color: #0000ff;font-size: 8pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/\/ &lt;param name=\"double[] b\"&gt;b vector&lt;\/param&gt;<\/span><br><span style=\"color: #0000ff;font-size: 8pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/\/ &lt;param name=\"int MaxIter=20\"&gt;Maximum number or iterations&lt;\/param&gt;<\/span><br><span style=\"color: #0000ff;font-size: 8pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/\/ &lt;param name=\"double AbsError = 1e-15\"&gt;Absolute error for convergence&lt;\/param&gt;<\/span><br><span style=\"color: #0000ff;font-size: 8pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/\/ &lt;returns&gt;bool convergence. True if the solution converges.&lt;\/returns&gt;<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static bool GaussSeidel(double[,] A, double[] x, double[] b, int MaxIter=20, double AbsError = 1e-15)<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int n = b.Length;<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double[] y = new double[n], last = (double[])x.Clone();<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool convergence;<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/ Gauss-Seidel<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;n;++i)<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x[i] = (b[i] \/ A[i, i]);<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int j = 0; j &lt; n; ++j)<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (j != i)<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x[i] -= ((A[i, j] \/ A[i, i]) * y[j]);<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y[i] = x[i];<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/ check for convergence<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; convergence = true;<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; n; ++i)<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (Math.Abs(x[i] - last[i]) &gt; AbsError)<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; convergence = false;<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Array.Copy(x, last, n);<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } while (!convergence &amp;&amp; --MaxIter &gt; 0);<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return convergence;<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static double[,] A = new double[,]<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {4,-1,0},<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {-1,4,-1},<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {0,-1,4}<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static double[] b = new double[] { 2, 4, 10 };<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static void Main(string[] args)<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double[] x = { 1, 1, 1 }; \/\/ innesco<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool cnv = GaussSeidel(A, x, b);<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (cnv)<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string s = string.Join(\",\", x);<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(\"La soluzione \u00e8: {0}\", s);<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(\"La soluzione non converge!\");<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">&nbsp;&nbsp; }<\/span><br><span style=\"color: #0000ff;font-size: 10pt\">}<\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Applicazione ai sistemi non lineari<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Facciamo un esempio concreto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La legge di <strong>Darcy-Weisbach<\/strong> stabilisce che la differenza di pressione ai capi di un tubo lungo L metri, di diametro D vale:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"257\" height=\"93\" src=\"http:\/\/www.paoloferraresi.it\/wp-content\/uploads\/2020\/07\/immagine-11.jpg\" alt=\"\" class=\"wp-image-137\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Dove <strong><em>\u03bb<\/em> \u00e8 il coefficiente d\u2019attrito<\/strong>, <strong><em>\u03c1<\/em> e <em>w<\/em> sono rispettivamente la densit\u00e0 e la velocit\u00e0 del fluido<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In un tubo liscio, il coefficiente d\u2019attrito vale \u03bb = 64 \/ Re se Re &lt; 2000, mentre vale \u03bb \u2248 0.316\u2219Re<sup>-0.25<\/sup> altrimenti (per Re &lt; 10<sup>5<\/sup>).<br><strong>Re \u00e8 il numero di Reynolds<\/strong>:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"185\" height=\"78\" src=\"http:\/\/www.paoloferraresi.it\/wp-content\/uploads\/2020\/07\/immagine-12.jpg\" alt=\"\" class=\"wp-image-138\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Dove introduciamo la <strong>viscosit\u00e0 dinamica \u03bc<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se Re \u00e8 minore o uguale a 2000 il moto \u00e8 laminare, cio\u00e8 dominato dalle forze viscose. Se invece \u00e8 compreso tra 2000 e 4000 c\u2019\u00e8 una zona di transizione, dove il moto tende a mantenere le proprie caratteristiche, al di sopra \u00e8 turbolento.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se conosco la portata volumetrica Q di un fluido noto (\u03c1 e \u03bc noti) che attraversa il tubo, \u00e8 dunque facile ricavare \u0394p, perch\u00e9 la velocit\u00e0 media \u00e8 w = Q\/A, quindi calcolo Re. A seconda che sia maggiore di 2000 oppure no, calcolo il coefficiente d\u2019attrito \u03bb appropriato e infine applico la legge di Darcy-Weisbach.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un po\u2019 meno ovvio \u00e8 se conosco il \u0394p e mi chiedono la portata.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il problema \u00e8 che questa volta devo partire dalla legge di Darcy-Weisbach, ma non conosco ancora il coefficiente d\u2019attrito \u03bb, perch\u00e9 ancora non so dire se il moto \u00e8 laminare oppure turbolento.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"381\" height=\"337\" src=\"http:\/\/www.paoloferraresi.it\/wp-content\/uploads\/2020\/07\/immagine-13.jpg\" alt=\"\" class=\"wp-image-139\" srcset=\"https:\/\/www.paoloferraresi.it\/wp-content\/uploads\/2020\/07\/immagine-13.jpg 381w, https:\/\/www.paoloferraresi.it\/wp-content\/uploads\/2020\/07\/immagine-13-300x265.jpg 300w\" sizes=\"auto, (max-width: 381px) 100vw, 381px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Anche in questo caso, un algoritmo iterativo ci pu\u00f2 venire in soccorso.<br>Si tratta di ricalcolare iterativamente le tre equazioni, fino a quando si trova una convergenza o al massimo numero di tentativi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ed ecco il codice, sempre in C#:<\/p>\n\n\n<p><span style=\"color: #0000ff\">using System;<\/span><br \/><span style=\"color: #0000ff\">namespace Darcy<\/span><br \/><span style=\"color: #0000ff\">{<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 class Program<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 static double FlowRateFromdP(double dP, double L, double D,<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 double rho, double mu, double lambda, int MaxIter = 100,<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 double AbsError = 1e-15)<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (Math.Abs(dP) &lt; AbsError) return 0.0;<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 double sgn;<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (dP &lt; 0.0)<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 dP = -dP;<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sgn = -1.0;<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else sgn = 1.0;<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 double w = 0; \/\/ flow velocity<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 double Re = 0; \/\/ Reynolds number<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 double wLast = w, ReLast = Re,<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 lambdaLast = lambda;<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bool convergence;<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 do<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (lambda &gt; 0.0)<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 w = Math.Sqrt(2 * D * dP \/ (rho * L * lambda));<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else w = 0.0;<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Re = rho * w * D \/ mu;<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (Re&lt;=64) lambda = 1;<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else if (Re &lt;= 2000) lambda = 64 \/ Re;<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else lambda = 0.3164 \/ Math.Pow(Re, 0.25);<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 convergence = (Math.Abs(w &#8211; wLast) &lt; AbsError) &amp;&amp;<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (Math.Abs(Re &#8211; ReLast) &lt; AbsError) &amp;&amp;<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (Math.Abs(lambda &#8211; lambdaLast) &lt; AbsError);<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 wLast = w;<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ReLast = Re;<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 lambdaLast = lambda;<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } while (!convergence &amp;&amp; &#8211;MaxIter &gt; 0);<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return sgn*w * (0.25 * Math.PI * D * D);<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 static void Main(string[] args)<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 double dP = 7.85e+5;<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 double L = 1.0;<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 double D = 1.0e-2;<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 double rho = 850.0;<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 double mu = 0.051;<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 double lambda = 0;<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 double Q = FlowRateFromdP(dP, L, D, rho,<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 mu, lambda, AbsError: 1e-6);<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Console.WriteLine(&#8220;Q = {0} m3\/s&#8221;,Q);<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Console.ReadKey();<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/span><br \/><span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span><br \/><span style=\"color: #0000ff\">}<\/span><\/p>","protected":false},"excerpt":{"rendered":"<p>\u00c8 dato il sistema lineare: Ax = b con A \u03f5 \u211cn x n e x,b \u03f5 \u211cn con det(A) \u2260 0. Per il teorema di Rouch\u00e9-Capelli, poich\u00e9 det(A) \u2260 0, ossia A non \u00e8 singolare, esiste ed \u00e8 unica la soluzione v \u03f5 \u211cn data da: v = A-1b Tuttavia, poich\u00e9 il calcolo della [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":122,"comment_status":"open","ping_status":"open","sticky":true,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[11,13,7,8,10,9,12],"class_list":["post-112","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-metodi-numerici","tag-darcy","tag-darcy-weisbach","tag-gauss","tag-gauss-seidel","tag-jacobi","tag-metodi-iterativi","tag-weisbach"],"_links":{"self":[{"href":"https:\/\/www.paoloferraresi.it\/index.php?rest_route=\/wp\/v2\/posts\/112","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.paoloferraresi.it\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.paoloferraresi.it\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.paoloferraresi.it\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.paoloferraresi.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=112"}],"version-history":[{"count":12,"href":"https:\/\/www.paoloferraresi.it\/index.php?rest_route=\/wp\/v2\/posts\/112\/revisions"}],"predecessor-version":[{"id":170,"href":"https:\/\/www.paoloferraresi.it\/index.php?rest_route=\/wp\/v2\/posts\/112\/revisions\/170"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.paoloferraresi.it\/index.php?rest_route=\/wp\/v2\/media\/122"}],"wp:attachment":[{"href":"https:\/\/www.paoloferraresi.it\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=112"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.paoloferraresi.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=112"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.paoloferraresi.it\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=112"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}