Il metodo Monte Carlo e l’analisi worst case in LTSpice IV

Insieme ai cambiamenti di temperatura e all’invecchiamento, le tolleranze dei componenti elettronici determinano delle inevitabili variazioni statistiche delle prestazioni offerte da un dato circuito. Queste variazioni vengono definite sensibilità e il loro studio permette di prevedere quale sarà la massima variazione attesa di un dato parametro del circuito finale (per es. offset, risposta in frequenza, guadagno, ecc.) in base alle tolleranze dei componenti usati.

Il calcolo manuale delle sensibilità può essere particolarmente complicato quando un dato parametro dipende dal valore di molti componenti. A questo proposito, le simulazioni in SPICE sono un mezzo particolarmente efficace per prevedere gli effetti determinati dalle tolleranze dei componenti. Due strumenti frequentemente usati a questo scopo sono il metodo Monte Carlo e l’analisi worst case (WCA). Seppure non sia attualmente dichiarato nel manuale, il software LTSpice IV dispone di una funzione predefinita per il metodo Monte Carlo. Al contrario, non dispone di una funzione predefinita per l’analisi worst case, ma questa può essere facilmente implementata dall’utente mediante una funzione personalizzata.

1. Metodo Monte Carlo

Il metodo Monte Carlo si basa sull’esecuzione di un grande numero di simulazioni nelle quali i valori di ciascun componente vengono variati, di volta in volta, in maniera casuale. Questi valori seguono la distribuzione che si suppone abbiano nella realtà e sono incorrelati tra loro. Il metodo Monte Carlo è quindi un metodo statistico che fornisce una stima delle prestazioni reali di un circuito e permette di valutare l’errore atteso di un dato parametro rispetto al suo valore nominale.

Il metodo Monte Carlo può essere eseguito in LTSpice IV richiamando la funzione predefinita mc all’interno del campo Value di ciascun componente usando la sintassi:

{mc(<nom>,<tol>)}

dove <nom> è il valore nominale del componente e <tol> la sua tolleranza espressa in forma decimale. Per esempio, un resistore da 10 kΩ con una tolleranza del 5% può essere espresso inserendo nel suo campo Value la sintassi:

{mc(10k,0.05)}

mentre ad un condensatore da 10 nF con una tolleranza del 10% può essere attribuito:

{mc(10n,0.10)}

Infine, è sufficiente aggiungere la direttiva:

.step param run 1 1000 1

per eseguire una serie di 1000 simulazioni nelle quali il valore di ciascun componente verrà variato, di volta in volta, in maniera casuale all’interno dell’intervallo di tolleranza specificato (10 kΩ ± 5% e 10 nF ± 10%). Si noti che per ottenere un’attendibilità statistica è necessario eseguire un grande numero di simulazioni.

Nota: seppure i valori dei componenti reali seguano una distribuzione normale (gaussiana), il metodo Monte Carlo implementato in LTSpice 4 simula una distribuzione uniforme dei valori, che risultano compresi entro i limiti di tolleranza specificati dall’utente. Questo fa sì che le simulazioni presentino risultati leggermente più pessimistici di quelli ottenibili in realtà.

In fig. 1 è stato simulato un filtro ad un polo ed uno zero usando il metodo Monte Carlo. I resistori e il condensatore hanno rispettivamente una tolleranza del 5% e del 10%.

mcwc0609151945
Fig. 1 – Metodo Monte Carlo in LTSpice 4.

L’analisi AC ha restituito un fascio di 1000 curve che descrivono il comportamento del circuito nel dominio della frequenza da un punto di vista statistico.

2. Analisi worst case

