Как проверить процедуры численного анализа? - PullRequest
7 голосов
/ 19 августа 2008

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

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

Также существует тот факт, что вы обычно имеете дело и с большими структурами данных. У кого-нибудь есть хорошие идеи о том, как подойти к этому, или есть ссылки на хорошие места для поиска?

Ответы [ 3 ]

3 голосов
/ 24 сентября 2008

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

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

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

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

2 голосов
/ 18 октября 2008

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

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

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

1 голос
/ 19 августа 2008

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

Возможно, это не совсем то, что вы ищете, но это ответ компьютерной науки на вопрос разработки программного обеспечения.

...