Link correlati:
1)
SVILUPPO IN SERIE DI FOURIER
2)
SVILUPPO IN SERIE DI FOURIER
3)
MODULAZIONE DI FREQUENZA (FM)
Nella modulazione angolare l'argomento di una portante sinusoidale viene variato in funzione dell'ampiezza di un segnale modulante. Si ricorda che la frequenza della portante è sempre molto maggiore della frequenza della modulante.
Chiariamo subito cos'è l'argomento della portante sinusoidale. Esso è il
valore istantaneo f(t)=2p·fp·t
sul quale si calcola la funzione coseno (o seno) che descrive la portante.
Indichiamo con il pedice "p" le grandezze riferite alla portante e con il pedice "m" quelle riferite alla modulante. Se fp
è la frequenza della portante, e fm quella della modulante (supposta
per semplicità essere un segnale sinusoidale, con fp>>fm)
allora modulare l'argomento della portante (supposta per semplicità di ampiezza
unitaria):
Vp(t)=cos(2p·fp·t)
significa variare l'argomento della funzione coseno,
f(t)=2·p·fp·t
in funzione dell'ampiezza della modulante, oltre che del tempo. In altre parole,
nella formula precedente la fp diventa:
f(t)= fp + Df·cos(2p·fm·t)
In tal modo l'espressione della portante modulata diventa:
V(t)=cos{2p·[fp
+ Df·cos(2p·fm·t)]·t}
Ovvero:
V(t)=cos[2p·fp·t
+ 2p·Df·t·cos(2p·fm·t)]
Ricordando che la pulsazione w può essere scritta
come: w=2p·f
e quindi 2p·Df=Dw
V(t)=cos[wp·t
+
Dw·t·cos(wm·t)]
Si definisce indice di modulazione il rapporto: mf=Dw/wm
Quando l'indice di modulazione è minore di 1 si parla di modulazione di
frequenza in banda stretta, altrimenti si ha
modulazione in banda larga e in ricezione è più difficile separare la modulante
dalla portante. Nella modulazione in banda larga l'analisi spettrale diventa
molto più complessa, sebbene le prestazioni complessive dei sistemi di
trasmissione siano nettamente migliori.
L'analisi in frequenza del segnale modulato
L'analisi in frequenza, nel caso della modulazione angolare, è più complessa
rispetto alla modulazione di ampiezza. Essa può essere affrontata con i teoremi
della trigonometria solo quando il segnale modulante è anch'esso sinusoidale
e l'indice di modulazione è minore di 1, ma
per un generico segnale modulante e soprattutto con indice di modulazione
maggiore di 1 si deve far ricorso a strumenti di matematica
un po' più complessi. Nella figura sottostante è riportato lo spettro di un
singolo segnale sinusoidale modulato in frequenza con indice di modulazione
minore di 1:
La larghezza di banda può essere calcolata, con buona approssimazione, usando la
formula di Carson:
Bfm=2·fm·(mf+1)=2·(Df+fm)
La formula di Carson è valida con buona approssimazione anche per un segnale
generico. In tal caso si deve considerare la massima frequenza contenuta in
esso.
Per capire in che modo si esegue l'analisi spettrale quando il segnale modulante
non è una singola sinusoide, cioè nelle situazioni reali, è necessario ricordare
il teorema di Fourier. Il teorema di Fourier afferma che un qualsiasi segnale
periodico, sotto alcune condizioni matematiche (sempre verificate per i segnali
fisici), può essere ottenuto mediante la somma di un termine costante e di
infinite funzioni sinusoidali, le cui frequenze sono multipli interi di quella
del segnale (ovvero le cui pulsazioni sono multipli interi di quella del
segnale). Indicando con w0 = 2p·f0 la
pulsazione di un segnale periodico v(t), di qualsiasi forma, a frequenza f0, il teorema ha
la seguente espressione matematica, definita sviluppo in serie di Fourier:
I coefficienti di questa formula possono essere calcolati con metodi che non
sono alla portata di studenti del 4° Itis. Soprassediamo a ciò e osserviamo un
dettaglio importante: la formula precedente è valida per un segnale generico che
sia però periodico, con frequenza che abbiamo indicato con f0. Cosa
accade quando il segnale non è periodico, come è nelle situazioni reali? Ebbene,
anche in questo caso è possibile scomporlo in una somma di infinite armoniche,
infinitamente vicine le une alle altre. I calcoli per affrontare questa
situazione sono ancora più complessi, per cui ci limiteremo a descrivere
sommariamente il caso della modulazione in frequenza in banda larga di un
generico segnale periodico, con
frequenza fondamentale f0.
Si può dimostrare che le ampiezze delle armoniche che costituiscono il segnale
modulato dipendono dall'indice di modulazione e dall'andamento di particolari
funzioni, dette di Bessel.
Nella figura sono riportate le funzioni di Bessel, ordinate con un indice che
parte da 0. In ascisse è riportato l'indice di modulazione. Supponiamo che
l'indice di modulazione sia pari a 3. Le ampiezze delle armoniche che compongono
il segnale modulato in frequenza in banda larga sono date dai valori (in modulo)
delle intersezioni della retta verticale in corrispondenza dell'indice di
modulazione pari a 3 con gli andamenti delle funzioni di Bessel. Calcoli
analoghi possono essere eseguiti per i valori delle fasi.
Le funzioni di Bessel
Una esposizione delle funzioni di Bessel esula dagli scopi di questo corso.
Tuttavia possiamo divertirci a graficarle usando una tabella elettronica. La
sintassi per calcolare il valore di una funzione di Bessel di ordine n
(=0,1,2,3,4....) nel punto x è: =BESSEL.J(x;n). Buon divertimento.
domenica 25 ottobre 2015
lunedì 12 ottobre 2015
Le modulazioni
DISTRETTO FORMATIVO ROBOTICA - Verona giugno 20081 TELECOMUNICAZIONI 3.Trasmissione analogica dei segnali. Prof. Tozzi Gabriele – ITIS G. Marconi - Verona.
Link:
Vedere altre presentazioni del Allegria Izzo
martedì 19 maggio 2015
La tabella ASCII (parte I - il problema della codifica)
Premessa
Ragazzi, oggi parliamo della tabella ASCII. Cominciamo dalle cose semplici: la tabella ASCII fa corrispondere una combinazione di bit ad ogni carattere tipografico. L'acronimo ASCII sta per American Standard Code for Information Interchange.
Se seguite questo link alla voce di wikipedia dedicata all'ASCII, e quest'altro relativo allo standard che lo ha sostituito, l'UTF-8, trovate molte informazioni tecniche di grande importanza. Devo tuttavia ricordarvi che l'informatica è una disciplina particolare che richiede la conoscenza di una grandissima quantità di concetti come linguaggi, standard, architetture, sistemi operativi, nonché dispositivi hardware e molto altro, ragion per cui è necessario non solo operare qualche scelta che limiti il campo di interesse, ma anche organizzare il percorso di apprendimento in modo da non disperdere eccessivamente le proprie risorse intellettuali e di tempo, nel vano tentativo di approfondire ogni argomento in dettaglio.
La strategia che ogni buon informatico adotta è quella di:
- avere un quadro concettuale (dicasi: concettuale) completo di tutte le tecnologie in gioco
- apprendere ad un livello sufficiente una parte di esse
- approfondire, di volta in volta, quelle che sono necessarie per svolgere un determinato compito
Poiché queste note sono indirizzate a studenti del primo anno di informatica di un istituto tecnico, i quali sono del tutto all'oscuro delle più semplici nozioni che non siano quelle di pigiare su uno smartphone, siamo obbligati a fare il primo passo muovendoci quasi esclusivamente sul piano dei concetti di base e trascurando gli approfondimenti, come ad esempio un'esposizione dettagliata delle soluzioni adottate nello standard UTF-8 rispetto all'ASCII classico.
Il problema della codifica
La parola "codifica" è uno dei termini usati dagli informatici, e in generale da chi si occupa di tecnologia e scienza, per indicare i termini di un accordo. Altre parole molto usate sono "standard" e "protocollo". In generale la parola "codifica" è usata dagli informatici e dagli elettronici per indicare un tipo di accordo relativo al funzionamento di base di un computer, ad esempio quale combinazione di bit usare per indicare un determinato colore, oppure quale livello di tensione elettrica usare per indicare un bit posto a 1 o a 0. Il termine "standard" è più frequentemente usato per indicare un accordo relativo alle architetture dei sistemi, mentre il il termine "protocollo" è quello preferito dagli ingegneri che si occupano di telecomunicazioni (protocolli di comunicazione), come pure dai medici per indicare procedure terapeutiche (protocolli di cura), dai diplomatici per indicare un cerimoniale nei rapporti tra Stati, e altro ancora.
Nel caso della tabella ASCII si parla di "codifica ASCII" perché si tratta di un accordo, ormai condiviso a livello mondiale, in base al quale si è stabilito di indicare ogni lettera dell'alfabeto, e ogni segno di punteggiatura (più qualcos'altro di cui diremo) con una ben precisa combinazione di bit. Ad esempio, in ASCII la parola "ciao" è indicata con la seguente combinazione di 32 bit, 8 per ogni carattere:
01100011 01101001 01100001 01101111
c i a o
In realtà, all'inizio la tabella ASCII usava 7 bit per ogni carattere, ma in seguito si è passati ad 8, ed oggi se ne usano 16 o 32. Ma di ciò parleremo più avanti. Prima è necessario parlare in generale del concetto di "codifica" (o standard, o protocollo, o termini simili).
Adottare una codifica significa stabilire un accordo sul significato di un segnale. Ciò presuppone l'esistenza di almeno due soggetti dotati di capacità intellettive: dalle più semplici, possedute anche dagli animali, a quelle più evolute che caratterizzano l'uomo. Un gesto, o un suono, sono esempi di segnali elementari. Quando il significato di un gesto, o di un suono, è condiviso da almeno due soggetti dotati di intelletto, allora siamo di fronte a un "codice", o "codifica". Possiamo dunque affermare che l'esistenza di un codice è indice della presenza di una qualche capacità intellettiva, cioè di coscienza.
Tuttavia c'è un problema: la distanza spazio-temporale. Se io voglio che l'informazione (il significato) associato a un gesto o a un suono duri nel tempo, oppure possa essere trasferita a distanza, devo ricorrere a un espediente: associare quel gesto o quel suono a un simbolo. Devo, cioè, imparare a scrivere. Per far ciò ho bisogno di un alfabeto, ovvero di un certo numero di simboli che rappresentino i segnali affinché, invece di trasferire questi nello spazio-tempo, cosa impossibile, io possa trasferire i simboli.
L'umanità ha adottato, nel corso della storia, due soluzioni diverse. La prima, più semplice da concepire ma meno efficiente, consiste nell'associare a ogni concetto un simbolo. Questa soluzione è più semplice perché, in un certo senso, "salta il segnale", codificando direttamente il messaggio con l'uso di uno o più simboli. Ad esempio: ho paura, dunque emetto un grido, ma, invece di "codificare il grido" (cioè il segnale), codifico direttamente l'idea di paura, con un disegno o un segno stilizzato. La soluzione alternativa, codificare il segnale che, a sua volta, "codifica" il concetto, sebbene apparentemente più complessa, alla fine è talmente più efficiente da risultare la più semplice.
Usando il primo metodo, si potrebbe usare un mucchietto di sassi, opportunamente disposti secondo le regole dell'alfabeto condiviso dalla tribù, per indicare una situazione di pericolo piuttosto che la presenza di un sentiero. Le più antiche forme di scrittura si sono conformate a questa impostazione, utilizzando disegni tracciati su una superficie (scrittura pittografica). Con il passare del tempo i disegni divennero segni stilizzati, che avevano il vantaggio di rendere meno equivocabile il loro significato.
Usando il primo metodo, si potrebbe usare un mucchietto di sassi, opportunamente disposti secondo le regole dell'alfabeto condiviso dalla tribù, per indicare una situazione di pericolo piuttosto che la presenza di un sentiero. Le più antiche forme di scrittura si sono conformate a questa impostazione, utilizzando disegni tracciati su una superficie (scrittura pittografica). Con il passare del tempo i disegni divennero segni stilizzati, che avevano il vantaggio di rendere meno equivocabile il loro significato.
A destra è riportato un esempio di simboli (ideogrammi) usati nell'alfabeto cinese e il metodo seguito per comporli al fine di esprimere concetti più complessi a partire da quelli più semplici. Nella seconda riga, ad esempio, con un simbolo, due simboli o tre si indica rispettivamente un albero, un bosco o una foresta. Gli ideogrammi riportati dal dizionario della lingua cinese moderna sono in totale 56000, sebbene sia sufficiente la conoscenza di circa 3500 segni per comprendere mediamente il 90% di un testo. Molte civiltà, oltre quella cinese, hanno adottato un metodo di scrittura ideografico. Si pensi, ad esempio, alle civiltà della valle dell'Indo.
La scrittura degli antichi egizi è un'evoluzione del metodo ideografico. Accanto ai segni ideografici, infatti, gli antichi egizi ne introdussero altri che indicavano suoni semplici (fonemi) e suoni composti (sillabe). I geroglifici egizi (dal greco ἱερογλυφικός - hieroglyphikós - che significa "segno sacro inciso") utilizzavano 24 segni di base i quali, combinati in modo diverso secondo regole anche complesse, conducevano a un totale di quasi 7000 segni diversi. Per approfondire potete visionare questo lavoro, svolto dai ragazzi della IV-D dell'Istituto Commerciale Santorre di Santarosa di Savigliano (Cuneo).
Il secondo metodo che gli uomini hanno sviluppato per scrivere consiste nell'associare un simbolo ad ogni suono elementare presente in una lingua. Questo è il metodo fonetico, lo stesso che avete appreso in prima elementare: in questo caso si codifica il segnale sonoro (la parola) che è associato al concetto che si intende trasferire nello spazio-tempo. La complessità, apparentemente, aumenta, perché si ha bisogno di una doppia codifica (concetto => suono => simbolo) ma alla fine l'efficienza è molto maggiore.
Si ritiene che il metodo fonetico si sia sviluppato, a partire dalla metà del secondo millennio a.c., come evoluzione dei geroglifici usati dagli egiziani e dagli abitanti della Mesopotamia (coincidente in gran parte con l'odierno Iraq).
Poiché presumo che le maestre e i maestri che vi hanno insegnato a leggere e scrivere abbiano fatto un buon lavoro, non perderò tempo per spiegarvi come funziona il metodo di scrittura fonetica. Tuttavia vi è un aspetto del metodo fonetico che è molto interessante, perché ha attinenza con la tabella ASCII; per essere più precisi con l'evoluzione di questa codifica da 7/8 bit per carattere fino ai 16/32 oggi utilizzati nella codifica UTF-8.
Si ritiene che il metodo fonetico si sia sviluppato, a partire dalla metà del secondo millennio a.c., come evoluzione dei geroglifici usati dagli egiziani e dagli abitanti della Mesopotamia (coincidente in gran parte con l'odierno Iraq).
Poiché presumo che le maestre e i maestri che vi hanno insegnato a leggere e scrivere abbiano fatto un buon lavoro, non perderò tempo per spiegarvi come funziona il metodo di scrittura fonetica. Tuttavia vi è un aspetto del metodo fonetico che è molto interessante, perché ha attinenza con la tabella ASCII; per essere più precisi con l'evoluzione di questa codifica da 7/8 bit per carattere fino ai 16/32 oggi utilizzati nella codifica UTF-8.
L'alfabeto fonetico internazionale (IPA)
Vedete ragazzi, quando voi eravate alle elementari le maestre e i maestri vi hanno insegnato, per prima cosa, i simboli fonetici che rappresentano i suoni elementari della lingua italiana. I suoni elementari sono chiamati "fonemi", mentre i simboli usati per rappresentarli sono i "grafemi".
Vi è però un problema. Prendiamo il fonema rappresentato dal grafema "c", presente ad esempio nella parola "cane". Lo stesso fonema (suono) è presente però anche nella parola "chiesa", ma in questo caso è rappresentato da una coppia di grafemi, la "c" seguita dalla "h". A complicare le cose c'è il fatto che le lingue si evolvono, per cui oggi in italiano si usa anche il grafema "k" per indicare parole ormai accolte nel dizionario italiano, ad esempio "killer", che certamente nessuno di voi si sogna di scrivere "chiller"; anche perché un "chiller" è un tipo di frigorifero.
I linguisti, cioè coloro che studiano professionalmente i linguaggi scritti e parlati da tutte le civiltà di tutti i tempi, a un certo punto hanno sentito l'esigenza di un metodo universale, ovvero non legato a una lingua particolare, per denotare tutti i suoni presenti in tutte le lingue di tutti i tempi. Da questa esigenza è nato l'alfabeto fonetico internazionale (International Phonetic Alphabet - IPA), che è un sistema convenzionale di notazione standardizzata di carattere universale, poiché consente la codifica articolatoria dei suoni di tutte le lingue del mondo.
I linguisti, cioè coloro che studiano professionalmente i linguaggi scritti e parlati da tutte le civiltà di tutti i tempi, a un certo punto hanno sentito l'esigenza di un metodo universale, ovvero non legato a una lingua particolare, per denotare tutti i suoni presenti in tutte le lingue di tutti i tempi. Da questa esigenza è nato l'alfabeto fonetico internazionale (International Phonetic Alphabet - IPA), che è un sistema convenzionale di notazione standardizzata di carattere universale, poiché consente la codifica articolatoria dei suoni di tutte le lingue del mondo.
Avete sicuramente incontrato esempi di scrittura fonetica IPA, sfogliando un dizionario. Ad esempio, la pronuncia della parola "summertime" (estate) in IPA si scrive così: /ˈsʌm.ə.taɪm/. Il suo suono è questo.
Se avete la curiosità di approfondire l'IPA vi suggerisco, per incominciare, questi due video YT:
martedì 7 aprile 2015
mercoledì 25 marzo 2015
XML DOM (1)
L'acronimo DOM sta per Document Object Model. L'XML DOM definisce uno standard per manipolare documenti xml. Oltre all'XML DOM è importante la conoscenza dell'HTML DOM. Quest'ultimo definisce gli oggetti e le proprietà di tutti i tags html, nonché i metodi per manipolarli. In questo post ci occuperemo dell'XML DOM.
Per il DOM ogni cosa in un documento xml è un nodo. Per il DOM:
Nel seguito useremo come file xml di esempio il file books.xml.
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="cooking">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="children">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="web">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="web" cover="paperback">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
Tutti i moderni browser hanno un built-in parser, capace di manipolare documenti xml. Il parser converte un documento xml in un oggetto XML DOM al quale si può accedere usando il linguaggio javascript. Inoltre l'oggetto XML DOM contiene metodi per attraversare un albero xml, accedere ai nodi, inserire nodi, eliminare nodi. Prima di ciò è tuttavia necessario caricare in memoria il documento xml. Questo può essere fatto usando una funzione javascript standard, che nei nostri esempi chiameremo loadXMLDoc(filename). Eccola:
Per il DOM ogni cosa in un documento xml è un nodo. Per il DOM:
- L'intero documento xml è un "document node"
- Ogni elemento xml è un "element node"
- Il testo contenuto negli elementi xml è composto di "text nodes"
- Ogni attributo è un "attribute node"
- I commenti sono "comment nodes"
Nel seguito useremo come file xml di esempio il file books.xml.
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="cooking">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="children">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="web">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="web" cover="paperback">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
Il Parser
Tutti i moderni browser hanno un built-in parser, capace di manipolare documenti xml. Il parser converte un documento xml in un oggetto XML DOM al quale si può accedere usando il linguaggio javascript. Inoltre l'oggetto XML DOM contiene metodi per attraversare un albero xml, accedere ai nodi, inserire nodi, eliminare nodi. Prima di ciò è tuttavia necessario caricare in memoria il documento xml. Questo può essere fatto usando una funzione javascript standard, che nei nostri esempi chiameremo loadXMLDoc(filename). Eccola:
function loadXmlDoc(filename)
{
if (window.XMLHttpRequest)
{
xhttp=new XMLHttpRequest();
}
else // code for IE5 and IE6 {
xhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xhttp.open("GET",filename,false);
xhttp.send();
return xhttp.responseXML;
}
{
if (window.XMLHttpRequest)
{
xhttp=new XMLHttpRequest();
}
else // code for IE5 and IE6 {
xhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xhttp.open("GET",filename,false);
xhttp.send();
return xhttp.responseXML;
}
Conviene memorizzare questa funzione in un file esterno (che chiameremo "xmlFunctions.js"), al quale si farà riferimento inserendo un'apposita direttiva nella sezione <head> della pagina web (evidenziata in giallo).
<!DOCTYPE html>
<html>
<head>
<script src="xmlFunctions.js"></script>
</head>
<body>
</body>
</html>
A questo punto siamo pronti per il nostro primo esperimento: vogliamo caricare, leggere e scrivere in una pagina web tutti i titoli del file books.xml.
Scriviamo dunque una semplice pagina html con il seguente codice:
<!DOCTYPE html>
<html>
<head>
<script src="xmlFunctions.js"></script>
</head>
<body>
<div id="pippo"/>
<script type="text/javascript" language="javascript">
xmlDoc=loadXmlDoc("books.xml");
var htmTxt="";
x=xmlDoc.getElementsByTagName("title");
for (i=0;i<x.length;i++)
{
htmTxt+=x[i].childNodes[0].nodeValue + "<br/>";
}
document.getElementById("pippo").innerHTML=htmTxt;
</script>
</body>
</html>
Salviamo la pagina html con il nome "leggiNodi.html" e apriamola. Vengono visualizzati i titoli dei quattro libri descritti nel file books.xml.
Anche il codice javascript scritto nella pagina html può essere messo in un file apposito, che verrà referenziato nella sezione <head>. In tal modo il codice html della pagina web sarà più leggibile, oltre ad aprirsi alla possibilità che persone diverse lavorino alla realizzazione della stessa funzionalità. Chiamiamo il file esterno "pageCode.js". Operando in tal modo la nostra procedura sarà composta da tre files:
Anche il codice javascript scritto nella pagina html può essere messo in un file apposito, che verrà referenziato nella sezione <head>. In tal modo il codice html della pagina web sarà più leggibile, oltre ad aprirsi alla possibilità che persone diverse lavorino alla realizzazione della stessa funzionalità. Chiamiamo il file esterno "pageCode.js". Operando in tal modo la nostra procedura sarà composta da tre files:
- il file xmlFunctions.js contenente il codice javascript, cioè la funzione loadXmlDoc(fileName), necessario per caricare il file books.xml. Questa funzione può essere usata per aprire un generico altro file xml semplicemente passandogli il nome.
- il file pageCode.js contenente il codice javascript necessario per navigare nell'oggetto xmlDocument restituito dalla chiamata alla funzione loadXmlDoc(filename). Per rendere questo codice riutilizzabile la funzione che esso contiene accetterà tre parametri: il nome del file xml da caricare, il nome del nodo da ricercare, il nome del tag html nel quale iniettare il risultato.
- La pagina html vera e propria, con il contenitore identificato dal tag <div> con identificativo "pippo".
Dopo queste modifiche il codice contenuto nel file xmlFunctions.js resta invariato, mentre cambia il codice contenuto nel file pageCode.js:
function fillDiv(xmlFile, nodeName, tagId)
{
try{
xmlDoc=loadXMLDoc(xmlFile);
}
catch (err){alert(err.message);}
var htmTxt="";
var x=xmlDoc.getElementsByTagName(nodeName);
for (i=0;i<x.length;i++)
{
htmTxt+=x[i].childNodes[0].nodeValue + "<br/>";
}
document.getElementById(tagId).innerHTML=htmTxt;
}
function fillDiv(xmlFile, nodeName, tagId)
{
try{
xmlDoc=loadXMLDoc(xmlFile);
}
catch (err){alert(err.message);}
var htmTxt="";
var x=xmlDoc.getElementsByTagName(nodeName);
for (i=0;i<x.length;i++)
{
htmTxt+=x[i].childNodes[0].nodeValue + "<br/>";
}
document.getElementById(tagId).innerHTML=htmTxt;
}
Si noti, nel codice precedente, il blocco try-catch (evidenziato in giallo) del quale parleremo in altra occasione. Esso serve per intercettare eventuali errori e far comparire un messaggio che lo descrive.
A questo punto il codice della pagina html si riduce notevolmente:
<!DOCTYPE html>
<html>
<head>
<script src="xmlFunctions.js"></script>
<script src="pagecode.js"></script>
</head>
<body>
<div id="pippo"/>
<script type="text/javascript" language="javascript">fillDiv('books.xml','title','pippo');</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<script src="xmlFunctions.js"></script>
<script src="pagecode.js"></script>
</head>
<body>
<div id="pippo"/>
<script type="text/javascript" language="javascript">fillDiv('books.xml','title','pippo');</script>
</body>
</html>
Considerazioni
Abbiamo separato tutta la procedura in tre blocchi per renderla più gestibile e consentire, eventualmente, a più persone di lavorare su di essa.
Nel file xmlFunctions.js si mettono le funzioni di uso generale, cioè riusabili in molti altri casi. Queste sono in genere scritte da specialisti javascript che le rendono disponibili a moltissimi programmatori.
Nel file pageCode.js si mettono le funzioni usate dalla specifica pagina html su cui stiamo lavorando. Il suo codice può essere scritto dalla stessa persona che scrive anche la pagina html, come pure da un'altra persona.
Il file html vero e proprio deve contenere solo i riferimenti ai due precedenti files javascript, oltre naturalmente alla chiamata della/delle funzioni in esse contenute, con gli eventuali parametri da passare. Nel nostro caso tali parametri sono, come già detto:
- il file xml nel quale si trovano i dati (nel nostro caso books.xml)
- il nodo del file xml il cui contenuto si vuole visualizzare (nel nostro caso "title")
- l'identificativo del tag <div> nel quale si vuole iniettare il risultato. Nel nostro caso esso è "pippo" e la sintassi è <div id="pippo"/>
Ovviamente, nella pagina html deve essere presente il tag <div id="pippo"/>.
In particolare, questa suddivisione del lavoro consente al programmatore della pagina html di minimizzare le sue responsabilità e il suo carico di lavoro per concentrarsi solo ed esclusivamente sugli aspetti grafici e testuali. A titolo di esempio ho preparato questa seconda pagina html nella quale è presente, oltre alle quattro righe della prima (quelle evidenziate in giallo), molti altri contenuti, dei quali chi scrive l'html è responsabile. Basta, per visualizzare i dati del file xml in questa nuova pagina html, che egli si ricordi di inserire anche le suddette quattro righe.
martedì 24 marzo 2015
Il circuito RL in c.c.
Consideriamo il circuito in figura:
Sia Vg un generatore di tensione. Possiamo studiare tre casi:
Vg è costante
Vg è sinusoidale
Vg è un segnale qualsiasi
In questo post ci occuperemo del primo caso, in cui Vg è una tensione continua. Supporremo inoltre, per semplicità, che all'istante t=0 la corrente i nel circuito sia nulla.
Chiudendo il circuito in esso comincia a circolare corrente e si stabiliscono delle tensioni ai capi della resistenza R (cui ci riferiremo con il simbolo Vr) e dell'induttanza L (che indicheremo con Vn). Sia le tensioni che la corrente variano nel tempo. Noi vogliamo determinare il loro andamento.
Vale l'ovvia relazione:
Vg=Vr(t) + Vn(t) [1]
il cui significato fisico è che, in ogni istante, la tensione esterna applicata Vg è uguale alla somma della caduta di tensione sulla resistenza (Vr) e della caduta di tensione sull'induttanza (Vn).
Sappiamo, dal corso di elettromagnetismo, che tra la corrente circolante in un'induttanza e la tensione ai suoi capi esiste la relazione:
Vn(t)= L*di(t)/dt [2]
Gli studenti delle prime classi delle medie superiori ignorano il significato dell'espressione di(t)/dt, per cui è necessaria una spiegazione, almeno intuitiva. Essa indica il rapporto tra una variazione molto piccola della corrente che circola nell'induttanza, di(t), divisa per il piccolo tempo dt in cui tale variazione si verifica. E' ovvio che dobbiamo considerare la possibilità (ed in effetti in questo caso è così) che questo rapporto sia variabile con il tempo.
Ricordando la legge di ohm (la caduta di tensione ai capi di una resistenza è uguale al suo valore per la corrente che la attraversa), la [2] può dunque essere scritta così:
Vg= R * i(t) + L * di(t)/dt [3]
Per risolvere questa equazione, che è detta differenziale ordinaria, i metodi algebrici conosciuti dagli studenti delle prime classi delle medie superiori non bastano. Possiamo procedere allora utilizzando due metodi.
Il primo, che scherzosamente mi piace chiamare "credere, obbedire, combattere" consiste nel fornire direttamente la soluzione; il secondo consiste nel risolvere l'equazione con il computer. Esaminiamoli entrambi.
Io=Vg/R [5]
τ = L/R [6]
Per la legge di ohm, Vr(t)=R * i(t), segue facilmente che:
Vr(t) = R * Io * (1 - e-t/τ) [7]
L'andamento di i(t) e Vr(t) è simile, ed è un esponenziale crescente.
Sia Vg un generatore di tensione. Possiamo studiare tre casi:
Vg è costante
Vg è sinusoidale
Vg è un segnale qualsiasi
In questo post ci occuperemo del primo caso, in cui Vg è una tensione continua. Supporremo inoltre, per semplicità, che all'istante t=0 la corrente i nel circuito sia nulla.
Chiudendo il circuito in esso comincia a circolare corrente e si stabiliscono delle tensioni ai capi della resistenza R (cui ci riferiremo con il simbolo Vr) e dell'induttanza L (che indicheremo con Vn). Sia le tensioni che la corrente variano nel tempo. Noi vogliamo determinare il loro andamento.
Vale l'ovvia relazione:
Vg=Vr(t) + Vn(t) [1]
il cui significato fisico è che, in ogni istante, la tensione esterna applicata Vg è uguale alla somma della caduta di tensione sulla resistenza (Vr) e della caduta di tensione sull'induttanza (Vn).
Sappiamo, dal corso di elettromagnetismo, che tra la corrente circolante in un'induttanza e la tensione ai suoi capi esiste la relazione:
Vn(t)= L*di(t)/dt [2]
Gli studenti delle prime classi delle medie superiori ignorano il significato dell'espressione di(t)/dt, per cui è necessaria una spiegazione, almeno intuitiva. Essa indica il rapporto tra una variazione molto piccola della corrente che circola nell'induttanza, di(t), divisa per il piccolo tempo dt in cui tale variazione si verifica. E' ovvio che dobbiamo considerare la possibilità (ed in effetti in questo caso è così) che questo rapporto sia variabile con il tempo.
Ricordando la legge di ohm (la caduta di tensione ai capi di una resistenza è uguale al suo valore per la corrente che la attraversa), la [2] può dunque essere scritta così:
Vg= R * i(t) + L * di(t)/dt [3]
Per risolvere questa equazione, che è detta differenziale ordinaria, i metodi algebrici conosciuti dagli studenti delle prime classi delle medie superiori non bastano. Possiamo procedere allora utilizzando due metodi.
Il primo, che scherzosamente mi piace chiamare "credere, obbedire, combattere" consiste nel fornire direttamente la soluzione; il secondo consiste nel risolvere l'equazione con il computer. Esaminiamoli entrambi.
Il metodo "credere, obbedire, combattere"
La soluzione della [3] è data dalla formula:
i(t) = Io * (1 - e-t/τ) [4]
essendo:Io=Vg/R [5]
τ = L/R [6]
Per la legge di ohm, Vr(t)=R * i(t), segue facilmente che:
Vr(t) = R * Io * (1 - e-t/τ) [7]
L'andamento di i(t) e Vr(t) è simile, ed è un esponenziale crescente.
Il metodo numerico
Esponiamo ora il metodo di risoluzione numerico, facendo uso di un foglio di calcolo. Il metodo consiste nel trovare il modo di calcolare il valore della corrente al tempo t+dt a partire dal valore della corrente al tempo t. Possiamo indicare la corrente al tempo t+dt con l'indice ik+1, e la corrente al tempo t con l'indice ik. Una volta trovata tale relazione, la si usa per calcolare la corrente dopo un tempo pari a 1 * dt a partire dalla corrente al tempo 0. Calcolata la corrente al tempo 1 * dt, si usa questo valore per calcolarla al tempo 2 * dt, e così via. Questo procedimento è detto iterativo.
Possiamo così scrivere:
di(t)/dt = (ik+1 -ik)/dt [8]
Possiamo così scrivere:
di(t)/dt = (ik+1 -ik)/dt [8]
e riscrivere la [3] di conseguenza:
Vg= R * ik + L * (ik+1 -ik)/dt [9]
Dopo qualche passaggio si ottiene:
ik+1 = ik + [(Vg - R * ik)/L] * dt [10]
Per dare inizio all'iterazione è necessario conoscere la corrente iniziale, quella al tempo t=o, che ha indice i0 (la quale, lo ricordiamo, è nulla). La [10] diventa così:
i1 = i0 + [(Vg - R * i0)/L] * dt = 0 + [(Vg - R * 0)/L] * dt = Vg/L
Avviata l'iterazione si calcolano i valori successivi.
Il foglio excel con la simulazione è questo.
Nota del prof: il circuito in questione è di tipo derivativo (proverò a spiegarvi a voce cosa significa), ragion per cui la sua simulazione numerica presenta gravi problemi di instabilità, come si può verificare modificando i parametri R e L.
Vg= R * ik + L * (ik+1 -ik)/dt [9]
Dopo qualche passaggio si ottiene:
ik+1 = ik + [(Vg - R * ik)/L] * dt [10]
Per dare inizio all'iterazione è necessario conoscere la corrente iniziale, quella al tempo t=o, che ha indice i0 (la quale, lo ricordiamo, è nulla). La [10] diventa così:
i1 = i0 + [(Vg - R * i0)/L] * dt = 0 + [(Vg - R * 0)/L] * dt = Vg/L
Avviata l'iterazione si calcolano i valori successivi.
Il foglio excel con la simulazione è questo.
Nota del prof: il circuito in questione è di tipo derivativo (proverò a spiegarvi a voce cosa significa), ragion per cui la sua simulazione numerica presenta gravi problemi di instabilità, come si può verificare modificando i parametri R e L.
Iscriviti a:
Post (Atom)