Случайность, как настаивал Гегель, необходима. Понимание необходимости у философов отличается от её обиходной трактовки, необходимость - это то, что нельзя обойти, но не всегда то, что нам нужно. Мы начали свои занятия моделированием на БК со случайного - без этого нам всё равно не обойтись. (Вып. №7.) Мы продолжаем эту тему, но затем перейдём к иным, более обширным сюжетам, которые можно объединить общим признаком: линейностью, о которой Гегель, кажется, не высказывался...
Н. ГЕРМАН
СЛУЧАЙНОСТЬ, НЕОБХОДИМОСТЬ И ПРЯМОЛИНЕЙНОСТЬ
Одна из моделей, возникших в конце предыдущего занятия, должна была изображать поведение маленькой капельки жира в молоке, медленно дрейфующей вверх под действием архимедовой силы на фоне случайных толчков окружающих молекул (это деление, разумеется, условно - оба движения возникают вследствие «толчков» молекул). Само наблюдение дрейфовых траекторий достаточно занятно, причём, подметив кое-какие особенности случайных блужданий и дрейфа, можно вполне целенаправленно использовать случайную функцию FRAN для рисования на дисплее почти реалистических пейзажей.
К сожалению, при подготовке предыдущего занятия «выпало» примечание, касавшееся соответствия некоторых операторов и случайных функций в ФОКАЛЕ и в БЕЙСИКЕ. Воспроизводим его для ценителей БЕЙСИКА с подобающими извинениями.
Оператор S(SET) Фокала переходит в БЕЙСИКЕ в LET, построение точки организуется оператором X FT(A, X, Y), где первый, а не третий операнд управляет включением или гашением точки с координатами (X, Y). Отрезок прямой строится оператором X FV(А, X, Y) также от точки, построенной последней. Наконец, рабочий интервал функции RND - (0,1), а у FRAN - (-1,+1), иначе FRAN = 2RND-1
У нас возникли и другие опечатки и провалы, вполне характерные для обычного типографского способа производства печатной продукции. Так, академик Сергей Алексеевич Лебедев приобрёл несвойственный ему инициал, правый регистр (ПР) превратился в нижний (HP), исчезли пропуски, которые должны разделять операторы от их операндов, и т.п. Погрешности в записи программ особенно досадны, и поэтому их обычно стараются воспроизводить с отлаженной, работавшей и отпечатанной самой ЭВМ копии, так называемого листинга. БК выводит программу на экран, но далее - увы! - отпечатывать ему её не на чём.
Можно выразить надежду, что «компьютерная революция» и у нас приведёт к радикальному перевороту в типографском деле и авторы получат возможность сами набирать свой текст и даже передавать его в издательство почти что мысленно - по телефонной сети непосредственно из БК. принимать оттуда же текст от редактора и т.п. Покуда мы узнаем о такой блаженной возможности из восторженных репортажей журналистской братии, да из сообщений о стачке британских печатников, боровшихся, подобно своим соотечественникам - луддитам, - против неумолимого (необходимого!) английского прогресса.
Итак, попробуем вот такой простой сюжет:
1.1 F N=1,2000; D2 2.1 F А=1,30; D3 3.1 S Х(А)=Х(А)-FRAN() 3.2 S Y(A)=Y(A)-FRAN()+FITR(A/30) 3.3 I (Y(A)-160) 3.5 3.4 S Y(A)=Y(A)-5 3.5 X FT(1,128-X(A),60+Y(A))
Его можно воспринимать как недвусмысленное выражение отношения Зевса к какому-либо чересчур консервативному министерству. Более идиллическая трактовка - вид экзотического деревца (оно «вырастает», правда, начиная с кроны). Советуем рассматривать получающиеся пейзажи, переключая (в том числе по ходу программы) тональность изображения кнопкой ИНВ.Э. (совместно с HP, код команды - 157).
На БК можно приготовить и полутоновые черно-белые пейзажи - двухступенчатая градация яркости включается кнопкой ЗБ - в нижнем регистре и только при укрупнённом масштабе (64/32). Код - 146.
Можно посоветовать также тем, кто сам ещё не набрёл на такую возможность, пользоваться кнопкой ШАГ для разглядывания промежуточных рисунков, вообще для приостановки программы, записи результатов и т.п. Для возобновления действия программы надо нажать ВВОД, для полной остановки - СТОП, других действий ШАГ не приемлет. Заметим заодно, что при действующей программе БК может удерживать в памяти всего одну (!) команду, намеренно или случайно набранную на клавиатуре. После нажатия СТОП эта команда готова к запуску, но некоторые тут же и выполняются, например СБР/РП, которая и произведёт немедленную очистку экрана.
Обе предложенные трактовки можно развивать, совершенствуя их до бесконечности. Изобразим вначале проявление совсем уж демонических сил:
3.2 S Y(A)=Y(A)-FRAN()+.3*FITR(А/20)
А теперь, напротив, вырастим небольшую милую рощицу:
1.1 F М=1,10; S А(М)=128*(1-FRAN()); S B(M)=25*FRAN(); D2 2.1 F А=1,10; S Х(А)=0; S Y(A)=0; D3 3.1 F N=1,200; D4 4.1 S X(A)=X(A)-FRAN( ); S Y(A)=Y(A)-FRAN()+FITR(A/10) 4.2 I (Y(A)-100+B(M)-20* FSIN((X(A)-A(M))/25)) 4.4 4.3 S Y(A)=Y(A)-2 4.4 X FT(1,A(M)-X(A),80+B(M)+Y(A))
Предоставим пользователям с задатками художественного вкуса довести её, скажем, до вполне шишкинского стандарта.
Автор должен признаться, что, обращаясь всякий раз к читателю как к пользователю, он испытывает некоторую неловкость и слегка поёживается. Эта утвердившаяся компьютерная новация (она могла и раньше пролезть в язык) даже привела в восторг ведущих телепрограммы «Терминал» своим якобы истинно русским звучанием. Всё же эта калька с английского USER’a лишь немногим благозвучней также утвердившегося (и формально вполне русского) обращения: мужчина! Да и название нашего БК - бытовой компьютер - также является несомненной калькой с HOME COMPUTER, причём снова не очень удачной из-за немедленных ассоциаций, прочно связанных с этим скомпрометированным направлением развития мировой идеи (морально-бытовое разложение, бытовая травма и т.п.). Домашний несёт более тёплый оттенок...
А сам «Терминал»? Тоже вроде бы красивое слово... но вот для медиков, к примеру, оно явно должно отдавать покойницкой.
Вообще для ревнителей чистоты родного языка занятия с компьютером - сплошная нервотрёпка. Ох, эти уж файлы, интерфейсы, драйверы и листинги! Специалисты не потрудились подыскать для них более привычных терминов... ах, пардон! - выражений. Но приходится признать, что эти явления в языке вряд ли обратимы, и можно лишь выразить надежду, что они представляют свидетельства мощного стихийного процесса обратного тому, что случился при вавилонском столпотворении.
Помимо подобных развлечений, дрейф нашей капли может дать повод для совершенно серьёзных и полезных исследований...
Наши рисунки - не такая пустая забава, как может показаться на первый взгляд. Известен целый компьютерный фантастический фильм, где пейзажи рисовались также «случайной кистью».
Вообще следует заметить, что ЭВМ нашли неожиданно ёмкое применение в кино: они ухитряются заменять дорогостоящие декорации и макеты, которые могут с лёгкостью перемещать, деформировать и т.п., рисуют любых персонажей на фоне живых действующих героев, раскрашивают старые черно-белые ленты и т.п. Компьютерные кадры разной сложности теперь нередко мелькают по нашему телевидению. Советуем внимательнее к ним присматриваться - вдруг кому-то придёт в голову новый сюжет, вообще новое направление!
А вот тема для вполне серьёзного размышления: сколько информации набросано на наши холсты? Где она возникает? Обратите внимание, что программы рисования очень невелики. Вопрос этот чисто качественный, и не следует покуда придумывать точную меру количества информации.
Давайте построим такую вот гистограмму: число случаев, когда частица пребывает на определённом расстоянии от поверхности (в малом интервале), в функции этого расстояния:
5.1 S Y=1;S X(1)=1 5.2 S Y=Y-0.01-FRAN() 5.3 I (-Y) 5.5 5.4 S Y=Y+1.1 5.5 S X(Y)=X(Y)+1 5.6 X FT(1,X(Y),Y)
Дисплей компьютера построен из дискретных строчек, и на нём любые графики - своего рода гистограммы. Обращаем внимание на приём, с помощью которого точки разбрасываются по своим клеточкам: индекс переменной автоматически получает значение целой части нашей переменной (расстояния до поверхности). Этим приёмом мы уже пользовались, да и далее намерены не раз к нему обращаться.
Нетрудно сообразить, что «посещаемость» нашей частицей равных клеток гистограммы должна в среднем монотонно убывать с ростом расстояния (и эта тенденция довольно скоро проступит на дисплее). Закон Архимеда повелевает частице вплотную поджаться к поверхности, а броуновский хаос лишь размывает это устремление. Но вот по какому именно закону меняется с расстоянием вероятность посещения?
Подобные проблемы то и дело возникают перед пытливым исследователем. Как же к ним подступиться? Ну совсем уж новые проблемы попадаются не так и часто, и обычно дело может ограничиться перелистыванием справочников или консультацией у того же знакомого теоретика. Но пользователи БК имеют другую заманчивую возможность: прежде чем заглянуть в справочник, попытаться открыть нужный результат эмпирически. Это может дать стимул и для последующего теоретического построения. А если, упаси бог, наедешь на действительно новую проблему?
Как же построить на БК такой эмпирический поиск? Именно здесь удобно вспомнить шутку, не однажды высказанную нашим великим теоретиком Л.Д. Ландау: «Природа устроена просто: что не экспонента, то - логарифм!»
Действительно замечательно, что ряд важнейших результатов в разных разделах науки выражается очень простыми математическими соотношениями Простая запись закона Кулона, закона всемирного тяготения, важнейшего распределения Гиббса в статистической физике. Даже Ψ - функция основного состояния в атоме водорода - та же простая экспонента. Сюда же следует причислить и знаменитый кеплеров эллипс. Наш случай именно из этого ряда: вероятность застать частицу на некотором расстоянии Y от преграды равна , где h - так называемое среднее удаление. Отметим формальное сходство нашей зависимости с известным распределением Больцмана (иначе барометрической формулой ), которое связано и со сходством физической картины. Мы предложили пока попытаться самим вычислить нашу «среднюю высоту атмосферы».
Разумеется, часто отмеченная формальная простота - лишь результат приближенного подхода. В атмосфере, да и в Солнечной системе, и в атоме водорода действуют какие-то свои поправки, приводящие к отступлениям истинной картины от красивых и простых закономерностей. Реальная атмосфера неизотермична, в молоке же при заметной «жирности» взаимодействие капелек также способно изменить нашу экспоненциальную зависимость (не говоря уж о том, что все капельки имеют различные размеры), которая является, таким образом, лишь линейным приближением к более строгой задаче.
Заметим попутно, что часть атомных и планетных пертурбаций носит релятивистский характер, а некоторые просто Эйнштейном и придуманы. Здесь же не лишне напомнить, что Эйнштейн придумал, т.е., предсказал существование и самого броуновского движения, открытого эдак лет за 75 до написания им диссертации (1905 г.) на эту тему. В «Автобиографических заметках» (1949 г.) Эйнштейн подчёркивал, что ему ничего не было известно о наблюдении Броуна и последующих исследованиях. В наш насыщенный информацией и информатикой век Эйнштейн явно рисковал бы заработать отрицательный отзыв оппонентов в связи с плохим знанием литературы по исследованной тематике. Но, к счастью, тогда всё обошлось более чем благополучно, и в последующих публикациях Эйнштейн выразил благодарность гг. Имярековым, указавшим ему на связь «предсказанного» им феномена с открытием Броуна. Отметим, наконец, что соотношение между скоростью всплывания частицы (подвижностью) и коэффициентом диффузии, определяющим броуновское размытие траектории, даётся формулой, носящей с тех пор имя Эйнштейна. Оно неявно присутствует и в нашей модели (броуновский и дрейфовый шаги заданы нами просто в видах удобства наблюдения) и будет определять и искомое среднее удаление.
Итак, давайте и попробуем построить на нашей гистограмме не саму посещаемость, но её логарифм:
5.6 X FT(1,128-20*FLOG(X(Y)/X(1)+1),Y)
Значения посещаемостей под логарифмом отнесены к посещаемости первой клетки, но, кроме того, туда же добавлена «лишняя» единица. Это сделано для того, чтобы у нас не мог возникнуть FLOG(0), который бы вывел БК из «душевного» равновесия. Обеспечение гладкой работы машинных программ требует особого внимания, в частности, и для исключения всевозможных неприятностей типа , и т.д. В некоторых языках предусмотрены меры к тому, чтобы при подобных казусах действие программы не прерывалось (что может быть полезно при её отладке), а о встреченных особенностях сообщалось лишь в её конце. Обратим попутно внимание ещё на одну орфографическую тонкость в фокале. Операторы в нём обозначаются одной буквой, но для пущей важности предусмотрена возможность печатать и полное их название. Однако при этом все буквы, кроме первой, вообще игнорируются, и поэтому совершенно неважно, что за ней следует. Если вы забудете после первой буквы сделать пропуск или если клавиатура впечатает туда нечто лишнее (мой БК «грешит» такой привычкой), машина может произвести внешне вроде бы и правильные, но обычно вполне абсурдные действия. Следите за орфографией!
То, что может появиться в результате предложенного построения, примерно изображено у нас на рисунке, причём это именно рисунок. Там же проведена идеальная теоретическая прямая (пусть читатели сами попытаются найти её наклон). Ясно, что мы применили здесь шуточное методологическое правило не случайно, но зная наперёд, чем должно кончиться дело. Видно, однако, что, как и в случае собственно броуновского движения, «экспериментальные» точки не слишком хорошо ложатся на теоретическую прямую, причём изображённые на рисунке особенности довольно устойчиво воспроизводятся при самых разных вариантах использования функции FRAN.
Полезно указать ещё на одну занятную особенность в нашей программе. Можно заметить, что посещаемость ближайшей к поверхности клетки меньше, чем у последующей, поэтому мы нормировали свои результаты на значение посещаемости первой клетки (ближайшая у нас - нулевая). Это явление возникает из-за весьма грубого устройства нашей границы, что может дать повод, во- первых, эту границу усовершенствовать, а во-вторых, что куда интересней, сравнить отношение посещаемостей с теорией, а её ещё нужно построить. На этом примере видно, как даже ничтожные на первый взгляд детали общения с БК могут дать повод к самым неожиданным и полезным исследованиям. Наши занятия носят, естественно, факультативный, необязательный характер, и каждый читатель волен сам решать втягиваться ли ему в предлагаемое исследование. Можно предположить, что «спектр» наших читателей - пользователей БК весьма широк: от школьников до кандидатов наук (так мы надеемся). Но всегда следует пытаться представить себе хотя бы в самых общих чертах суть любых привлекающих наше внимание особенностей. Некоторые из них могут таить подвох!
Более или менее сносное согласие с теорией можно выявить только в нескольких ближайших к поверхности слоях. Напротив, в «хвосте» распределения заметен явный провал, хотя (как говорят, при большой статистике, которую вполне можно набрать с БК) число случаев посещения этих слоёв вполне конечно. Этот провал, несомненно, связан с той особенностью FRAN, что сумма всей случайной последовательности (в пределах целого её периода) почти равна нулю, это уже приводило к замкнутости броуновского «демона» (почти равна нулю означает, что результат слишком мал в сравнении с «правильным» среднестатистическим). Вероятно, что точки, которые не смогли «диффундировать» достаточно далеко от преграды, образуют излишний «горб» у конца распределения. Другие, также довольно устойчивые особенности, скажем явную зубчатость этого горба, трудно как-то интерпретировать. Особенно досадным выглядит провал в начальной части графика, который наиболее сильно искажает правильный численный результат исследования («вес» соответствующих точек довольно значителен). И здесь снова возникает достойная тема для размышлений: может ли БК на своей модели дрейфового движения «подтвердить» правильность экспоненциального распределения с точностью, с которой оно было выверено в реальных экспериментах, т.е. снова в несколько процентов?
Наиболее известны прямые эксперименты по проверке экспоненциальности распределения частиц, выполненные Ф. Перреном. Для приготовления взвеси однородных частиц достаточно вначале производить многократное фракционирование смеси путём всё того же отмучивания.
Возможна иная, более математизированная постановка той же проблемы: с какой точностью можно на БК найти число е с помощью рассмотренной нами модели.
А вот ещё одна «случайная задача», с помощью которой также можно найти число е. На пол беспорядочно разбрасывается множество конфетти (спички мы уже разбросали!). Поскольку отдельные бумажки перекрываются, покрытая ими площадь будет меньше суммы площадей всех бумажек. Как зависит эта площадь от количества бумажек? Посмотрим ещё раз, что окажется проще: найти решение теоретически или методом Монте-Карло на БК? Для начала советуем «разбрасывать» на БК не круглые и даже не квадратные конфетти, но линейные.
Один из возможных приёмов усовершенствования не совсем правильной случайной последовательности - дополнительная её перетасовка (как говорят, рандомизация). Автор не без успеха применял в качестве подобной дополнительной рандомизации следующие процедуры, которые можно, рассматривать и как чисто шуточные:
S X=.5*(FRAN()+1); S Х=123*+Х+.456789; S X=X-FITR(X); S X=2*X-1
То же для вычисления «пи»:
...S Х=314*Х+.159265...
Как работают эти процедуры, мы ещё надеемся выяснить. Но даже эти шутейные рандомизаторы позволяют заметно улучшить вид получаемого «барометрического» распределения - его «хвост» сильно вытягивается и наблюдаемые шероховатости уже не сильно вылезают за свои положенные статистикой пределы. Заметим, что периодичность FRAN в результате такой тасовки, конечно же, сохраняется, но в задаче с преградой эта особенность «сглаживается» за счёт многократных «случайных» ударов о преграду - ведь через один период FRAN частица может оказаться вовсе не в исходной точке и само движение в дальнейшем уже не повторяется. Но можно при необходимости заметно растянуть этот период, если производить дополнительную тасовку «случайное» число раз, определяемое из какой-то дополнительной и не слишком хитрой случайной процедуры.
Здесь мы снова приглашаем читателей проявить свою фантазию и изобретательность. Не исключено, что кое- кому в результате удастся не только вычислить е и с более высокой точностью, но и вообще создать более совершенную программу для генерации случайных чисел и даже (!) включить её («зашить»!) в последующие модели бытовых компьютеров, которым придётся трудиться в XXI в. Заметим, что ныне сами по себе машинные программы, т.е. объекты отчасти абстрактные, составляют предмет патентного права, предмет обмена, купли-продажи, а некоторые - даже предмет государственных тайн.
Но прервём на какое-то время знакомство со случайной проблематикой. Полностью мы, конечно, никогда с ней не расстанемся. Повторим, что, как мы надеемся, подобное «случайное» введение в моделирование достаточно быстро ввело нас в гущу соответствующих проблем, познакомило с определёнными приёмами работы с ЭВМ и даже дало возможность почувствовать кое-какие их прелести и ограничения, что, пожалуй, не менее важно. Дело в том, что ограниченность возможностей компьютеров - тема для размышлений не менее благодарная, нежели восхваление их всемогущества. Довольно распространённое убеждение, что нечто, вычисленное ЭВМ, и есть истина в последней инстанции, - не более как проявление компьютерной малограмотности...
Часть нащупанных нами ограничений непосредственно связана с природой компьютерной псевдослучайности. Мой БК, прокрутив весь период функции FRAN примерно за 1 ч, нашёл =3,1877... Как мы видим, явный порядок в заполнении нашего рабочего квадрата всё же не столь равномерен. Прямые методы вычисления интегралов заведомо дали бы здесь более достойные результаты. Однако трудно даже представить, насколько их пришлось бы усложнять в многомерных пространствах или при вариациях границы области интегрирования. Программа же метода Монте-Карло при этом мало бы изменилась. Эта простота нередко может даже привести в восторг. Так, в № 6 переводного журнала «В мире науки» за 1985 г. автор раздела «Занимательный компьютер» утверждал, что лучший способ определения площади пруда - стрельба в него из пушки, а художник этот процесс наглядно изобразил (обычно в этом журнале иллюстрации прекрасные). Фамилия автора в транскрипции русского издания выглядит, как Дьюдни, а это, мы подозреваем, есть результат прочтения на английский лад французской фамилии Дьедоннэ, которая именно в таком виде прекрасно известна всем математикам (по-русски это близко к Богданову). Честно сказать, несколько диковато, что сей учёный муж вынужден прибегать к столь наивному способу иллюстрировать существо метода Монте-Карло для американцев, владеющих в изобилии персональными компьютерами. Они, американцы, большие, конечно, любители попалить из ружей и пистолетов (так можно судить по крайней мере по вестернам), а тут ещё и пушки! Надеемся, что наши читатели, ощутив кое-какие особенности «случайных» методик, сами смогут легко представить, что применительно к реальному пруду метод Дьюдни потребует непомерного расхода боеприпасов, каких-то отчаянных мер для равномерного рассеяния снарядов по рабочей (и эталонной!) площади и т.п. А уж если и сюда притянуть навязшую всем в зубах экологию? Глушение ценных пород промысловой рыбы, расковыривание пахотных и рекреационных угодий. Ай-ай!
Итак, продолжим наши занятия самосовершенствованием на БК на более простом (по крайней мере внешне) материале. В новых задачах нам придётся главным образом проводить пока прямые линии. Подобная задача на дисплее решается БК без видимого напряжения - задавай ему только начало и конец. Однако нам может потребоваться найти (для последующих вычислений) координаты точки пересечения двух изображённых БК прямых. Даже школьники должны знать, что такая задача эквивалентна решению системы двух алгебраических линейных уравнений. Это вообще едва ли не простейший пример использования линейных уравнений, к которым надлежит внимательно присмотреться, поскольку класс линейных уравнений необычайно широк, и они возникают в великом множестве проблем. Чем же так замечательны подобные уравнения? Основное, что необходимо прочувствовать, это то, что именно в силу линейности можно складывать разные решения (т.е. суммировать воздействия, да ещё со своими «весами»), что позволяет работать с теми решениями, которые нам удобны. На этом свойстве основаны мощнейшие решения и исследования линейных задач (например, метод Фурье).
Ну вот возьмём, к примеру, наш БК. Любая ЭВМ обязана иметь мало-мальское математическое обеспечение, т.е. набор стандартных программ для тех или иных задач. Не знаю, как обстоит дело сейчас, но первые БК сопровождались штатной кассетой, на которой наряду с парой не очень подвижных игр и рекламным... фильмом, роликом что ли (чуть было не написал видеоклипом - ещё одним новым воляпюком), была записана единственная математическая программа! Так вот, эта единственная программа предназначена как раз для решения систем алгебраических линейных уравнений. Как тут не понять, что без линейных уравнений никуда не денешься...
Так, может быть, для нашей проблемы с пересечением двух прямых просто переписать эту штатную программу, вставить туда N=2 и нажать ВВОД? Нет, делать этого никак не следует. Вообще переиначивание стандартных программ под свои конкретные задачи - дело непростое и не всегда выгодное.
Надеемся, читатели уже смогли обнаружить, что перезапись новых программ с магнитофона идёт на БК со стиранием содержимого ОЗУ. Вообще при любой перетасовке содержимого памяти, которое может вызываться даже незначительными изменениями программы, имеется риск потерять часть этого содержимого. За этим особо внимательно надо следить, если в памяти хранятся какие-либо данные, накопленные в результате трудоёмких расчётов, и т.п.
Да и наша задачка для рассматриваемой стратегии чересчур проста. В таких случаях гораздо проще воспроизвести самому в программе нехитрую процедуру, выписанную предварительно «на бумажке». Обычно в каждом конкретном расчёте самые общие формулы могут быть как-то дополнительно упрощены. Не следует пренебрегать и приёмами школьной тригонометрии. Итак, на задачи с прямыми линиями!
Где же в физике подобные задачи? Да повсюду. По воле Ньютона свободные тела движутся по прямой и к тому же равномерно. Но совсем уж свободных тел не бывает, и мы можем начать с движения другого объекта - лучей света, которые также распространяются по прямой (в однородных средах). Однако на границах раздела сред лучи могут испытывать отражение и преломление. Начнём, пожалуй, с преломления света и проиллюстрируем для себя известный закон Снеллиуса:
1.1 X FT(0,0,140); X FV(1,256,140) 1.2 F А=0,.1,1.5; D2 2.1 S X0=FTAN(A); X FT(0,128,80) 2.2 X FV(1,128+40*X0,140); S B=FA-SIN(.75*FSIN(A)) 2.3 S X1=X0+FTAN(B); X FV(1,128+40*X1,240)
По-видимому, Виллеброрд Снеллиyc, следуя тогдашней учёной моде, латинизировал свою голландскую фамилию. Мы довольно часто отбрасывали латинские -ус’ы (они могли устойчиво сохраняться в других языках: зоциализмус!). С бедным Снеллиусом эту операцию проделал Р. Фейнман, с лёгкой руки которого (или его переводчиков?) тот и у нас стал просто Снеллом. Итак, это одно и то же лицо...
Сей учёный казус должен напомнить нам о весьма почтенном возрасте закона преломления. Историки науки утверждают, что ещё у древних греков обнаружились данные прямых измерений углов преломления в воде - редкий пример эмпирических исканий в античной науке. Греки, таким образом, лишь слегка не дошли до открытия этого закона (довольно простого внешне и точного).
Что же полезного можно извлечь из этого типично школьного упражнения? Ну вот тому же школьнику будет небесполезно прочувствовать возникновение полного внутреннего отражения, для чего в нашей программе достаточно положить S N=1/N. Можно также перевернуть изображение, чтобы луч выходил вверх из воды. Но главное, может потребоваться принять какие-то дополнительные меры, чтобы исключить возможность появления FASIN(1.1). Пусть пытливый школьник продумает нужные приёмы.
Однако компьютер даёт возможность не только более наглядно представить себе возникновение каких-то достаточно хорошо известных закономерностей. Его мощь позволяет наглядно проиллюстрировать ситуации, которые раньше, при «дедовских» методах обучения, зачастую не рассматривались из-за относительной сложности соответствующих выкладок или рассматривались лишь в узко специальных курсах. Зададимся, к примеру, таким вопросом: где будет видно изображение источника из другой среды? Для ответа нам будет полезно продолжить (условные) лучи из среды, где находится наблюдатель, в среду, откуда они исходят:
2.5 X FV(1,128-80*Х1+120*X0,-60).
Теперь легко можно заметить, что источник виден не там, где он действительно находится (это ещё просто), и что его положение зависит от положения глаза наблюдателя и к тому же ещё от того, насколько широко он (или она - рыба!) раскроет глаза. Видны ли эти неожиданные особенности на вашем дисплее?
Теперь можно взяться и за такую, уже совсем непростую задачу: построить изображение предмета, каким его видит рыба из-под воды. В подобном переложении эта задача фигурировала ещё в самых старых выпусках «Занимательной физики» Я. И. Перельмана. Некоторые читатели, возможно, припомнят и соответствующие рисунки. Нелегко представить, как их можно было тогда сколь-либо точно построить - вероятно, речь могла идти лишь о характерных качественных особенностях. Но БК в состоянии выполнить совершенно строгое построение.
Нам, правда, прежде чем лезть с БК в воду, стоит подумать, как заставить его рисовать не то, что он сам хочет (этим мы только что занимались), но то, что нам в нашей задаче может потребоваться, вообще любую заданную фигуру. На всякий случай предупредим читателя, что приводимые далее рецепты представляют собой плоды собственных изысканий автора и, возможно, что в конструкции БК предусмотрены какие-то иные, более выгодные манёвры.
Нажмём вначале кнопку ГРАФ, в результате чего курсор превратится в крестик-визир (код этой акции - 149). Если теперь нажать ещё и РЕД (код - 152), крестик обретёт подвижность и набор клавиш со стрелками в правом углу клавиатуры будет перемещать его в соответствующих направлениях. Размер шага визира будет теперь соответствовать одной «точке» дисплея. Восстановите с помощью функции FCHR коды всех этих кнопок - они нам могут скоро понадобиться. Теперь пора, наконец, нажать кнопку ЗАП (код - 150), после чего след визира будет вычерчиваться на экране (соответственно СТИР (151) «выключает» точки на его пути). Вся эта последовательность команд может быть занесена в память БК, так что в дальнейшем он сам сможет воспроизвести любой рисунок. Первоначальную же запись какого-либо сюжета можно произвести «численно» - с клетчатой бумаги (художники давно применяют этот приём для копирования) либо непосредственно с оригинала, исполненного на прозрачной плёнке, наложенной на экран.
Можно придумать, разумеется, и какие-то иные способы записи чисто графической информации, например, аналогичные телевизионным системам построчной развёртки, и т.п. По этому поводу снова полезно поразмышлять о количестве записываемой информации, о длине программ, порождающих это количество, о плотности её записи в памяти и т.п.
Если нужный рисунок невелик, можно «уложить» его в несколько строк программы. Однако при этом придётся в начале каждой строки воспроизводить описанную выше процедуру превращения БК в художника, а в конце строки - обратную процедуру, производимую нажатием тех же команд в обратном порядке (это потребуется даже для того, чтобы скомандовать СТОП!). Такая рутина сдерживает полет художественной фантазии, и для масштабных сюжетов лучше занести в память весь набор кодов команд, использовавшихся в процессе рисования. Можно, например, присваивать значение функции FCHR(-1), дающей как раз код очередной команды, соответственно пронумерованной переменной:
1.1 S M(A)=FCHR(-1); X FCHR(M(A)); S А=А+1; G 2.1 X FCHR(M(A)); S А=А+1; G 2.1
Можно и непосредственно в память записать эти коды:
1.1 S А=2000 1.2 S M=FCHR(-1); X FCHR(M); S A=А+2; X FX(-1,A,M); G 2.1 S A=2000 2.2 S A=A+2; X FCHR(FX(1,A));G 2.2
Вообще, таким способом можно занести в память не только рисунок, но любую последовательность действий на БК, в частности и любой текст, и даже, точнее говоря, не сам текст, но процесс его печатания с совершением и исправлением опечаток. Если же опечатки не понадобятся, можно придумать, как их отбросить. В дальнейшем любая такая последовательность действий может быть сохранена на магнитной ленте до подходящего момента. Заметим ещё, что при необходимости максимального уплотнения информации в ОЗУ или на ленте можно легко сообразить, как записать в одну ячейку пару команд или даже больше (все коды - числа, не более чем трёхзначные, а коды перемещений - двухзначные, причём поскольку их всего восемь, то перемещения можно обозначить вообще всего одной десятичной цифрой).
Предусмотрим, наконец, возможность получения с нашего рисунка координат последовательных положений визира - ведь для готовящегося построения понадобятся именно числовые координаты. Здесь снова нетрудно организовать автоматический перевод кодов команд вначале в номера строк программы, где как раз и будут вычисляться результаты изменения координат после очередного шага. Снова заметим, что на дисплее БК число строк или точек в строке не превышает 512, так что и координаты можно при необходимости записывать попарно в одну ячейку памяти.
Теперь можно переходить к построению. В отличие от предыдущего упражнения мы должны считать заданными положение (X, Y) источника и глаза наблюдателя-рыбы (А, В), и нам нужно найти луч, соединяющий эти точки, т.е., скажем, координату точки пересечения этого луча с поверхностью. Такой поиск можно было организовать даже на основании принципа Ферма, по которому луч света проходит по самому быстрому пути, т.е. с минимальными затратами времени. Возможны и иные процедуры, но мы попробуем искать нужную точку как корень некоторого неявного уравнения, выражающего закон Снеллиуса. Задачи на поиск корней неявных уравнений очень распространены, и в справочниках можно подыскать для них массу процедур, одна эффективней другой. Мы же последуем известной студенческой методике, развитой для поимки льва в Африке. Надо её (Африку) разделить пополам, а затем то же самое будем проделывать с теми половинками, где окажется лев - в нашем случае точка пересечения с поверхностью:
1.1 A "X,Y" X,Y; А "А,В" А,В; S Z=X; S DZ=1; S N=4/3 2.1 S Z=Z+DZ 2.2 S C=FATAN((X-Z)/Y); S D=FATAN((A-Z)/B) 2.3 I ((FSIN(C)-N*FSIN(D))*FSGN(DZ)) 2.1, 2.5 2.4 S DZ=-DZ/2; G 2.1 2.5 R
Подобные процедуры поиска последовательными приближениями (итерациями), как мы указывали, весьма распространены, и наш пример - едва ли не простейший - выбран только для предварительного знакомства. Сколько же раз нам придётся повторять нашу африканскую методу? В «чистой» математике число шагов в общем случае бесконечно, но на БК с его 16 разрядами, как может показаться, полное число делений не должно сильно превышать 16, поскольку на его числовой оси нет столь мелких шагов.
Различные итерационные процедуры нередко называют «пристрелкой», хотя специалисты относят этот термин к более чётко очерченной задаче. Реальная артиллерийская пристрелка ведётся в пространстве двух измерений. Любопытно, что (как об этом можно узнать теперь даже из художественной литературы) началу стрельбы на поражение цели должна предшествовать пристрелка примерно из того же количества выстрелов, сколько разрядов имеет наш БК. Это, разумеется, отчасти случайность. Но интересно, что уменьшение числа пристрелочных выстрелов даже при успешном поражении могло означать отступление от уставной итерационной процедуры, что уже таило дисциплинарные опасности для О. Манцева - героя романа «Затяжной выстрел» (Знамя, 1987 №10).
Оказывается, однако, что на дискретной оси БК все функции мало того, что также дискретны, но зачастую ещё и не всегда монотонны. И вот в результате, хотя математический прототип процедуры уверенно сходится, на БК поиск может также стать бесконечным, т.е. вообще ничем не кончиться. Подобных ловушек в числовых процедурах немало, и мы завели в одну из них читателя, чтобы он приобрёл нужную настороженность.
Обычный приём выхода из бесконечных математических процедур - прерывание её по достижении некоторого обусловленного заранее шага поиска:
2.45 I (1/10^6-FABS(DZ))2.1
Теперь нам остаётся найти расстояние до изображения. Примем в соответствии с реалистической ситуацией, что пучок света достаточно узкий.
Сцены охоты рыбок-брызгунов, сбивающих мух струйками воды, недавно мелькали на наших телевизорах в серии передач «Живая планета». Рыбки ухитряются решать нашу задачку, не будучи отягощены знакомством ни с законом Снеллиуса, ни с принципом Ферма, не говоря уже о его великой теореме. Здесь лишний раз уместен довольно общий вопрос приобретают ли они эти тонкие навыки тренировками или наследуют?
Все пучки для невооружённого глаза узкие. Широкие пучки также довольно распространены, скажем, в микроскопии. В этих случаях нужны другие формулы для расстояний. Не утомляя читателя излишней геометрией, приведём окончательную программу, в которой довольно явно заметна формула для определения координат (U, V) изображения:
2.5 S U=N*Y*FSQT((1-(FSIN(C)/N)^2)^3/FCOS(C))^3 2.6 S V=Z+Y*FTAN(D) 2.7 X FT(1,128*X,128*(Y+1)) 2.8 X FT(1,128*V,128*(U+1))
Теперь у нас имеются все возможности, чтобы получить нужную фигуру, а затем и её изображение (у Перельмана фигурировали купальщицы в замысловатых гарнитурах начала века). Мы ограничимся здесь наиболее совершенной кривой - окружностью, хотя она, пожалуй, и не даст возможности столь выпукло проявить особенности возникающих искажений.
Подбор масштабных множителей по осям X и Y нужно производить отдельно для конкретного телевизора так, чтобы окружность на экране выглядела наиболее подобающим образом. Применим удобное параметрическое представление, которое нам ещё не раз понадобится:
1.1 A "A B" A,B 1.2 F Т=0,.01,6.3; S X=1-.3*FSIN(T);S Y=-.5-.4*FCOS(T); D 2
Рассмотренный пример лишний раз демонстрирует, до какой степени можно усложнить любую простенькую вначале проблему - была бы охота! Совершенствоваться, так совершенствоваться! Ведь для нас подобные усложнения - не самоцель, но лишь повод для построения полезных и занимательных упражнений. Лучевая, иначе геометрическая, оптика может предоставить для этого ещё не один сюжет. Если оставить теперь лишь прямолинейные границы, то следующим по сложности случаем надо считать окружность. Поверхности подавляющего количества линз сферические, и поэтому пора начать заниматься исследованием свойств линз, причём не ограничиваться школьным случаем тонких линз. Вот простейшее упражнение: пустим на плоско-сферическую линзу пучок параллельных оси лучей:
1.1 F Y=0,.05,.66; D2 2.1 S A=FASIN(Y); S B=FASIN(1.5*Y) 2.2 S Y1=100*Y1-512-(100*FCOS(A))*FTAN(B-A) 2.3 X FT(0,0,120-100*Y) 2.4 X FV(1,100*FCOS(A),120+100*Y) 2.5 X FV(1,512,Y1)
Возникающие лучи немедленно дают возможность разглядеть проявления сферической аберрации. Для нас снова важно будет понять, что положение «изображения», т.е. места, где уже всего сойдутся лучи, зависит от ширины пучка (от диафрагмы, как говорят в фотографии). Советуем обратить внимание на каустики - огибающие семейства лучей.
Теперь можно попробовать и наклонные пучки, хотя результат можно легко представить и без специального построения. Но так или иначе, обратите внимание, что фокальная плоскость вообще-то кривовата!
В астрономии, где возможности «исправления» аберрации больших зеркал ограничены, известна даже техника съёмки на соответствующим образом искривлённые фото «пластинки».
Одна из стандартных задач практической оптики - «исправление» объективов, т.е. приближение изображения к некоторому оптимуму. Достигается это «сложением» нескольких линз, при котором возможна взаимная корректировка различных аберраций, в числе которых не забудем и о хроматической аберрации, связанной с зависимостью показателя преломления от длины волны. Но предоставим читателям, имеющим особые интересы в фото- и кинотехнике, самим сконструировать на БК составной объектив и построить в нём изображения различных точек, а возможно, и фигур.
Совершенствование составных объектов началось задолго до возникновения ЭВМ. Достижения в этой области впечатляющи, и они связаны как с развитием расчётных методов и практических технологий, так и с созданием новых стёкол с требуемыми свойствами. Но компьютеры сумели обновить процедуры расчёта оптики, причём один из практических приёмов как раз состоит в построении большого числа расчётных лучей. Теперь этот метод удачно дополнился возможностью практического контроля с помощью узких лазерных пучков. В целом эта отрасль, несмотря на почтенный возраст, не стоит на месте из-за всевозрастающих потребностей практики. Сейчас не редкость встретить непрофессиональную камеру, фокусное расстояние которой меняется в 10-12 раз. А перископ подводной лодки? А оптика космических аппаратов, взирающих на всех нас с высоты?
Интересно, что сам великий Ньютон не верил в возможность компенсации хроматической аберрации. Но вот, кажется, поручик Лукаш уже знал об этом (а уж Гашек - во всяком случае).
Ещё одна нескончаемая тема для исследования - радуга. История вопроса здесь не менее почтенна. Утверждают, что в своё время Гюйгенс не поленился провести вручную на чертеже пути 1000 (!) лучей, пронизывающих каплю воды, и был изумлён их концентрацией в определённых направлениях. Теория радуги, основанная на подобных построениях, носит имя Декарта, но гюйгенсовы лучи сохранились в нашей науке в теории дифракции, а в модифицированной форме - и в квантовой механике. Воспроизведём-ка на БК построение Гюйгенса-Декарта.
Если прицельное расстояние - Y, то угол падения A=arcsin У, а угол преломления c=arcsin Y/N. На рисунке видно, что угол первого выхода луча В1=А-2C, а для последующих Вk=Вk-1+-2С. Угол D, под которым луч покидает каплю после К отражений, составит А+Вk. Все углы мы отсчитываем от оси X.
Построения на экране начнём с «капли»:
1.05 A "RADIUS" R; A "CENTER" Е,G; S Р=3.14159 1.07 X FT(0,E+167*R,Q); F Q=1,64; X FV(1,E+167*R*FCOS(P*Q/32), G+110*R*FSIN(P*Q/32))
Введём показатель преломления, число отражений К и полное число лучей М:
1.10 S N=4/3; A "ORDER" К; A "RAYS" М
Теперь запускаем построение падающего исходящего и внутренних лучей (блок 2):
1.2 F I=0,М; D2 2.1 S Y=I/M; S A=FASIN(Y); S C=FASIN(Y/N); S В=А-2*С; S О=К 2.12 X FT(0,0,G-110*R*Y); X FV(1,E-167*R*FCOS(A), G-R*110*Y); 2.13 S B=B-P+2*C 2.14 S SB=110*R*FSIN(B); S CB=167*R*FCOS(B); X FV(1,E+CB,G+SB) 2.15 S O=O-1; I(O) 2.16,2.14,2.13 2.16 S D=A+B; X FV(1,512*FCOS(D)+CB+E, G+SB+337*FSIN(D))
При отлаживании любой программы с множеством лучей часто бывает полезно не выпускать все лучи один за другим, постепенно «раскрывая диафрагму», но бросить сразу в дело пяток-другой лучей, чтобы быстро представить все особенности возникающей картины. Какие же лучи выбрать для этого? Выбор не даст повода предъявлять претензии к его результату, если он случаен (т.е. у нас основан на функции FRAN). Таким образом, можно пояснить приводившийся нами на этот счёт тезис.
Наконец, ещё один практический совет. После того как программа заработала и лучи стали правильно проходить «объектив», нас мало должны заботить все их похождения, а важно лишь представить, где они соберутся в конце концов. Поэтому теперь стоит сами линзы или каплю убрать с экрана, а область вблизи фокальной плоскости изобразить в увеличенном масштабе, что даст возможность лучше рассмотреть существенные для нас подробности.
Незначительные вариации исходной программы удобно осуществлять, «выключая» действие ненужных в данный момент строк или их части, но сохраняя сами эти строки для дальнейшего возможного использования. Это удобно проделывать с помощью оператора С, вставляемого в нужное место строки. При этом следует всё же помнить об опасности стереть массивы данных (см. стр. 00). Поэтому для оператора С стоит заранее предусмотреть место, заполнив его какой-либо нейтральной командой (1, 2, В и т.д.) Итак, оставим пока читателя путешествовать с лучом света, подбирая наилучшие условия для наблюдения радуг различного порядка. Возможности нашего теледисплея с 250 строчками уступают хорошему чертежу, и разглядеть то, что удивило в своё время Гюйгенса, можно, если знать, где искать. И здесь подспорьем может служить декартова теория - не возьмётся ли кто-либо её воспроизвести после наблюдений за исходящими лучами? Желаем успехов в единении теории и практики!