Domanda

Esistono buone risorse online su come creare, mantenere e pensare a scrivere routine di test per il codice di analisi numerica?

Uno dei limiti che posso vedere per qualcosa come testare la moltiplicazione di matrici è che i test ovvi (come avere una matrice come identità) potrebbero non testare completamente la funzionalità del codice.

Inoltre, c'è il fatto che di solito hai a che fare anche con strutture di dati di grandi dimensioni.Qualcuno ha qualche buona idea su come affrontare questo problema o ha indicazioni su buoni posti in cui cercare?

È stato utile?

Soluzione

Sembra che tu debba pensare ai test in almeno due modi diversi:

  1. Alcuni metodi numerici consentono un meta-pensiero.Ad esempio, le operazioni invertibili consentono di impostare casi di test per verificare se il risultato rientra nei limiti di errore accettabili dell'originale.Ad esempio, matrice M-inverso volte la matrice M * vettore casuale V dovrebbe risultare V ancora una volta, entro una misura di errore accettabile.
    Ovviamente, questo esempio esercita l'inversa di matrice, la moltiplicazione di matrici e la moltiplicazione di matrice-vettore.Mi piacciono le catene come queste perché puoi generare molti casi di test casuali e ottenere una copertura statistica che sarebbe uno sforzo dover scrivere a mano.Tuttavia, non esercitano le singole operazioni in modo isolato.

  2. Alcuni metodi numerici hanno un'espressione in forma chiusa del loro errore.Se è possibile impostare una situazione con una soluzione nota, è possibile confrontare la differenza tra la soluzione e il risultato calcolato, cercando una differenza che superi questi limiti noti.

Fondamentalmente, questa domanda illustra il problema che testare bene metodi complessi richiede molta conoscenza del dominio.Riferimenti specifici richiederebbero informazioni un po' più specifiche su ciò che stai testando.Ti consiglio vivamente di averlo almeno Elenco dei libri consigliati da Steve Yegge in mano.

Altri suggerimenti

Se hai intenzione di eseguire calcoli con matrici, usa LAPACK.Questo è un codice molto ben testato.Persone molto intelligenti ci lavorano da decenni.Hanno riflettuto profondamente su questioni a cui i non iniziati non avrebbero mai pensato.

In generale, consiglierei due tipi di test:sistematico e casuale.Per sistematico intendo esplorare casi limite, ecc.Aiuta se riesci a leggere il codice sorgente.Spesso gli algoritmi hanno punti di diramazione:calcola in questo modo per i numeri di questo intervallo, in questo altro modo per i numeri di un altro intervallo, ecc.Testare i valori vicino ai punti di diramazione su entrambi i lati perché è lì che l'errore di approssimazione è spesso maggiore.

Anche i valori di input casuali sono importanti.Se scegli razionalmente tutti i casi di test, potresti evitare sistematicamente qualcosa che non realizzi essere un problema.A volte puoi fare buon uso di valori di input casuali anche se non disponi dei valori esatti con cui eseguire il test.Ad esempio, se disponi di codice per calcolare una funzione e la sua inversa, puoi generare 1000 valori casuali e vedere se l'applicazione della funzione e della sua inversa ti riporta al punto di partenza.

Dai un'occhiata a un libro di Davide Gries chiamato La scienza della programmazione.Si tratta di dimostrare la correttezza dei programmi.Se vuoi essere sicuro che i tuoi programmi siano corretti (al punto da dimostrarne la correttezza), questo libro è un buon punto di partenza.

Probabilmente non è esattamente quello che stai cercando, ma è la risposta informatica a una domanda di ingegneria del software.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top