на главную страницу
визитка
темы

Семинары доктора Марцинкевича
(занятие двадцать пятое) 

029.29 Самоформирующаяся функция

    На сегодняшнем занятии мы с вами сделаем шаг к реализации нижеследующей идеи. До сих пор мы исходили из того, что ячейки массива хранят какую-то информацию, и на этом останавливались. А если допустить, что ячейки массива представляют собой переменные, и что, далее, между этими переменными имеют место функциональные зависимости? Тогда, если у нас будут изменяться значения в ячейке, выступающей в роли аргумента функции,  в качестве следствия мы получим  изменения значений в других ячейках. Сам по себе такой подход не представлял бы собой особого интереса, если бы он  не был дополнен идеей обратной связи. Тогда изменения в следствии поведут к изменениям в причине, и мы получим круговой процесс, иногда расширяющуюся, иногда суживающуюся спираль либо что-то другое. Особенность такой системы состоит в том, что она способна сама поддерживать свои состояния. Здесь может находиться богатая золотая жила, а потому и займемся этой областью. Как-то невольно в связи с этой идеей возникает ассоциация с автоматизированными системами управления. А посему, как сказал бы Иудушка Головлев, "потихохоньку и полегохоньку" займёмся этой проблемой.
   В статье 029.27 "Идея" говорилось о том, что едва ли не главным врагом исследования является уже существующее знание, и в настоящем случае не столько в качестве помощника, сколько в качестве врага может выступить теория автоматического управления. Что в этом случае следовало бы предпринять? Я думаю, одну вещь - иметь ввиду. Потому что как ни крути, а теория автоматического управления даёт свои средства мышлению, "направляет и руководит", а это кое-что, если отсутствует более эффективная руководящая рука.

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

   Существует важный вопрос о "первом толчке". Представьте, что машина стоит на наклонной плоскости, и при этом трение в подшипниках колес не позволяет машине двигаться. Но вот кто-то подошел и толкнул машину. И машина пришла в движение, сначала медленно, потом всё быстрее. Это пример "первого толчка". Не было никакого видимого процесса, и вдруг возникло движение. Словом, вопрос о первом толчке - это существенный вопрос. И система с обратной связью позволяет ответить на этот вопрос. Пусть есть функция y=f(x). Ну, и что? Это статика. Здесь все значения аргумента и функции  параллельно существуют "от века" и независимо от времени. Чтобы получить процесс, нужно, чтобы что-то изменяло значения аргумента. Если будет какая-то внешняя сила, которая будет изменять его значения, тогда ладно. Но малоинтересно. А если изменения функции будут изменять значения аргумента? Тогда сама функция будет изменять самое себя. А в этом, согласитесь, уже есть своя необычность. И вот здесь возникает вопрос об этом самом толчке. Что-то должно толкнуть функцию, чтобы она заработала. Когда она заработает,  там она сама себя будет раскручивать. Но для этого ей должен быть дан какой-то внешний толчок, иначе она так и будет стоять.
    Теперь следующий вопрос: процесс, конечно, должен протекать во времени. То есть дискреты времени должны быть фиксированы. Именно время позволяет нам наблюдать происходящие изменения. И вот попробуйте с этой точки зрения рассматривать функцию. Пусть у=kх, где k-постоянная, например, k=2. Тогда, если х=0, то у=0. А если х=1, то у=2. Что получается? - скачок. А внутри-то что было? Скажете: ну, не сразу же так уж прямо х из ноля превратился в 1. Оно прошло промежуточные стадии, все это происходило постепенно.  Прекрасно. А выразить это вы сможете? В том-то и дело, что нет, вам придется где-то остановиться, принять что-то за единицу. Так что скачок в единицу или скачок в миллионную долю единицы в сути дела ничего не меняет. Всё равно скачок, всё равно своеобразный взрыв. Поэтому если уж произошел такой взрыв, который невозможно иначе понять, как превращение ноля в единицу, то следствием этого взрыва явилось   напряжение, которое вызвало изменения в другой стороне противоположности, в значении функции. Это - сила, которая заставила изменить значение функции. Когда мы получили значение функции, мы получили то, что можно назвать равновесием - до следующего необъяснимого взрыва. Т.о. мы получаем отношение скачкообразного и постепенного изменения и противоположность этих двух сторон. В аргументе произошёл взрыв, и он превратился в единицу. И теперь действует единица как единство силы и её качества. И эта единица оказывает влияние на функцию, порождая в ней постепенные изменения. Изменения происходят скачком. То, что x из ноля превратился в единицу, задаёт процесс превращения значения функции у из ноля в двойку. Это процесс, который оканчивается скачком. Т.о. у по отношению к x пришел в равновесие. Но в тот самый момент, когда у превратился в 2, он нарушил равновесие с х. То есть теперь у соответствует х, однако х не соответствует у. у обладает напряжением, которое, в свою очередь, вызывает изменения в х. Теперь в х происходят внутренние изменения, которые  заканчиваются тем, что х приобретает очередное приращение. И т.о. мы получаем круговой процесс, который будет изменять свои параметры в соответствии с его влиянием на другие функциональные закономерности.
   Засим нам следует промоделировать этот процесс. Очевидно, что качественный скачок вызывает к жизни силы, которых до него не было. Силы же, в свою очередь, вызывают движение, которое приводит к качественному скачку в другой стороне противоположности. В этом смысле сила преобразуется в расстояние, а расстояние - в силу. Другими словами, сила должна произвести работу "по перемещению", преодолевая сопротивление противоположной стороны.
    В целом мы видим, что каждая из сторон противоположности стремится привести другую сторону к равновесию с собой, и достигает этого. Но в тот самый момент, когда ей удаётся достичь своей цели, она сама перестает удовлетворять другую сторону противоположности, и теперь другая сторона противоположности приводит её в соответствие с собой.
    Для того, чтобы преодолеть расстояние, нужно приложить силу, а для этого нужно затратить энергию. Здесь мы примем, что энергия производится субъектом "в тех количествах, которые ему нужны для получения соответствующей силы, процесс же является целесообразным и его целью является достижение равновесия. Сам этот процесс, т.о., оказывается не механическим, а интеллигибельным, включающим в себя момент "сврехчувственной целесообразности", и именно "сверхчувственную целесообразность" можно рассматривать в качестве того, чем определяется процесс и его направление. То же, что мы "в качестве человеков" можем наблюдать в этом процессе, это его механистические проявления. Из этого мы в настоящее время и будем исходить. Т.о. мы получаем, что, в зависимости от величины силы и сопротивления, которое ей приходится преодолевать для преодоления расстояния до некоторой "интеллигибельной" точки равновесия стороны противоположности, мы получаем протекание этого процесса в разные промежутки времени. Значит, протекание процесса во времени является регулируемым со стороны силы и расстояния, а также энергетических способностей субъекта.
   Если на этом этапе моделирования мы отвлечёмся от субъективной стороны дела, то мы должны будем иметь дело с энергией, силой, ускорением, скоростью, расстоянием, которые характеризуют процесс. Если же мы отвлечемся еще и от этой механической стороны, то получим протекающий во времени процесс смены значений аргумента и функции. А тогда мы можем пойти дальше и попробовать сконструировать подобного рода машину, что, конечно, не бог весть всё, но, как говорится, "всё-таки".
    Следующий важный вопрос - это вопрос о непрерывности. Представьте себе, что вы устроили соревнование, кто чью руку уложит на стол. Мы имеем дело со столкновением двух сил, и представляется, что они одинаково действуют друг на друга, то есть что мы имеем дело с каким-то непрерывным процессом, в которой обе стороны выступают в одинаковой роли. Однако наблюдение показывает, что всегда одна сила выступает в качестве активной, стремящейся перебороть, другая в качестве пассивной. Пассивная сторона пытается удержать свои позиции, активная пытается изменить позицию относительного равновесия в свою пользу. Т.о. оказывается, что каждая сила приспосабливается к другой, исходя, однако, из противоположных оснований. Сила активная, стремящаяся нарушить равновесие, стремится усилить себя для того, чтобы это сделать. Сила пассивная стремится сохранить равновесие, реагируя, со своей стороны, увеличением на увеличение противоположной силы. Силы могут меняться своими ролями, пассивная может превратиться в активную, как только в последней почувствует слабину. Т.о. мы имеем своеобразный диалог двух сторон.
   Этот же принцип мы положим и в отношение  как функции и её аргумента или, если рассматриваться и аргумент и функцию как функции от времени, двух функций. Мы будем считать, что отношения между ними представляют собой форму диалога, в котором одна сторона, активная, что-то сообщает, другая сторона пассивная, что-то воспринимает. Поэтому мы будем считать, что на каждый такт таймера мы имеем одно из противоположных отношений: либо мы имеем дело с процессом внутреннего изменения аргумента, завершающегося скачком в его значении, либо же с процессом изменения значения функции, также завершающемся скачком в значении. Во всякий момент времени мы имеем дело либо с одним процессом, либо с другим, но не одновременно с этими двумя процессами вместе, ибо это физически невозможно, так как две стороны связаны между собой т.о., что изменения одной стороны связаны с воздействиями на неё другой стороны, а каждая из сторон может находиться только в одном из двух противоположных состояний - либо активном, либо пассивном, либо воздействующем на другую сторону, либо подвергающуюся  воздействию другой стороны.

    Теперь два слова о приёмах исследования.   Примем такую формулу. Будем считать, что речь - неважно, громкая, внешняя, или внутренняя, про себя есть средство организации непроизвольных мыслей, способ введения компонента произвольности в их непроизвольное течение. Нам нужно построить машину. Мы можем сделать это молча, исходя из непосредственного инстинктивного развития мысли, и можем ввести речь как способ объективации импульсивных движений мысли. При этом окажется, что в каких-то случаях мы будем заходить в тупик, и нам придется возвращаться и начинать  заново, в других случаях будем получать позитивный результат. А так как известно, что отрицательный результат - тоже результат, то такое совместное движение сознания и бессознательного можно рассматривать как полезную форму конструирования хотя бы уже потому, что речь позволяет фиксировать действия и тем самым записывать их в память, чем обеспечивается защита от повторений одного и того же, лежащих в основе беспамятства, ибо система незнакомого знания - это тот же лес, который заставляет нас ходить по кругу.
   Помимо этого, такое движение позволяет прокручивать мысленно процессы так, как будто бы они протекают в реальном времени за счет словесного объективирования чувственности.
   Вот имея ввиду эти установки и приступим к конструированию.
   Мы помним, что речь у нас - не первична, а вторична, она является отражением мысли. Она следует за мыслью и поэтому не обязана объяснять мысль. Она будет объяснять мысль лишь тогда, когда это потребуется самой мысли. Поэтому она не отвечает на произвольный вопрос, что откуда взялось. Ибо если бы она попыталась это делать, то она представляла бы собой объяснения причин поведения того или иного пробудившегося гипнотика, которому была под гипнозом дана команда выполнить те или иные действия.
   Вот пример тупикового в своей основе движения, которое, однако, при всей своей ошибочности, в конечном счете позволяет выйти на правильную дорогу.
   Начнём с оператора цикла for. Включая оператор цикла, мы тем самым уже даём "первый толчок" и начинаем процесс. Пусть  переменная i подсчитывает  циклы, и её начальное значение равно нолю. Тогда, начиная произвольный цикл, мы должны определиться, что в нём будет определяться: будет приращиваться значение аргумента или определяться значение функции, поскольку в силу диалогического отношения между противоположностью аргумента и функции в отдельном цикле приращивается аргумент либо определяется значение функции. Так как четные и нечетные числа последовательно сменяют друг друга, то этот признак может быть положен в основу конструирования диалога. Примем, что если число четное, то выполняется определение функции, если нечетное - то осуществляется процесс приращения её аргумента. Для этой цели можем использовать арифметическую операцию % "остаток целочисленного деления": если остаток равен нолю - число четное, если 1 - нечетное. Т.к. нам нужно представить работу машины как процесс, протекающий в реальном времени, хотим мы этого или не хотим, нам нужен таймер, который будет отсчитывать интервалы времени, по истечении которых происходят изменения в аргументе либо функции. При этом мы оставляем в стороне вопрос о том, чем именно обусловливаются величины интервалов времени. Они всего лишь  задаются. Что ни в малейшей степени не лишает нас возможности в будущем рассматривать их в качестве функции от действующих сил. Ведь требование, которые предъявляется к конструируемым машинам - это требование их открытости, то есть возможности дальнейшего усложнения их конструкции.
   Давайте в связи с этим остановимся на требованиях к таймеру. У нас уже есть два таймера, и нам ничто не мешает способ управления третьим таймером заимствовать от них. Различие состоит в том, что конструируемая машина является автономной, и, значит, таймер, который назовём Timerdo, должен включаться и выключаться независимо от остальной части программы. При этом мы можем поступить двояко: мы можем сразу включать или выключать третью нить, а процессом управлять путём включения и выключения таймера, либо же мы можем также специально включать и выключать третью нить. Во всяком случае, обе эти возможности следует попробовать, а там посмотрим, какая из них окажется более удобной.
   Итак, мы проверили i на четность и теперь в зависимости от признака четности должны ввести в таймер значения, при которых происходит скачок-, соответствующий значения сброса счета. После чего должны включить таймер. Счетчик импульсов таймера, досчитав до числа сброса, должен установиться в ноль, а таймер выключиться. После этого должна быть выполнена операция приращения аргумента или определения значения функции На этом цикл закончен, и система переходит к выполнению следующего цикла.
   Мы видим, что программа должна иметь две параллельные ветви - аргумента и функции, каждая из которых выполняется в зависимости от признака четности.
   
