Распечатать запись Распечатать запись

Одного компьютера недостаточно

Статья не самая свежая. Возможно, некоторые ошибки уже исправлены, однако появились уже и новые… Важен сам факт: ошибки есть, и нужно знать математику, чтобы их видеть.

Введение

Сегодня математическое программное обеспечение занимает важное место в жизни любого человека, связанного с математикой: студента, преподавателя, исследователя… Программные комплексы, которые используются (MATLAB и Mathematica, например), на самом деле хороши и достаточно полны. С их помощью можно выполнять все операции: арифметические, символьные, графические… Потенциал этих программ огромен.

Многие люди начинают думать, что математические знания в связи с наличием этих программ становятся менее важными. Почему мы должны выполнять длительные и громоздкие численные вычисления, если программа позволяет сделать их очень быстро и без возражений? Зачем выполнять сложные символьные вычисления, если программа сделает из за вас с легкостью? Зачем рисовать графики, которые всегда остаются несовершенными, если программа делает это идеально?

Математические знания необходимы

К сожалению, в этом рассуждении есть ошибка. Математические навыки необходимы даже при наличии этих программ. В чем причина? Очень просто: потому что эти программы делают ошибки, как и все остальные. Да, делают. Они не совершенны. Некоторые скажут, мол, если вы имеете в виду вычислительные ошибки (ошибки, которые проистекают из приближений), это неважно, эти ошибки будут всегда. Да, верно. И в самом деле для наших расчетов в целом эти ошибки не так важны, как то, что эти программы, как правило, делают действительно хорошие приближения. Проблема возникает, когда мы сталкиваемся с ошибками концептуальными: иногда компьютер не может выполнить некоторые операции, которые на практике являются относительно простыми, а другие операции делает плохо. И порой мы встречаем совершенно необъяснимые образцы подлинной глупости. Первое плохо, но с этим как-то можно жить. Два других варианта не допустимы, так что нужно быть внимательными.

И еще все зависит от версии программы. Обычно в новых версиях исправлены ошибки, которые присутствовали ранее, как и в любом программном обеспечении: там, где было что-то не так, теперь все делается хорошо, добавляются новые возможности, позволяющие делать то, что раньше было невозможно. Однако новые версии содержат ошибки, которых не было в старых: то, что раньше не могло быть сделано или делалось хорошо, делается плохо.

Как пользователи могут помочь?

Что могут сделать пользователи, чтобы помочь? По правде говоря, очень мало. Математические программы не являются программами с открытым исходным кодом и, следовательно, пользователи не имеют доступа к исходному коду. Возможно, разработчик в одной строке кода сделал ошибку, которая вызывает некоторые из возникающих ошибок, но, к сожалению, пользователи никогда не будут иметь возможности даже попытаться найти эту ошибку. Мы слепо верим, что в программах ошибок нет. В следующих примерах мы увидим, что мы не можем очень уж этому доверять, мы должны быть бдительными, и что наши фундаментальные математические знания не дадут “проглотить’’ любую ошибку в программе.

Примеры

Данное исследование было проведено с помощью пакета Mathematica, Wolfram Research. Поэтому критиковаться будет именно эта программа, хотя это вовсе не означает, что она единственная содержит ошибки. Рассмотрим несколько примеров того, как Mathematica ошибается в определенных случаях.

1) Вычисление пределов

Любой человек, изучавший математику на уровне вуза, должен знать, что для существования предела функции одной переменной в точке должны существовать два равных односторонних предела. Mathematica утверждает, что

\displaystyle\lim_{x\to0}\frac{|x|}{x}=1 .

Как мы все знаем, это неправда. Этот предел не существует, поскольку односторонние пределы имеют разные значения: предел слева равен -1, а предел справа равен 1. Странно то, что Mathematica может вычислить отдельно односторонние пределы и делает это правильно. Вывод: программа выдает неверный ответ.

2) Ошибочные графики