L’analisi worst case è utile quando è necessario valutare lo scenario peggiore che si potrebbe presentare nel caso in cui il valore di ciascun componente fosse esattamente al limite dell’intervallo specificato e nel caso in cui i valori di ciascun componente contribuissero, nel loro insieme, alla massima deviazione possibile del parametro d’interesse. Si tratta quindi di un metodo matematico il cui scopo è quello di prevedere la peggior situazione possibile (seppur questa sia in pratica molto improbabile) che potrebbe verificarsi nel caso in cui tutti i componenti presentassero un valore al limite della tolleranza specificata dall’utente. Questo metodo è utile per prevedere la variazione massima di un dato parametro che si potrebbe ottenere nel circuito finito ed è un utile strumento per verificare le ipotesi relative ad eventuali malfunzionamenti legati alle tolleranze dei componenti impiegati.

LTSpice IV non dispone di una funzione predefinita a questo scopo, per cui è necessario ricorrere ad una funzione definita dall’utente. Questo può essere ottenuto in vari modi, per esempio introducendo la direttiva:

.func wc(nom,tol) if(flat(1)>0,nom*(1+tol),nom*(1-tol))

e richiamando questa funzione all’interno del parametro Value di ciascun componente mediante la sintassi:

{wc(<nom>,<tol>)}

dove, ancora una volta, <nom> è il valore nominale del componente e <tol> la sua tolleranza espressa in forma decimale.

Spiegazione: la funzione flat(1) restituisce un numero casuale con distribuzione uniforme compreso tra -1 e +1. Pertanto, flat(1)>0 assume il valore vero col 50% delle probabilità. La funzione usata per l’analisi worst case è del tipo if(x,y,z), dove se x > 0,5, allora la funzione assume il valore di y, altrimenti assume il valore di z. In questo modo, la funzione if(flat(1)>0,x,y) restituisce il valore x oppure y col 50% di probabilità.

Applicando il calcolo combinatorio è facile dimostrare che l’analisi worst case restituisce al più una famiglia di \(2^n\) distine curve, dove \(n\) è il numero di componenti coinvolti nell’analisi. Tuttavia, poiché l’algoritmo usato in questo esempio restituisce nom*(1+tol) o nom*(1-tol) in maniera casuale, è necessario ripetere un numero di simulazioni sufficientemente superiore a \(2^n\) per avere un’elevata probabilità di esplorare tutte le possibili combinazioni. In pratica, un numero di simulazioni pari a \(10\times2^n\) è adeguato.

In fig. 2 è stata eseguita l’analisi worst case del circuito precedente lanciando una serie di 80 simulazioni.

mcwc0609151949
Fig. 2 – Worst case analysis in LTSpice IV.

Commenti

3 risposte

  1. Il procedimento denominato come wc non riesce sempre a determinare il valore corretto di worst case. Si prenda per esempio il caso semplice e tipico di un generatore DC di tensione reale, cioè con una resistenza serie R1+-tol. Si inserisca un carico pari a R2+- tol. Si ipotizzi per semplicità che R1=R2=R. Si voglia determinare il worst case di potenza trasferita al carico. E’ immediato vedere che con il procedimento suggerito NON si ricava la potenza di worst case, che si ha appunto con R1=R2=R e non con R+tol o R-tol. Se R1 è diverso da R2, ma c’è una regione di sovrapposizione, ove R1=R2, il worst case si avrà per il valore di R più basso in questa regione. Tutto questo per dire che laddove la funzione totale di cui si vuole determinare il worst case, che tiene conto delle diverse variabili in gioco, non sia monotona per tutte le variabili, il worst case si avrà in un punto a gradiente nullo (derivata nulla per funzioni di singola variabile). Molto meglio il metodo monte carlo che simula la funzione per tutti i valori possibili, e quindi dato un numero molto grande di iterazioni si avvicina a delineare i punti di massimo o minimo (worst case)

  2. Avatar Gianni Tombesi
    Gianni Tombesi

    Buonasera,
    Sono nuovo del programma e vi ringrazio in anticipo dell’eventuale risposta.
    Come posso introdurre la direttiva .func wc(nom,tol) if(flat(1)>0,nom*(1+tol),nom*(1-tol))?
    Nel comando “Edit Simulation Command” non posso inserirlo.
    Vi ringrazio ancora
    G.

    1. Salve Gianni,
      le direttive possono essere aggiunte tramite il pulsante “.op” presente nella barra superiore.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *