Perché in QGIS manca la funzione Fattoriale↵
Introduzione↵
Vi siete mai chiesti perché QGIS, pur avendo un ricchissimo set di funzioni matematiche nel calcolatore di campi, non include la funzione fattoriale? In questo articolo esploreremo le ragioni di questa assenza e scopriremo come implementare facilmente questa funzione quando necessario.
La funzione Fattoriale
Il fattoriale di un numero naturale n (indicato con n!) è il prodotto di tutti i numeri interi positivi minori o uguali a n. Ad esempio: 5! = 5 × 4 × 3 × 2 × 1 = 120
Cos'è la funzione Fattoriale↵
La funzione fattoriale è una delle funzioni matematiche più conosciute, definita per i numeri naturali come:
n! = 1 se n = 0
n! = n × (n-1)! se n > 0
Alcuni esempi pratici:
- 0! = 1 (per convenzione)
- 1! = 1
- 2! = 2 × 1 = 2
- 3! = 3 × 2 × 1 = 6
- 4! = 4 × 3 × 2 × 1 = 24
- 5! = 5 × 4 × 3 × 2 × 1 = 120
- 10! = 3.628.800
Perché QGIS non ha una funzione fattoriale nativa?↵
Ci sono diverse ragioni valide per cui QGIS non include una funzione fattoriale nativa nel calcolatore di campi:
1. Casi d'uso limitati nell'ambito GIS↵
Il fattoriale è una funzione principalmente utilizzata in contesti di:
- Combinatoria (calcolo di combinazioni e permutazioni)
- Statistica (distribuzioni di probabilità)
- Analisi matematica (sviluppi in serie di Taylor)
Tuttavia, questi calcoli sono raramente necessari nell'analisi spaziale quotidiana. A differenza di funzioni come area(), distance(), o buffer(), che sono utilizzate costantemente, il fattoriale avrebbe un utilizzo marginale.
2. Crescita estremamente rapida↵
I valori fattoriali crescono in modo esplosivo:
- 20! ≈ 2,43 × 10¹⁸
- 50! ≈ 3,04 × 10⁶⁴
- 100! ≈ 9,33 × 10¹⁵⁷
Questo rende la funzione utile solo per valori molto piccoli (tipicamente n < 20), limitandone ulteriormente l'applicabilità pratica.
3. Facilità di implementazione quando necessario↵
QGIS privilegia un design modulare ed estensibile. Anziché includere ogni possibile funzione matematica, permette agli utenti di:
- Creare funzioni personalizzate tramite Python
- Utilizzare espressioni composte per calcoli specifici
- Sviluppare plugin per esigenze particolari
Come implementare il Fattoriale in QGIS↵
Metodo 1: Funzione personalizzata in Python↵
Il modo più elegante è creare una funzione personalizzata nell'editor delle espressioni. Apri il Calcolatore di Campi e accedi all'Editor delle Funzioni:
from qgis.core import *
from qgis.gui import *
import math
@qgsfunction(args='auto', group='Custom')
def fattoriale(n, feature, parent):
"""
Calcola il fattoriale di un numero.
<h4>Sintassi</h4>
<p>fattoriale(<i>n</i>)</p>
<h4>Argomenti</h4>
<p><i>n</i> → numero intero non negativo</p>
<h4>Esempi</h4>
<ul>
<li>fattoriale(5) → 120</li>
<li>fattoriale(0) → 1</li>
<li>fattoriale(10) → 3628800</li>
</ul>
"""
if n is None:
return None
n = int(n)
if n < 0:
return None # Il fattoriale non è definito per numeri negativi
if n > 170:
return None # Evita overflow (170! è l'ultimo valore rappresentabile)
return math.factorial(n)
Salva la funzione con il nome fattoriale e potrai utilizzarla in qualsiasi espressione:
Metodo 2: Espressione ricorsiva (per piccoli valori)↵
Per valori molto piccoli (n ≤ 5), puoi utilizzare una espressione diretta:
CASE
WHEN "n" = 0 OR "n" = 1 THEN 1
WHEN "n" = 2 THEN 2
WHEN "n" = 3 THEN 6
WHEN "n" = 4 THEN 24
WHEN "n" = 5 THEN 120
ELSE NULL
END
Metodo 3: Calcolo combinatorio↵
Se hai bisogno del fattoriale per calcolare combinazioni o permutazioni, puoi utilizzare formule composite. Ad esempio, per calcolare le combinazioni:
C(n,k) = n! / (k! × (n-k)!)
-- Combinazioni semplici
-- Esempio: C(10,3) = 10!/(3!*7!)
-- Implementazione diretta senza fattoriale completo
CASE
WHEN "k" > "n" THEN NULL
WHEN "k" = 0 OR "k" = "n" THEN 1
ELSE (fattoriale("n") / (fattoriale("k") * fattoriale("n" - "k")))
END
Casi d'uso pratici nel GIS↵
Anche se rari, ci sono alcuni scenari in cui il fattoriale può essere utile:
1. Analisi statistica spaziale↵
Calcolo di probabilità binomiali per analisi di pattern spaziali:
-- Probabilità binomiale: P(X=k) = C(n,k) × p^k × (1-p)^(n-k)
(fattoriale("n") / (fattoriale("k") * fattoriale("n"-"k")))
* power("p", "k")
* power(1-"p", "n"-"k")
2. Calcolo di permutazioni↵
Numero di percorsi possibili tra punti (problema del commesso viaggiatore semplificato):
3. Analisi combinatoria di attributi↵
Calcolo del numero di combinazioni possibili di categorie:
-- Quante combinazioni di k elementi da n categorie disponibili?
fattoriale("tot_categorie") /
(fattoriale("k") * fattoriale("tot_categorie" - "k"))
Conclusioni↵
L'assenza della funzione fattoriale in QGIS è una scelta progettuale sensata, basata su:
- Priorità funzionali: QGIS si concentra sulle funzioni più richieste nell'analisi spaziale
- Flessibilità: Il sistema di funzioni personalizzate permette di aggiungere facilmente qualsiasi funzione necessaria
- Efficienza: Evita di appesantire il software con funzioni raramente utilizzate
Quando hai effettivamente bisogno del fattoriale, implementarlo è questione di pochi minuti grazie all'eccellente integrazione Python di QGIS. Questo approccio mantiene il software snello e allo stesso tempo infinitamente estensibile.
Suggerimento
Se ti trovi spesso a utilizzare funzioni matematiche avanzate, considera di creare una libreria personale di funzioni personalizzate che puoi riutilizzare in tutti i tuoi progetti QGIS!
Risorse utili↵
Scritto interamente da Claude Sonnet 4.5 in vscode!