Mathematica строит графики по фиксированному числу значений функции, которые можно указать. Для функций одной переменной построение графиков в новых версиях значительно улучшилось, но алгоритмы, которые там применяются, очень сложно использовать для функций двух переменных, так что разработчики программы решили их не использовать. В чем проблема? Все очень просто: можно, указывая фиксированное число значений, получить графики, которые не соответствуют действительности. Например, если мы рассматриваем некоторую осциллирующую функцию f(x,y), и значения этой функции во всех точках, используемых Mathematica, совпадают со значениями другой определенной функции g(x,y), которая не является осциллирующей, то можно получить график, который не является графиком функции f. Вот пример:

Если мы запишем plot3d[у^2 +Sin [23*х], {х,0,2Pi}, {у,-1,1}], Mathematica возвращает следующий график:

Разве вы не видите, что это странно? Так и есть. Из-за члена [23*х] график должен быть колеблющимся, но этого не происходит. Видимо, это связано с тем, что значения, которые Mathematica использует для представления функции, случайно лежат на поверхности, задаваемой функцией, осциллирующей значительно меньше. Эта проблема решается выбором другого количества значений. Например, с помощью команды plot3d [у^2+Sin [23*х], {х,0,2Pi}, {у,-1,1}, PlotPoints->50] получаем более правильный график:

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

3) Упрощение

Mathematica, как правило, очень осторожна, когда упрощает. Для этого существуют две функции: Simplify и FullSimplify. Первая из них использует определенные методы и не занимает много времени, вторая использует больше методов, чем первая, но занимает больше времени. Например, любой из нас использовал много раз упрощение arcsin(sin(x))=x. Но это верно только в случае

\displaystyle -\frac{\pi}{2}\le x\le\frac{\pi}{2} .

И Mathematica это делает хорошо, возвращает выражение, не упрощая, а для упрощения мы должны показать, что x принадлежит нужному интервалу. Но иногда дела идут плохо. Рассмотрим несколько случаев:

Каждый, кто знаком со свойствами логарифмов, легко видит, что

\displaystyle \frac{\log 8}{\log2}=3 .

Но если написать в Mathematica Simplify[Log[8]/Log[2]], программа возвращает выражение без упрощения. Чтобы получить нужный результат, мы используем другую функцию: FullSimplify[Log[8]/Log[2]]. Да, в конечном счете программа делает упрощение, но можно было бы ожидать, что это сделает и Simplify, поскольку выражение очень простое.

К сожалению, FullSimplify тоже ошибается. Mathematica может вычислять факториалы, а также упрощать выражения. Например, FullSimplify[(n+1)!/n!] возвращает n+1. Прекрасно, все работает правильно. Тогда не понимаю, почему программа не может выполнить FullSimplify[12345678901!/12345678900!]. Легко видеть, что это выражение равно 12345678901, но Mathematica не может решить эту задачу. Пытается вычислить факториалы, но числа слишком большие, и решения не получается, программа не в состоянии изменить и упростить первый вариант. Это не кажется логичным.

Есть и другие примеры ошибочных упрощений.

4) Рассмотрение разных случаев

Обычно осторожная в упрощениях Mathematica иногда пренебрегает некоторыми случаями. Например, относительно легко вычислить следующий интеграл:

\displaystyle\int_0^{\pi}\cos (nt)\cos(mt) dt=\left\{\begin{array}{ll}0,&n\ne m\\<br />
\frac{\pi}{2},&n=m\ne0\\<br />
\pi,&n=m=0\end{array}\right.

Но Mathematica, по непонятной причине, не рассматривает случаи, когда значения m и n равны, и когда они равны нулю. Ответы варьируются в зависимости от используемой версии программы, но они неверные.

Еще один пример такого рода: Mathematica имеет команду Solve для решения уравнений и систем уравнений. Но если нужно решить систему, зависящую от параметра, программа не учитывает значения параметра, при которых систему совместна, несовместна и не определена. Даже с помощью команды LinearSolve для решения систем линейных уравнений эту задачу не решить. Необходимо использовать команду Reduce. Кажется неправильным, что разработчики Mathematica ожидают, что пользователи знают все команды, связанные с каждой операцией, особенно когда требуется решение очень простой системы.

5) Большая ошибка

