Skip to Content

§6. Теоремы существования и компьютер: когда машина уверенно врёт

Последний параграф главы — короткий, но отрезвляющий. В §5 мы видели, как компьютер врёт из-за округления. Тут покажем ещё одну засаду: иногда алгоритм честно делает ровно то, что написано, выдаёт гладкую красивую картинку — и всё равно приводит не туда. Доверять машине на слово нельзя даже в, казалось бы, железной математике.

Задача Коши и метод Эйлера

Берём классику — задачу Коши: есть уравнение на функцию y(x)y(x), заданное через её производную, плюс стартовая точка.

{y′(x)=f(x,y),y(x0)=y0.\begin{cases} y'(x) = f(x, y), \\ y(x_0) = y_0. \end{cases}

По-простому: нам говорят наклон кривой в каждой точке (y′=fy' = f) и откуда стартовать (y0y_0 при x0x_0). Надо восстановить саму кривую.

Самый прямолинейный способ сделать это на компьютере — метод Эйлера: топаем от старта маленькими шажками, каждый раз двигаясь по касательной.

yi+1=yi+h⋅f(xi,yi),xi+1=xi+h.y_{i+1} = y_i + h \cdot f(x_i, y_i), \qquad x_{i+1} = x_i + h.

Разбираем по кирпичикам:

  • h>0h > 0 — маленький шаг по оси xx. Чем мельче, тем аккуратнее.
  • f(xi,yi)f(x_i, y_i) — наклон кривой в точке, где мы сейчас стоим.
  • h⋅f(xi,yi)h \cdot f(x_i, y_i) — на сколько подрастёт yy, если пройти шажок hh по этой касательной.
  • yi+1=yi+…y_{i+1} = y_i + \dots — делаем шаг: новое yy = старое плюс этот прирост.

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

Как Эйлер перепрыгивает на чужую кривую

Рассмотрим конкретный пример (из Лагутина): наклон задан как

f(x,y)=−xy,y(−1)=0,21.f(x, y) = -\frac{x}{y}, \qquad y(-1) = 0{,}21.

Решить можно и руками. Из y dy=−x dxy\,dy = -x\,dx выходит x2+y2=constx^2 + y^2 = \text{const} — это окружность. Подставляем старт (−1; 0,21)(-1;\ 0{,}21): 1+0,0441=1,04411 + 0{,}0441 = 1{,}0441. Значит, истинное решение — верхняя полуокружность

y=1,0441−x2.y = \sqrt{1{,}0441 - x^2}.

А теперь подвох. Наклон −x/y-x/y рвётся при y=0y = 0 — там деление на ноль. И физически решение-полуокружность нельзя продолжить в нижнюю полуплоскость y<0y < 0: окружность в точке y=0y = 0 разворачивается вертикально. Но компьютер-то этого не знает. Когда ломаная Эйлера подходит к y≈0y \approx 0, наклон −x/y-x/y взлетает до огромных значений, касательная встаёт почти вертикально — и очередной шаг перебрасывает yy в минус, на совершенно чужую интегральную кривую. Машина спокойно поехала дальше по ложному следу, не моргнув.

Покрути сам. Зелёная дуга — истинная полуокружность, красная ломаная — метод Эйлера. Двигай шаг hh: мельче шаг — ломаная держится дуги точнее, но у линии y=0y = 0 она всё равно срывается вниз. Разрыв правой части шагом не победить — хоть ты его дроби в пыль:

Метод Эйлера: как компьютер перепрыгивает кривую

Зелёная дуга — истинное решение (полуокружность). Красная ломаная — метод Эйлера с шагом h.Уменьшай шаг — ломаная держится точнее. Но у линии y = 0 правая часть −x/y рвётся: наклон взлетает, и метод «перепрыгивает» вниз, на чужую кривую. Разрыв шагом не победить.

Мораль главы

Вот тебе и «теоремы существования». Решение существует и единственно — пока мы в области, где всё гладко (y≠0y \ne 0). Но стоит подойти к разрыву, и численный метод, формально работая правильно, уезжает на чужую кривую и выдаёт уверенную чушь.

Это перекликается со всей главой. Физический датчик честен, но медленный и неповторимый (§1). Таблица честна, но жрёт память и подводит на тонких задачах (§2, §5). Математический датчик быстр и воспроизводим, но может таить закономерность, как RANDU (§3), и по Колмогорову вообще не способен выдать «настоящую» случайность коротким кодом (§4). И вот финал: даже прямое численное решение уравнения врёт у разрыва (§6).

Общий закон простой: компьютер — мощный станок, но слепо верить ему нельзя. Понимай, где у твоего инструмента слепая зона, и проверяй результат головой. С этим и пойдём дальше — к задачам главы, где потренируемся ловить такие подвохи руками.

Проверь себя

Тест

Почему метод Эйлера для y' = −x/y у линии y = 0 уезжает на чужую кривую?
Обновлено