В приведенном рассуждении допущены две ошибки. Одна ошибка связана с оператором for как вещью, обеспечивающей циклический процесс. За этой мыслью стоит более общая идея необходимости обеспечения циклического процесса. Но, разумеется, циклический процесс может быть реализован разными способами, и for тут не подходит. Вторая ошибка связана с идеей включения и выключения таймера. За этой идеей снова стоит более общая идея, связанная с тем, что должно задаваться разное время, отведенное на формирование значений аргумента и функции. Но ведь само по себе время непрерывно и бесконечно, а таймер представляет собой форму материального представления времени. Уже в силу этой содержательной стороны он не может на каждом отдельном цикле включаться и выключаться. Но это - со стороны содержательной. Со стороны же механической уже то, что программа реализуется в нити, заставляет учитывать то обстоятельство, что нить каждый раз создается и разрушается, и здесь мы снова столкнулись с тупиковой идеей произвольного включения и отключения нити, так как в этом случае петрушка с включениями, естественными завершениями нити и её отключениями настолько запутывает дело, что становится откровенно вредной. Поэтому было принято, что нить нигде специально не выключается, и включается лишь тогда, когда это нужно после её естественного завершения, то есть после выполнения ею фрагмента программы.

   В чём заключается одна из важных особенностей конструирования машины? В том, что это разные вещи: что следует сделать и как это следует сделать. Когда мы исследуем вопрос о том, что следует сделать, мы исходим из общих понятий. Само по себе это движение не даёт нам никакого знания о том, как нечто можно сделать. Для последнего необходимо иметь дело "с материей и её свойствами" и исследовать эту, противоположную сторону дела. Т.о., мы фактически имеем дело с двумя противоположными параллельными движениями и  стремимся к тому, чтобы два эти движения пересеклись в одной точке. Без знания свойств материи, из которой  создается машина, нам следует забыть обо всех наших прекрасных знаниях о том, что нужно сделать. Чтобы что-то сделать, нужно иметь средства для этого. А средства создаются конкретными свойствами материи, какой бы она ни была, природной или созданной человеком.
   Нами описана логика программы. Теперь следует создать саму программу. А для этого нам нужно решить множество частных вопросов, которые в своей совокупности позволяют построить программу.  Поэтому и начнём с частных опытов.
   Опыт первый - формирование нити. В этом опыте нам нужно сформировать нить и научиться её включать и выключать.
   Имея дело с материей, нужно понимать, что действия в этом случае принципиально отличаются от философской мыслительной деятельности. Материя - это эксперимент и выводы из него. Вы имеете дело с материалом, который испытываете в каких-то отношениях. Если вы имеете дело с нитью, то вам нужно выяснить ваши действия с ней в зависимости от ваших целей. Как обычно, формируете файл с заготовкой thread, включаете файл в открытый вами новый проект как обычно, сделав между ними взаимную адресацию и в файле делаете указание на имя нити. Это всё вы умеете. Теперь вы проводите следующий опыт. В нити пишете какую-нибудь элементарную программку. Вам нужно установить, в каком случае нить включена, в каком - нет. Для будете использовать выражение Threaddo = new My2th2 (true), в которое записываете true или false. Согласно свойству материала, при записи true выдается, т.ск., разрешение на работу нити, но нить не включается, при записи false даётся разрешение и нить включается. На этот критерий вам нужно материал проверить. Вы активизируете кнопку, заранее введенную вами в форму, и записываете в ней Threaddo = new My2th2 (true) ; Threaddo->FreeOnTerminate = true; Компилируете программу  и нажимаете на кнопку и контролируете результат по состоянию окна, в который должен быть выведен результат отработки программы нити. Вы видите, что нить не отработала. Выйдите из программы и в программный код вместо true внесите false. Откомпилируйте и запустите программу, нажмите на кнопку - в окне появится результат работы программы нити.
   Теперь перед вами следующий вопрос: вам нужно научиться включать и выключать нить при условии существования разрешения. Добавьте к уже написанному коду Threaddo ->Resume(); И снова испытайте программу. Нить отработает и при существующем true. Перенесите выражение Threaddo = new My2th2 (true) ; Threaddo->FreeOnTerminate = true; в конструктор формы. У вас и теперь при нажатии на кнопку нить сработает. Замените true на false. И ваша нить теперь сработает, хотя вы не нажимали на кнопку.
   Теперь нам нужно провести эксперимент с запуском, остановкой и снова запуском нити. Возвратим true на своё место. Запишем программу нити в форме бесконечного цикла, который, скажем, что-то считает. Тогда при запуске программы мы увидим счет, а при остановке её счёт закончится.
   Для этой цели нам понадобится таймер. Опытный подход состоит в том, что прежде, чем решать сложные задачи, нужно решить простые. Поэтому следующий вопрос, которым займёмся - это специально запуск и остановка таймеров.
   Введем в форму компонент таймер, и в его свойствах запишем Interval=0, Enabled=false. В конструкторе кнопки 1 запишем значения интервала и значение включения установим в true. Теперь откроем события таймера и двумя щелчками на OnTimer активируем конструктор обработчика события, в который запишем действия, которые должны быть произведены при наступлении события OnTimer. например, подсчет импильсов таймера в окне. Запустим таймер, и увидим подсчет импульсов в окне.
   Теперь мы можем возвратиться к первой задаче. Нам нужно было иметь возможность запускать и останавливать нить, и наблюдать это по внешним признакам. Какие это должны быть признаки?

   Запишем программные коды:
   {
   1 Threaddo = new My2th2 (true) ;
    2Threaddo->FreeOnTerminate = true;
    }
   //---------------------------------------------------------------------------
    void __fastcall TForm1::TimerdoTimer(TObject *Sender)
    {
   3 Threaddo = new My2th2 (false) ;
   4 Threaddo->FreeOnTerminate = true;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    { Threaddo ->Resume();
    }
   Строки 1 и 3 различаются булевыми значениями. Запустим программу и нажмём на кн. пуска нити. Начнётся подсчет импульсов таймера. Кнопка останова нити не действует. Изменим булевы значения на противоположные. Будет выполнен первый шаг. Чтобы сделать следующий шаг, нажмём на кнопку останова нити и затем на кнопку её пуска. Программа сделает следующий шаг. и т.д.
Далее опыт развит не был.

   Скачайте программу Pth2 и откройте её на стр. TSprocessdo. Вы увидите четыре окна, которые встречаются на предыдущих страницах, и окна LEargfdo- число импульсов таймера перед приращением аргумента в окне LEargdo, LEfargdo - число импульсов перед высвечиванием следующего значения функции LEfunkdo, LEarfdo - если ноль, то процесс  приращения аргумента, если 1- время процесс расчета значения функции. LEkdo- коэффициент приращения k линейной функции  y=kx.
   Занесите в окна последовательно слева направо числа, если они там еще не стоят, например, такие: 0 - начало счета, 1000 - интервал длительности (1 сек) единичного импульса таймера, 10 - число сброса счётчика на ноль. 1 - пуск счетчика, 5 - число импульсов таймера, после которого записывается приращение аргумента в окно LEarg, в котором в качестве начального значения должен стоять ноль, 7 - число импульсов таймера, после которого записывается очередное значение функции в окно LEfunk, 0 - процесс приращения аргумента, 2 -значение коэффициента k. Откройте посредством MMargfunk меню и нажмите MMarf1. Наблюдайте процесс самоформирования функции. Для остановки процесса можете, как обычно, в окне LEstopdo установить ноль, для продолжения - единицу. Нажав на MMtimerstop остановите таймер. Нажав на MMtimerpusk, запустите его снова. Если нужно процесс начать заново, нажмите на MMfclear.

   О проявлениях силы
    Проявление - это явление чего-то в другом. Сила есть сила чего-то, какого-то, условно говоря, тела. Тело характеризуется массой и движением ("в широком смысле этого слова). Если тело одновременно характеризуется силой, которую оно способно производить, то различие подобных тел будет заключаться в силе, развиваемой единицами объёма их массы. Если масса тела является инертной, то такое тело способно лишь отражать силовые воздействия. Свойства отражения силовых воздействий телом характеризуются признаками его упругости, твердости, хрупкости и вязкости. Сила F=ma,  то есть действие силы величиной F на тело массой  m  вызывает в нём ускорение а. Сила проявляет себя в движении. Затем, никогда и нигде ни в чем не существует одна сила, сила "сама по себе". Всегда ей противостоит другая сила, сопротивление которой ею преодолевается или которой она сопротивляется. Поэтому всегда силе противостоит сила, "равная ей по величине и противоположная по направлению". В движении сила проявляется в работе - в перемещении "тела", к которому она приложена, на какое-то расстояние, в скорости и ускорении. Ускорение есть адекватное проявление соотношения сил. Если есть сила действия Fa и сила сопротивления Fb и эти две силы действуют на некоторое тело А и ускорение тела представляется графиком типа синусоиды, то положительная возрастающая ветвь синусоиды показывает нам уменьшающееся ускорение, и, соответственно, изменяющееся соотношение сил не в пользу действующей. Ниспадающая положительная волна "тоже-синусоиды" показывает, что сила противодействия стала больше силы действия, и происходит торможение движения тела. В нулевой ниспадающей точке тело остановилось и начало двигаться в противоположном направлении. Отрицательная часть полуволны "синусоиды" повторяет закономерности положительной, но теперь относительно силы сопротивления Fb . Если возьмём воздействие силы Fa на тело массой m, то свойствами массы тела будут обусловлены переходные процессы, связанные со следствиями воздействия на тело силы. Если тело абсолютно твёрдое и упругое, то переходные процессы занимают минимальное время, если тело хрупкое, то оно разрушится, если мягкое - то оно изменит форму, если вязкое, то оно "прилипнет" к воздействующему на него телу. Движущееся тело обладает энергией, которую оно передаёт телам, с которыми сталкивается.
   Не очень сложно видеть, что философия мышления силы оказывается философией мышления процессов, какой бы природы они ни были. Можно говорить не только о массе как характеристике инертности физических тел, но и об инертности мышления,  экономических процессов, психических и т.д.

   12.04.09 г.