Вычисление интегралов не избавлено от ошибок. Команда Integrate (Mathematica 5.0) выдает

\displaystyle\int_0^{\infty} (1-e^{-t})^2t^{-\frac{3}{2}}=-2\sqrt{2\pi} .

Это, безусловно, невозможно, так как подынтегральная функция всегда больше или равна нулю и, следовательно, интеграл не может быть отрицательным. Эта проблема решается с помощью команды NIntegrate, что дает нам правильное числовое значение:

\displaystyle\int_0^{\infty} (1-e^{-t})^2t^{-\frac{3}{2}}=(4-2\sqrt{2})\sqrt{\pi} .

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

Другие проблемы с интегралами:

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

Есть случаи, когда ответ, полученный с использованием программы, является гораздо более запутанным, чем мог бы получить человек, вычисляя его вручную.

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

6) Другие ошибки

Для полноты картины приведем еще несколько примеров:

Использовав разные команды и одни и те же значения, программа иногда выдает разные результаты в зависимости от используемой команды.

Иногда не удается аппроксимировать таблицу данных с помощью определенного множества функций (полиномиальная интерполяция).

Есть случаи, в которых найденные корни некоторых уравнений далеки от фактических значений. Используются неправильные численные методы? Некоторых не хватает?

При вычислении комплексных корней степени n из единицы для некоторых n не хватает знания, какая версия программы более актуальна. Версии 3.0 и 4.1 делают это хорошо, но, например, версия 5.1 помещает корни вне единичной окружности (напомним: комплексные корней из единицы имеют модуль 1 и, следовательно, должны лежать на единичной окружности).

Заключение

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

Источник: http://gaussianos.com/solo-con-el-ordenador-no-es-suficiente/

Один комментарий

  1. 1 Чук-и-Гек:

    Программы ошибок не совершают. Их совершают программисты. Или пользователи ))
    Просто необходимо самому покодить некоторое время, чтобы понять – почему обстоит так, а не иначе. Большинство существующих ошибок связано с тем, что человек использует намного больше оптимизаций, основанных на личном опыте. Программа не может писаться с учетом всех этих вариантов: она должна быть универсальной, и должна быть написана в срок.
    Некоторое отсутствие детеминированности в результатах – следствие меняющихся алгоритмов. Хотя было время, когда и от аппаратных нюансов зависело – когда только пошли вычисления чисел с точкой в “сопроцессорах”.

    1 – хз
    2 – ну тут все логично. дискретность предполагает необходимость выбора некоторого параметра квантования. на программу грех пенять. кстати, выборкой заведомо больше ожидаемого периода функции, пользуются цифровые осциллографы для фиксации сигналов, частота которых превышает частоту выборки самого прибора. так что этот “косяк” не всегда косяк ))
    3 – с упрощениями… при задании числовых значений и попытке что-либо вычислить- для большинства функций выполнение идет строго в соответствии со стандартным синтаксисом языков. так что та же лексема с факториалом считается абсолютно верно – до деления. так что упрощать она за людей не будет. классика программирования “что на входе – то и на выходе”
    4 – хз. скорее всего какой-то очень обобщенный алгоритм для подобных тригонометрических штуковин.
    5 – классика. ожидаем, что программа все сделает за нас. увы. она не знает “сложнее или проще” получился результат. не знает правил оптимизации, которым некоторые научились в вузах. вообще, алгебраическое интегрирование – вещь в себе. его и правда интересно кодить ))

    Короче, согласен с автором статьи – тупо использовать инструмент не получится. Нужно знать его возможности, границы применения. Волшебных палочек не существует.

    [Ответить]

Оставьте свой отзыв

Добавить изображение