Как протестировать процедуры численного анализа?

StackOverflow https://stackoverflow.com/questions/16434

  •  08-06-2019
  •  | 
  •  

Вопрос

Существуют ли хорошие онлайн-ресурсы о том, как создавать, поддерживать и думать о написании программ тестирования для кода численного анализа?

Одно из ограничений, которое я вижу в тестировании умножения матриц, заключается в том, что очевидные тесты (например, когда одна матрица является идентификатором) не могут полностью проверить функциональность кода.

Кроме того, вы обычно имеете дело с большими структурами данных.Есть ли у кого-нибудь хорошие идеи о том, как подойти к этому, или есть подсказки, где можно поискать?

Это было полезно?

Решение

Похоже, вам нужно думать о тестировании как минимум двумя разными способами:

  1. Некоторые численные методы допускают мета-мышление.Например, обратимые операции позволяют вам настраивать тестовые примеры, чтобы проверить, находится ли результат в допустимых пределах ошибок оригинала.Например, матрица М-инверсный умножить матрицу М * случайный вектор В должно привести к В опять же, с точностью до некоторой приемлемой меры погрешности.
    Очевидно, что в этом примере выполняется обращение матрицы, умножение матрицы и умножение матрицы на вектор.Мне нравятся подобные цепочки, потому что вы можете сгенерировать довольно много случайных тестовых случаев и получить статистическое покрытие, писать которое вручную было бы утомительно.Однако они не выполняют отдельные операции изолированно.

  2. Некоторые численные методы имеют выражение своей ошибки в замкнутой форме.Если вы можете создать ситуацию с известным решением, вы можете затем сравнить разницу между решением и вычисленным результатом, ища разницу, выходящую за эти известные границы.

По сути, этот вопрос иллюстрирует проблему, заключающуюся в том, что для хорошего тестирования сложных методов требуется довольно много знаний в предметной области.Конкретные ссылки потребуют немного более конкретной информации о том, что вы тестируете.Я определенно рекомендую вам иметь хотя бы Список рекомендуемых книг Стива Йегге под рукой.

Другие советы

Если вы собираетесь выполнять матричные вычисления, используйте LAPACK.Это очень хорошо протестированный код.Очень умные люди работали над этим десятилетиями.Они глубоко задумались над проблемами, о которых непосвященный никогда не задумается.

В целом я бы рекомендовал два вида тестирования:систематический и случайный.Под систематическим я подразумеваю изучение крайних случаев и т. д.Будет полезно, если вы сможете прочитать исходный код.Часто алгоритмы имеют точки ветвления:вычисляйте таким образом числа в этом диапазоне, другим способом — числа в другом диапазоне и т. д.Тестовые значения близки к точкам ветвления с обеих сторон, поскольку именно там ошибка аппроксимации часто бывает самой большой.

Случайные входные значения также важны.Если вы рационально выберете все тестовые примеры, вы сможете систематически избегать того, что, по вашему мнению, не является проблемой.Иногда вы можете эффективно использовать случайные входные значения, даже если у вас нет точных значений для тестирования.Например, если у вас есть код для вычисления функции и обратной к ней функции, вы можете сгенерировать 1000 случайных значений и посмотреть, вернет ли вас применение функции и обратной к ней функции близко к тому, с чего вы начали.

Посмотрите книгу автора Дэвид Грайс называется Наука программирования.Речь идет о доказательстве корректности программ.Если вы хотите быть уверены в корректности своих программ (вплоть до доказательства их правильности), эта книга — хорошее место для начала.

Вероятно, это не совсем то, что вы ищете, но это ответ информатики на вопрос по разработке программного обеспечения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top