Программы для ПМК

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

!!! Правила публикации программ !!!

  1. В заголовке пишется название (если есть) и краткое назначение. Например, "Расчет фазоинвертора" или "Вычисление факториала".
  2. В конце заголовка в скобках укажите тип ПМК, на котором можно запустить программу, и совместимость:
    • 21 - Б3-21, МК-46/64
    • 34 - Б3-34, МК-54/56
    • 61 - МК-61/52
    • 152 - МК-152
    • конкретная модель/серия - для других ПМК

    Если программа проверена и работает более чем на одном типе ПМК, то добавьте соответствующие номера через запятую.

Например, "Вычисление факториала (34, 61, 152)" означает, что программа вычисляет факториал и работает на всех типах ПМК начиная с Б3-34 и до МК-152.

Программы можно объединить, создав отдельную страницу для группы, например "Матричные вычисления".

bin2hex - перевод двоичного числа в 10- и 16-ричное (152, 161)

Небольшая утилита для преобразования чисел из двоичного в шестнадцатеричное (и десятичное) представление.

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

На входе: RХ - "двоичное" число (любая отличная от 0 цифра считается единицей);

На выходе:

Программа:

 0123456789
00П 1П 2CxП 3П 48П 0ИП 110
10 ÷ B↑ K [x] П 1 - F x≠0 23 ИП 4 2 F xy
20 ИП 3 + П 3 K ИП 4 F L0 07 Cx B↑ ИП 2 ИП 3
30 PP П 91 02 С/П БП 00

Контрольная сумма ADD 18466

Контрольная сумма XOR 180

Листинг для компьютерного транслятора

        .CHARSET 1251 
         
        ; Файл bin2hex 
        .ORG 0 
         
        A00:     ; с адреса 34 
            M 1 
            M 2 
            CX 
            M 3 
            M 4 
            8 
            M 0 
         
         
        A07:     ; с адреса 24 
            RM 1 
            1 
            0 
            / 
            ENT 
            K INT 
            M 1 
            - 
            F X!=0 A23 
            RM 4 
            2 
            F X^Y 
            RM 3 
            + 
            M 3 
         
         
        A23:     ; с адреса 15 
            K RM 4 
            F L0 A07 
            CX 
            ENT 
            RM 2 
            RM 3 
            PP M 9102    ; Вывод в строку комментариев (Работа с двоичными числами) 
            R/S 
            GOTO A00 
             
        .END

Арифметика - 1 и 2 (152)

Обе программы состоят из одних и тех же четырёх частей (Только вторая версия представляет собой улучшенный вариант первой):
1. "Палочки": При вводе числа, состоящего из единиц ("палочек"), программа считает количество единиц, при вводе числа 1...8 - выводит соотв. число, состоящее из 1...8 единиц.
2. "Повтори число": Требуется просто повторять высвечивающееся на индикаторе число.
3. "Угадай число": Требуется за ограниченное число попыток угадать "загаданное" калькулятором число.
4. "Примеры": Предлагаются примеры: в 1й арифметике - с однозначными числами на сложение, во 2й - с 1...3х значными числами на сложение, умножение, вычитание, деление. Число примеров регулируется пользователем.

Какую часть программы следует запустить, пользователь выбирает с помощью меню. В "Арифметике-1" следует набрать номер нужного варианта, в "Арифметике-2" - выбрать его с помощью клавиш "Вверх" и "Вниз" (кстати, идея такого меню может пригодиться и в других программах).

Подобные идеи уже встречались и в программах на старые ПМК: см., например, книгу "5 вечеров с микрокалькулятором".

В прикреплённых архивах можно взять файлы программ и более подробные описания к ним.

Арифметическая и геометрическая прогрессии (152)

Суть программы.

Программа вычисляет и показывает на экране несколько членов геометрической или арифметической прогрессии, заданной пользователем.

Как работать с программой.

При запуске программы пользователь видит меню из трёх пунктов "Арифметическая прогрессия", "Геометрическая прогрессия" и "?". В уголке можно также увидеть время, отсчитываемое по встроенным часам ЭКВМ.
С помощью клавиш "Вверх", "Вниз" и "Ввод" можно выбрать нужный пункт меню.
1. Если выбрать "?", то на экране появится краткое пояснение о математическом смысле арифметической и геометрической прогрессий. Чтобы вернуться в меню, нажмите "Выход".
ВНИМАНИЕ! Чтобы помощь заработала, не поленитесь загрузить текстовый файл МК, выложенный здесь вместе с программой. Для того этот файл и нужен.
2. Если же выбрать "Арифметический" или "Геометрический" пункт, то можно приступить к вычислениям.
Для этого введите начальное значение а0(или b0) и разность d(или соотв. знаменатель q) в регистры У и Х соответственно, затем нажмите С/П.
После этого в те же регистры нужно ввести верхнюю и нижнюю границу показываемых значений (разница между ними не должна превышать семи). Например, если ввести "0" и "7" в Х и У, программа покажет значения от а0(или b0) до а7(или b7) а если в оба регистра ввести 125 - то она покажет лишь одно число - а125(или b125). Для просмотра результата, конечно, нужно нажать С/П.
Результат выглядит примерно так:

После просмотра результата нажмите "Ввод" для ввода новых данных в ту же подпрограмму либо "Выход" для выхода в основное меню.
Если вместо результата вы увидели "ERROR", значит, вы ввели некорректные границы. С/П - и вводите их повторно.
Также см. программу Арифметическая и геометрическая прогрессии: суммы (152) и запись в моём блоге, относящейся к этапам создания программы и содержащей её более примитивные варианты.

Арифметическая и геометрическая прогрессии: суммы (152)

Программа вычисляет суммы арифметической или геометрической прогрессии для данного числа элементов, данного нулевого элемента и данной разности/знаменателя прогрессии.
В файле mkt - помощь [идентична помощи к программе Арифметическая и геометрическая прогрессии].

Библиотека криптографических программ (CASIO fx-9750GP, cfx-9850GP, fx-9860G, TI-89, TI-92, HP-50G, HP-48GII, TI Nspire (и CAS))

Библиотека этих программ позволяет освоить вычисления в криптографии с открытым ключом. Поддерживаются следующие виды вычислений:
Алгоритм RSA:
- генерация ключей;
- шифрование;
- расшифровка;
- цифровая подпись;
- проверка цифровой подписи.
Алгоритм Эль-Гамаля:
- генерация ключей;
- шифрование;
- расшифровка;
- цифровая подпись;
- проверка цифровой подписи.
Алгоритм Диффи-Хелмана:
- генерация сеансового симметричного ключа.
Взлом шифра основанного на LFSR (регистре сдвига с линейными обратными связями)
Разложение числа на простые множители ро методом Полларда
Разложение числа на простые множители Р-1 методом Полларда
Криптография на эллиптических кривых:
- сложение точек над эллиптической кривой;
- умножение точки на число над эллиптической кривой;
- алгоритм генерации симметричного сеансового ключа над эллиптической кривой;
- цифровая подпись (и проверка подписи) над эллиптической кривой;
- двухключевой шифр над эллиптической кривой.
Разложение числа на простые множители оптимизированным методом перебора.
Возведение целых чисел в степень по модулю.
Деление по модулю целого числа.
Проверка произвольного целого числа на простоту по теореме Ферма (не великой).
Криптографическая система Рабина (один из вариантов реализации)

После загрузки в калькулятор, запустить файл CRYPMAIN, а далее пользоваться подсказками меню. Поскольку в калькуляторе точность составляет 15 десятичных разрядов, то программа в обычных вычислениях работает с целыми числами до 7 разрядов включительно, а с эллиптическими кривыми - до 5 разрядов. В ходе работы используются все 28 регистров памяти, но поскольку их не достаточно, то задействованы ещё первые 30 ячеек списка List6 при вычислениях над эллиптическими кривыми.

В программах, в наиболее критичных местах введена "защита от дурака" в том смысле, что вводимые данные проходят проверку и если не удовлетворяют условиям, то отвергаются и запрашиваются повторно. Например, если надо ввести простое число, а оператор ввёл составное, то калькулятор это обнаружит и будет запрашивать число повторно.

Поскольку в калькуляторе нет кириллицы, то запросы и комментарии на латинице. Возможно словосочетания не самые удачные, но их можно подкорректировать.
Для загрузки разумеется нужен калькулятор с кабелем и программа FA-123, которую можно найти здесь: http://www.alhin.de/cfx9850/inhalte/ru/index.php?n=5

Дополнение 1

Добавлена эта же библиотека, но переписанная под TI89/TI92. Загружается в калькулятор с помощью программы TI Connect. Образуется каталог crypto в который сливаются все файлы. Для запуска программы необходимо перейти в этот каталог и дать с консоли команду crypmain(). Некоторые функции не реализованы, поскольку в TI-бейсике просто есть такие команды.

Дополнение 2

Добавлена конвертированная в формат fx-9860G и русифицированная библиотека криптографических программ. Не русифицирован алгоритм Рабина, поскольку такие криптосистемы оказались не стойкими.

Дополнение 3

В библиотеку для TI89 добавлена программа просмотра больших матриц в программу криптоанализа LFSR, предложенная Vlad_AB. Файл TI89cryp_1.rar

Дополнение 4

Добавлена аналогичная библиотека под HP-50G/HP-48GII. Все файлы собраны в каталог CRYPTO, для начала работы - запустить главное меню - файл MAINCRYPT, а дальше интуиция подскажет :)

Дополнение 5

Библиотека CryptTI92Plus.rar (функционально аналогична TI89cryp_1.rar) адаптирована под другой размер экрана и предназначена для использования на TI-92Plus/TI voyage 200

Изменение 6

Новая версия библиотеки предназначена для использования на TI89/92/Voyage: TI_Crypto.rar В неё встроена новая программа прокрутки матриц от Vlad_AB и модифицирован текст программы криптоанализа регистра сдвига с линейными обратными связями. Дополнения 1, 3, 5 отменены как устаревшие.

Дополнение 7

Аналогичная библиотека написана для TI Nspire и TI Nspire CAS. Работает под ОС версии не ниже 2.0! После загрузки документа запустить программу cryptmain. Далее следовать указаниям меню. Интерфейс получился несколько не удобный по сравнению с, например, TI-89, поскольку в командах бейсика отсутствуют команда выбора из выпадающего меню и команда GetKey. Поэтому сначала всплывает форма где описаны команды вабора, а затем из второй формы калк просит ввести номер пункта меню. Зато считает очень быстро. Если в новых версиях ОС недостающие команды появятся, то можно будет подрихтовать интерфейс.

Кто напишет это же под МК-161?

Возведение комплексного числа в комплексную степень (152)

Идею этой программы подала моя старая переписка, которую недавно решила просмотреть. В ней я ещё год назад возмущалась, что в МК-152 функция X^Y не возводит отрицательные числа в степень. Теперь решено глобально искоренить эту проблему с помощью программы, возводящей комплексное число в комплексную степень.
Алгоритм для программы взят с полезного сайта alglib.sources.ru.

Пользование программой
Запустите программу с адреса 00 (она нечувствительна для переноса на страницы, разве что подсказка запрограммирована выводиться с адреса 0070). Появится подсказка, смысл которой таков:
Если вы хотите возвести число вида a+bi в степень ci+d, то следует ввести а в T, b в Z, c в Y, d в X. Иначе говоря, вводить число и степень следует в формате число - (T+Zi), степень - (Y+Xi).
После ввода нужных значений и С/П можно посмотреть результат в формате Y+Xi. Если снова нажать С/П, не меняя значений П1-П4, программа посчитает следующее значение (в общем случае возведение данного числа в данную степень может иметь несколько значений, в частном, например, при возведении действительного числа, они могут все совпадать). Номер очередного полученного значения находится в регистре П0, в который на адресах 15-17 я для примера занесла значение 5, и содержимое которого каждый раз уменьшается на 1. Можно изменить его, разумеется, в тексте программы, а можно ввести вручную после выполнения программы, когда она остановится с результатом, не меняя только содержимого регистров П1-П4.

Важный недостаток программы
Удивительная в плохом смысле точность. Убедитесь в этом, например, возведя 2 в степень 5 [результат: 32 + i*1,632*10^(-8)]. Или 10+10i в квадрат [результат: -6,3245553202734*10^(-5) хотя действ. часть должна равняться нулю + 200i + i*2,01*10^(-9)]

Неважный недостаток
В процессе выполнения программы есть деление чисел b/a. Поэтому если действ. часть возводимого числа равна нулю, не вводите в регистр Т ноль, а лучше очень маленькое число, например, 10^(-90). Конечно, убрать сей нюанс несложно путём написания отдельное ответвление для случая а=0, но тогда код программы уйдёт за пределы одной страницы, что плохо.

Регистры, задействованные программой:
П0 - номер выводимого результата;
П1-П4 - действ. и мнимые части числа и степени;
П5-П8 - регистры для промежуточных результатов.

Возведение в степень и вычисление дробей по модулю (в конечных полях Галуа) (61, 152)

При изучении современных шифров требуется возводить степень и искать обратные числа в конечных полях. Эти вычисления вручную довольно трудоемки и если возведение в степень по модулю ещё может сделать калькулятор Винды, то деление надо программировать отдельно. Эта программа введенная в РПЗУ МК-52 или МК-152 может быть хорошим подспорьем студенту.

Перед первым запуском нажать [БП] [5] [7]

Деление С = (А / В) mod D
Вводить: [В/О] A [ПП] B [ПП] D [С/П]
Тест: (3 / 18) mod 257 = 43
Результат на экране

Возведение в степень С = (А ^ В) mod D
Вводить: A [ПП] B [ПП] D [С/П]
Ограничение: A, B, D < 10000
Тест: (49 ^ 77) mod 101 = 23
Результат на экране

    0     1     2     3     4     5     6     7     8     9
00  ПА    П5    ПД    Сх    П4    ПС    П9    ИПД   П6    ИП5
10  ИП6   /     К{x}  Fx!=0 41    FBx   K[x]  П8    ИП6   *
20  ИП5   XY    -     П7    ИПС   ИП8   ИП9   ПС    *     +
30  Fx=0  33    1     П9    КИП4  ИП6   П5    ИП7   П6    БП
40  09    ИП4   2     /     K{x}  Fx=0  51    ИПД   ИП9   -
50  П9    ИП9   ИПА   *     ПП    88    С/П   ПА    П5    ПД
60  1     ПС    ИП5   K[x]  Fx!=0 85    2     /     П5    K{x}
70  Fx!=0 78    ИПС   ИПА   *     ПП    88    ПС    ИПА   Fx^2
80  ПП    88    ПА    БП    62    ИПС   БП    56    ПЕ    ИПД
90  /     K[x]  ИПД   *     ИПЕ   XY    -     В/О

Комментарии:
/ - деление
* - умножение
!= - не равно
x^2 - возведение в квадрат

Вроде получилось прикрепить программу для Калькулятор-3000! Спасибо за совет.

http://arbinada.com/pmk/system/files/GF_oper.C3

Возведение в степень и деление по модулю (в полях Галуа), поиск НОД, разложение на множители (SRP-325G)

Сейчас этого калькулятора у меня уже нет, но программы от него остались и может быть кому-либо окажуться полезны.
Для Citizen SRP-325G
-----------------------------------------------------------------------------------------
Возведение в степень по модулю
-----------------------------------------------------------------------------------------
PROGRAM (D=A^BmodC)
Program type – MAIN

PRINT “A^B%C”;SLEEP(2)
INPUT A,B,C
D=1
FOR(E=B/2;E≥.5;E=E/2){IF(Frac(E)>0)THEN{D=DA-INT(DA/C)C}
A=A2-INT(A2/C)C;E=INT(E)}
PRINT D
END

----------------------------------------------------------------------------------------
Деление по модулю
-----------------------------------------------------------------------------------------
PROGRAM (D=(A/B)modC)
Program type – MAIN

PRINT “A/B%C”;SLEEP(2)
INPUT A,B,C
D=1;E=0;G=C;J=B
FOR(I=0;J>0;I++){H=Int(B/G);J=B-HG
IF(I≠0)THEN{F=DH+E;E=D;D=F}
B=G;G=J}
IF(Frac(I/2)≠0)THEN{E=C-E}
D=AE-Int(AE/C)C
PRINT D,” NOD=”,B
END

Примечание: Результат деления имеет смысл, если НОД = 1.
----------------------------------------------------------------------------------------
Поиск наибольшего общего делителя
-----------------------------------------------------------------------------------------
PROGRAM НОД(A,B)
Program type – MAIN

PRINT ”NOD(A,B)”;SLEEP(2)
INPUT A,B
FOR(C=A;C>0;C=A-INT(A/B)B){A=B;B=C}
PRINT “B”
END

---------------------------------------------------------------------------------------
Разложение на множители перебором
---------------------------------------------------------------------------------------
PROGRAM FACTORISATION
Program type – MAIN

PRINT ”FACT A”;SLEEP(1)
INPUT A
C=sqrt(A);D=0
FOR(B=2;B<=C;B++){IF(Frac(A/B)==0)THEN{A=A/B
PRINT B;SLEEP(2)
E[D]=B;D++;B--}}
PRINT A;E[D]=A
END

---------------------------------------------------------------------------------------
Все эти программы одновременно помещаются в память SRP-325G

Вывод графика функции (152)

Программа "График функции y=f(x)"

"Приведенная программа строит график функции одной переменной y=f(x) в декартовых координатах. Программа, при необходимости, может быть модифицирована для вывода графика в полярных координатах, обработки параметрически заданных функций, функций нескольких переменных и т.д."

Инструкции:

"Функция, график которой требуется построить, записывается с адреса 300 как подпрограмма. Аргумент передается в регистре X. Результат f(x) должен возвращается в регистре стека Y. В регистре X должно быть число 1 если точка входит в область определения функции и число 0, если не входит. В подпрограмме для хранения результатов промежуточных расчетов можно использовать регистры из диапазона R0-R9.
К примеру, для вывода графика функции y=sin(x)/x (который осуществлён в приведённом файле mkp) с адреса 300 следует записать подпрограмму: F x≠0; 08; B↑; F sin; ↔; ÷; 1; В/О; 1; B↑; В/О.
С адреса 420 следует разместить сообщение, выводящееся на экран, например, "y=sin(x)/x": 79h, 28h, 78h, 29h, 3Dh, 73h, 69h, 6Eh, 28h, 78h, 29h, 2Fh, 78h. Сообщение следует вводить в режиме "Р ПРГ".
Перед запуском программы в регистры следует занести значения: RA = Xmin, RB = Xmax, RC = Ymin, RD = Ymax. В RE заносится число 0, если график должен состоять из точек и число 1, если требуется соединять точки отрезками. Если используются тригонометрические функции, требуется должным образом установить размерность клавишей "Р-ГРД-Г".
Для выбранной функции укажем: RA = -24; RB = 24; RC = -0,25; RD = 1,2; RE = 1. Размерность - радианы. Если запустить программу, получим на экране изображение, приведенное на фотографии в начале страницы."

Взято с этой страницы сайта НПП "СЕМИКО". Там же можно найти подробный разбор кода этой программы.

Вычисление y^x (HP 16C)

LBL 2
CF 0                ; Prep flag 0 for use.
x == 0              ; X == 0?
SF 0                ; then set flag zero
[1]
F? 0
RTN

RDN                 ; move the 1 out of the way

x > 0               ; +ve power? (we've already handled x == 0)
GTO C

RUP                 ; get that 1
2
DIV
x == 0 
RTN                 ; cos we're in integer mode

CLx                 ; disable lift
[1]
RDN
CHS
RDN
1/X
RUP

LBL C

RUP                 ; return 1 to X
SWAP XY             ; power into X; 1 into Y
STO I               ; power is iterator
RDN                 ; discard power
SWAP XY             ; base into X; 1 into Y
MUL                 ; discard 1; establish X as constant

LBL D               ; start loop
DSZ                 ; decrement power. Done yet?
GTO E               ; no, keep going
RTN                 ; yes, we're done

LBL E               ; product so far is in X
LSTx                ; retrieve base (Y gets running product)
MUL                 ; new product 
GTO D               ; next iteration

Программа для вычисления yx на калькуляторе HP 16C опубликована Cameron на форуме музея HP, 24 Oct 2001.

Гиперболические и обратные им функции (152)

Сервисная программа «Hyp» (КС 33671/101, файл mkp) позволяет использовать в расчётах на МК-152 гиперболические и обратные гиперболические функции, превращая С/П в префиксную клавишу Hyp.

Программа работает с действительными числами (если приходится извлекать корень из отрицательного числа, выдаётся сообщение об ошибке, которое сбрасывается клавишей В/О) и развивает идею «Программы 4.8» (Дьяконов-89, стр. 175). С математической точки зрения добавлено вычисление гиперболического котангенса (cth x) и обратного гиперболического котангенса (arcth x). Сервис программы улучшен, т.к. использует новые возможности МК-152 по опросу клавиатуры и выводу видеосообщений.

Изменения в стеке — обычные для вычисления унарных функций, аргумент можно восстановить по F Вx. Программа использует только десятичные регистры 90-96, то есть регистры R0…RE доступны для использования при вычислениях, как обычно. Переключатель размерности угловых величин Р-ГРД-Г может стоять в любом положении, на вычисление гиперболических функций он не влияет. Третий тест Фролова (1 – arsh arch arth arcth cth th ch sh 1) даёт 1e-11, что довольно неплохо.

Инструкция: ввести аргумент, последовательно нажать «префиксную» клавишу С/П и клавишу соответствующей тригонометрической функции (например 7 для sin, 5 для arccos; для котангенса и арккотангенса используются клавиши «минус» и «плюс»). Перед первым запуском (и в случае появления сообщения об ошибке) следует нажать В/О или перейти на начало программы с помощью P БП, если «Hyp» загружена не с нулевой страницы.

Пример: В/О 1 С/П 7. На экране sh (1) = 1,1752012.

Расчётная часть программы (шаги 02-81) почти не изменилась за прошедшие 18 лет и может использоваться отдельно, как библиотека. В этом случае для вычисления гиперболических функций используются следующие точки входа (сохранность стека не гарантируется, зато регистры не используются вообще):
ПП 02 — sh x = (ex–e–x)/2 — гиперболический синус
ПП 04 — ch x = (ex+e–x)/2 — гиперболический косинус
ПП 06 — th x = sh x / ch x — гиперболический тангенс
ПП 08 — cth x = ch x / sh x — гиперболический котангенс
ПП 10 — arsh x = ln (x+ sqr(x2+1)) — обратный гиперболический синус
ПП 12 — arch x = ln (x+ sqr(x2–1)) — обратный гиперболический косинус
ПП 14 — arth x = ln sqr ((1+x)(1–x)) — обратный гиперболический тангенс
ПП 16 — arcth x = ln sqr ((x+1)/(x–1)) — обратный гиперболический котангенс

Трюк с главным циклом (82-86), позволяющий зациклить многостраничную программу, нам уже знаком по программе «Календарь-2». Блоки сохранения (87-99) и восстановления (159-170) стека в R90-R94 тоже тривиальны. Отмечу лишь, что регистр X1 сохранить не удаётся, а из-за пропускания чисел через регистры стек в новой прошивке «усекается» с 14 разрядов до 12-ти.

В тексте программы есть два небольших блока данных, набираемых в режиме HEX (P ПРГ). Первый (171-179) содержит инвертированные (KNOT) коды восьми задействованных клавиш и завершается нулём, а второй (180-187) — два видеосообщения, для гиперболических и обратных функций. Шаги 100-105 ожидают нажатие клавиши, а блок 106-126 находит её в первом блоке данных. Адрес этого блока высчитывается относительно счётчика адреса и записывается в R96. Значение регистра 96 позже используется в блоке вывода (194-204), что делает программу перемещаемой.

Блок 127-142 вычисляет адрес подпрограммы, которая соответствует нажатой клавише и записывает его в R95. Блок 143-152 с помощью забавной подпрограммы 188-233 выводит в строку комментария название вычисляемой функции. Ну и, наконец, блок 153-158 организует вызов требуемой функции.

Деление с остатком (152)

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

Интерполяция функции для CASIO fx-9750G Plus

Навеяно книгой Меёса. Написал программу интерполяции во время поездки в маршрутке :)

В начале по запросу вводится массив значений функции, взятых через N от 3 до 255 равных интервалов аргумента в виде:
{x0, x1,...,xN-1}
Затем программа запрашивает значение аргумента, любое вещественное в пределах от 0 до (N-1) и выдает результат, после чего запрашивает следующее... Бесконечный цикл в общем.

Программа на первом и последнем интервале выполняет интерполяцию по 3-м точкам, а на всех остальных интервалах - по 5 точкам. Может в будущем доделаю ещё вывод на экран графика интерполируемой функции.

Программа может работать без переделок не только на CASIO fx-9750G Plus, но и на всех более поздних моделях графических калькуляторов (9750GA, 9750GII, 9850G+, 9860G, Algebra FX-2, и т.п.)

Добавил файл конвертированный в формат *.g1m пригодный для загрузки в калькулятор по FA-124 и в эмулятор калькулятора CASIO fx-9860G SD который можно загрузить отсюда http://arbinada.com/pmk/node/522

Использование "электронного блокнота" для хранения текста (152)

С помощью данной программы можно уместить в энергонезависимой памяти МК-152, а точнее, в "электронном блокноте" до 16384*4*4=256 Кб текста и затем читать оттуда книжки.

Алгоритм работы:
Одна запись "блокнота" способна содержать число с 12 знаками в мантиссе (при чём последние из них скрыты). Известно, что одна буква в кодировке МК кодируется трёхзначным числом, следовательно, можно "склеить" 12-значное число из 4х трёхзначных компонентов и закодировать в одном таком числе сразу 4 символа. Таким образом программа берёт текст из памяти текста МК и заносит его в блокнот в виде таких "склеенных" чисел, а потом предоставляет возможность обратно читать оттуда, "дешифруя" эти числа в удобоваримые для вывода символов трёхзначные числа.

Пользование программой:
1. Запись книги

а) Загрузите часть необходимой вам книги в текстовую память через программу передачи данных из ПЭВМ в МК
б) Если вы хотите загрузить большой кусок книги, равный всей области текстовых данных, сотрите команды 0018-0019 и перед началом программы вручную введите в П0 значение 192. Ну, или любое другое число, равное округлённому количеству символов в тексте делить на 16, если вся область текстовых данных не требуется. В приложенном файле для примера в П0 на адресах 0018-0019 автоматически заносится маленькое число 4.
в) Запустите программу с адреса 0000 и очень долго ждите: скорость доступа к памяти "блокнота" не радует.
г) Если всё это проделано, а вы ещё загрузили в "блокнот" не всю вашу книгу, то можно поступить, например, следующим образом:
г1. Загрузить следующую часть книги в память текста;
г2. Запустить программу с 0008-0013 адреса;
и т.д., пока не будет загружена вся книга.
2. Чтение книги.
а) Запустите программу с адреса 0090.
б) Читайте книгу, нажимая клавиши "вверх" и "вниз". После окончания чтения можно в следующий раз запустить программу с адреса 0097, чтобы значение в регистре 9060 не обнулилось и книга не началась сначала. Или можно рассчитать и ввести нужное значение в 9060 и начать с 0097 шага, чтобы сразу читать книгу с нужного места.

Календарь-1 (152)

«Вечный календарь», КС 7104/232
Автор: Вячеслав Алексеев, январь 1987 года
Версия для МК-152: Илья Васильев, 20 ноября 2007 года

00.В↑   01.K [x] 02.П5   03.-    04.ВП   05.2    06.K [x] 07.П4    08.FВx   09.K{x}
10.ВП   11.4     12.П3   13.ИПB  14.-    15.Fx≥0 16.18    17.KИП5  18.ИП4   19.3
20.-    21.Fx<0  22.27   23.KИП3 24.ИП4  25.9    26.+     27.1     28.3     29.x
30.2    31.+     32.5    33.%    34.K[x] 35.5    36.ИП3   37.x     38.4     39.%
40.K[x] 41.+     42.ИП5  43.+    44.В↑   45.В↑   46.7     47.П0    48.%     49.K[x]
50.7    51.x     52.-    53.Fx=0 54.56   55.7    56.П8    57.3     58.F10x  59.ПE
60.П6   61.+     62.П9   63.1    64.0    65.KПE  66.4     67.5     68.KП6   69.FL0
70.68   71.Cx    72.KП6  73.8    74.6    75.ИП8  76.+     77.КИПРГ 78.KП9   79.ИПE
80.PPП  81.90    82.27   83.ИП8  84.С/П  85.БП   86.00    87.8F    88.82    89.91
90.97   91.8F    92.91   93.82

Исходные значения: год принятия нового стиля (1918) ПB
Инструкция: дд.ммгггг В/О С/П «день недели»

Программа по-прежнему состоит из трёх частей. Первую — расфасовку даты по регистрам
(адреса 00—12) удалось сделать короче, т.к. в МК-152 было наконец-таки доведено до
ума и документировано использование ВП для умножения на степени десятки. Счётная
часть (13—56) основана на всё той же формуле Даффета-Смита и немного удлинилась,
т.к. я закодировал счётный и поправочный коэффициенты прямо в текст программы (27—33).
Кстати, так было и в исходной программе Трохименко-Любича, которую взял за основу
В. Алексеев. Третья часть, формирование календарного видеосообщения, на каждом
микрокалькуляторе традиционно своя.

Новый вариант формирования итогового видеосообщения получился ближе к Б3-34: вначале
в байтовые регистры 1000—1008 засылается перевод строки, знаки «–» и ноль, символ
окончания строки (адреса 47, 57—60, 63—72). Код символа, обозначающего день недели,
считывается с адресов 87—93 новой командой КИПРГ и вписывается в соответствующий
регистр (61—62, 73—78). После чего наша любимая функция R9027 выводит результат
в строку комментария. Забавно, что результат больше напоминает видеосообщение МК-61.

После ввода программы запишем в регистр B год замены старого стиля на новый (1918 ПB).
Порядок работы чуть проще прежнего: набираем число и через запятую шесть цифр — месяц
и год (например 9 мая 1945 года соответствует 9,051945). Нажимаем В/О С/П, в строке
комментария появляется «3» и видеосообщение «––С––––» (среда). Проверим остальные
тестовые примеры:

«Календарь-1», КС 26272/80
Улучшенная версия для МК-152: Илья Васильев, 20 ноября 2007 года

 00.Fx=0  01.29  02.9     03.0    04.5     05.5    06.П6    07.КИП6 08.П5   09.П7
 10.КИП6  11.П4  12.КИП6  13.2    14.ВП    15.3    16.+     17.ПП   18.83   19.КП6
 20.БП    21.44  22.8F    23.82   24.91    25.97   26.8F    27.91   28.82   29.В↑
 30.K[x]  31.П5  32.П7    33.-    34.ВП    35.2    36.K [x] 37.П4   38.FВx  39.K{x}
 40.ВП    41.4   42.ПП    43.83   44.3     45.F10x 46.ПE    47.П6   48.+    49.П9
 50.7     51.П0  52.1     53.0    54.KПE   55.4    56.5     57.KП6  58.FL0  59.57
 60.Cx    61.KП6 62.2     63.1    64.ИП8   65.+    66.КИПРГ 67.KП9  68.ИПE  69.PPП
 70.90    71.27  72.ИП4   73.ВП   74.2     75./-/  76.ИП7   77.+    78.ИП2  79.ИП8
 80.С/П   81.БП  82.00    83.П2   84.П3    85.ИПB  86.-     87.Fx≥0 88.90   89.KИП5
 90.ИП4   91.3   92.-     93.Fx<0 94.99    95.KИП3 96.ИП4   97.9    98.+    99.1
100.3    101.x  102.2    103.+   104.5    105.%   106.K[x] 107.5   108.ИП3 109.x
110.4    111.%  112.K[x] 113.+   114.ИП5  115.+   116.В↑   117.В↑  118.7   119.%
120.K[x] 121.7  122.x    123.-   124.Fx=0 125.27  126.7    127.П8  128.В/О 

Исходные значения: год принятия нового стиля (1918) ПB
Инструкция: дд.ммгггг В/О С/П «день недели»; Cx В/О С/П «какой сегодня день»

Управление программой «Календарь-1» (КС 26272/80) не отличается от предыдущей, разве
что в стек выводится чуть больше информации. Но теперь, если на вход программы
подать 0, то она прочтёт в календаре дату и не только высветит текущий день недели,
но ещё и запишет его в регистр R9059. Т.к. МК-152 лишь обновляет этот регистр (но сама
не вычисляет его), у программы появляется важный практический смысл.

Новая программа хороша ещё тем, что счётная часть выделена в подпрограмму с адресами
83—128. Этот алгоритм можно использовать в других программах или совершенствовать.
Ведь в существующем виде календарь годен лишь до принятия Петром Первым юлианского
летоисчисления (до 1700 года), а для европейской истории — практически до начала
нашей эры.

Календарь-2 (152)

«Календарь-2» (КС 16437/175) — очень практичная программа, т.к. в отличии от своих предшественников позволяет не только любоваться датами, но и устанавливать её на календаре, встроенном в МК-152. Для использования этой новой возможности достаточно набрать сегодняшнюю дату (например 24,112007) и нажать кнопку /—/ перед запуском программы (В/О С/П). Остальные тестовые примеры такие же, как для предыдущей программы (включая Cx В/О С/П для получения текущей даты). Не забудьте поместить в регистр B год перехода на новый стиль (1918 ПB).

 00.ПП    01.12    02.С/П   03.БП     04.00    05.8f    06.82   07.91    08.97    09.8f
 10.91    11.82    12.9     13.0      14.5     15.5     16.П6   17.Cx    18.2     19.ВП
 20.3     21.ПA    22.FO    23.Fx=0   24.75    25.КИП6  26.П5   27.П7    28.КИП6  29.П4
 30.КИП6  31.ИПA   32.+     33.П2     34.ПП    35.D8    36.КП6  37.БП    38.A2    39.Kmax
 40.FO    41.K[x]  42.1     43.Kmax   44.XY    45.FO    46.В/О  47.K{x}  48.ВП    49.2
 50.FВх   51.3     52.1     53.ПП     54.39    55.П5    56.П7   57.XY    58.K{x}  59.ВП
 60.4     61.П2    62.FВх   63.1      64.2     65.ПП    66.39   67.П4    68.В/О   69.ПП
 70.47    71.ПП    72.D8    73.БП     74.A2    75.Fx<0  76.69   77./-/   78.ПП    79.47
 80.ИП2   81.ИПA   82.Kmax  83.2      84.0     85.9     86.9    87.Kmax  88.XY    89.П2
 90.ПП    91.D8    92.ИП7   93.КП6    94.ИП4   95.КП6   96.ИП2  97.ИПA   98.-     99.КП6
100.ИП8  101.КП6  102.3    103.F10x  104.ПE   105.П6   106.+   107.П9   108.7    109.П0
110.1    111.0    112.КПE  113.4     114.5    115.КП6  116.FL0 117.15   118.Cx   119.КП6
120.4    121.ИП8  122.+    123.КИПРГ 124.КП9  125.ИПE  126.PPП 127.90   128.27   129.ИП4
130.ВП   131.2    132./-/  133.ИП7   134.+    135.ИП2  136.ИП8 137.В/О  138.ИП2  139.П3
140.ИПB  141.-    142.Fx≥0 143.45    144.KИП5 145.ИП4  146.3   147.-    148.Fx<0 149.54
150.KИП3 151.ИП4  152.9    153.+     154.1    155.3    156.x   157.2    158.+    159.5
160.%    161.K[x] 162.5    163.ИП3   164.x    165.4    166.%   167.K[x] 168.+    169.ИП5
170.+    171.В↑   172.В↑   173.7     174.%    175.K[x] 176.7   177.x    178.-    179.Fx=0
180.82   181.7    182.П8   183.В/О

Программа использует шестнадцатеричные адреса переходов — особенность, использовать которую не советует руководство по эксплуатации. Это (и невинный трюк с использованием В/О на шаге 137 для возврата со второй странички) позволяет сделать программу «Календарь-2» перемещаемой, достаточно на шаге 120 разместить, скажем, ИПC. А в регистр C занести адрес массива первых букв дней недели (шаги 05—11) минус один. Если загружать с нулевой странички, то он равен 4, а если загружать с 4-й — 404.

Основной цикл расположен по шагам 00—04. Шаги 12—22 инициализируют используемые регистры. Три режима работы программы (узнать текущую дату, узнать день недели и установить текущую дату) обрабатываются в ветвях 23—38, 69—74 и 75—101. Подпрограмма 39—46 осуществляет грубую проверку "на дурака": 30 февраля она не отсечёт, но и 14-й месяц не допустит. С помощью неё подпрограмма 47-68 расфасовывает по регистрам введённую в компактном формате дату.

Подпрограмма 102—137 взята из «Календаря-1» и занимается красивым выводом даты. Расчётный блок 138—183 вам тоже уже должен быть знаком, он мало изменился за прошедшие 20 лет.

Лунолёт 3 для CASIO CFX-9850G, fx-9860G, fx-7400G+(с усовершенствованной математикой)

Добавил новый режим полёта (5-й), в котором модель движения ещё более точная. Новая версия называется LUNOLET3.rar

Обновил версию Лунолёта 3. Предлагается 5 вариантов:
1 - классический, как у Пухова;
2 - модель с переменным ускорением реактивного движения (рывком);
3 - переменное ускорение реактивного движения вычисляется по точной формуле Циолковского;
4 - в модель 3 добавлено деление времени маневра на отрезки с целью более точно учесть остальные параметры полёта, типа ускорение Кориолиса и т.п. До 2-х секунд - 1 отрезок, до 4 - 2, до 8 - 3, до 16 - 4, ... до 256 - 8 , ... Теперь лучше рассчитывается и полёт с выключенным двигателем и полёт на участке разгона - торможения.
5 - дополнительно к режиму 4 добавлен расчёт "рывка" для кориолиса и для гравитационно-центробежной равнодействующей

Программа:
Просмотреть её можно с помощью графической оболочки под названием FA123

А при наличии кабеля FA-123 (который не сложно сделать самому) можно загрузить из ПК в калькулятор этой же оболочкой.
LUNOLET3 - главная программа
PRN LUN3 - подпрограмма вывода результатов на экран
SUB LUN3 - подпрограмма расчёта параметров полёта оригинальная (алгоритм от Пухова)
SUB LUNA - подпрограмма по первому варианту уточнённого алгоритма (с фиксированным приращением реактивного ускорения - "рывком")
SUB LUNB - подпрограмма с точным алгоритмом ускорения реактивного движения
SUB LUNС - подпрограмма с точным алгоритмом ускорения реактивного движения и делением времени маневра на части.
SUB LUND - подпрограмма с точным алгоритмом ускорения реактивного движения и делением времени маневра на части, при этом на каждом элементарном отрезке времени для учёта изменения гравитационно-центробежного и кориолисова ускорений вычисляется "рывок", что значительно повысило точность модели полёта не только на участке разгона/торможения, но и на баллистическом участке.

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

Проверенная мною схема кабеля (вместо FA-123) описана здесь: http://www.alhin.de/cfx9850/inhalte/ru/index.php?n=6

Добавил вариант Лунолёта 3, но с упрощённым последовательным выводом данных на экран для калькулятора для CASIO fx-7400G Plus. Называется 7400LUN3. Дополнительно после приземления вычисляется расстояние в метрах от места старта до места посадки. Если перелёт, то положительное, если недолёт, то отрицательное. Также уточнил значение ускорения свободного падения для Луны во всех вариантах кроме первого. g=1.62536 [м / c2]

Матричный поиск путей между заданными узлами (CASIO fx-9750G Plus)

Программа матричным методом разыскивает все пути на не взвешенном направленном графе ведущие из исходящего узла во входящий. В начале программа в режиме диалога просит ввести все переходы между узлами сети (строит матрицу переходов графа). Когда все переходы заданы можно перейти к поиску решения. Программа сначала выводит матрицу переходов для контроля правильности заполнения, а затем запрашивает исходящий и входящий узел графа. После этого выполняется поиск решения, который также выводится в виде матрицы. Первый столбец соответствует исходному состоянию, а каждый следующий отделён от предыдущего одним переходом. Когда путь доходит до входящего узла, то он прерывается. Максимальное число переходов равно числу узлов. Если в матрице результатов через ячейку проходит 1 путь, то в ячейке цифра 1, если 2 пути, то 2 и т.д.

Определение процентного вклада величин в общую сумму (34, 61, 152)

Предположим, что у нас имеется ряд чисел, и требуется найти, какую часть составляет каждое в процентах от общей суммы. Приведенная программа разработана московским инженером А.Б. Бойко и была опубликована в [1] и в одном из номеров журнала "Наука и Жизнь".
Такие задачи встречаются довольно часто. Например, какую долю внёс каждый школьник в собранную всем классом макулатуру? Какова частота встречаемости различных букв в тексте или кодов в шифровке? Какой процент голосов имеет участник акционерного общества?

 	x0	x1	x2	x3	x4	x5	x6	x7	x8	x9

0x	Cx	ПD	ПС	ИПD	С/П	В↑	Fπ	-	Fx≠0	25
1x	↔	KПD	ИПС	+	ПС	1	1	ИПD	1	+
2x	ПD	-	F√	БП	03	ИПС	2	F 10x	÷	ПС
3x	ИПD	1	-	ПD	КИПD	ИПС	КПD	ИПD	Fx=0	30
4x	Fπ	С/П

Для работы с программой следует нажать "В/О", "С/П". После этого ввести очередное число и нажать клавишу "С/П". Количество введённых чисел выводится в RX перед вводом очередного числа. Для окончания ввода следует набрать число "πи": Fπ, С/П. После окончания расчёта на индикатор также выводится это число. Процентный вклад чисел находится в регистрах от R0 до RC.

В связи с ограниченным числом регистров памяти в микрокалькуляторах МК-61, МК-52 (далее - ПМК), для которых была разработана приведенная программа, обработать в ней можно не более 11 чисел. Хотя для решения большинства практических задач и этого достаточно.

В адресах 00-04 происходит очистка регистров RC и RD и вывод счетчика в RX. В адресах 05-09 введённое число сравнивается с π. В случае равенства происходит переход к адресу 25. В 10-14 введенное число косвенно через счётчик RD заносится в регистр памяти от R0 до RB. Сумма введённых чисел накапливается в RC. В 15-24 происходит увеличение счётчика на единицу и сравнение его с числом 11. В случае превышения допустимого количества введённых чисел возникает ошибка при вычислении квадратного корня от отрицательного значения. Иначе программа переходит к адресу 03 для ввода очередного числа. В адресах 25-29 накопленная сумма делится на 100 для получения долей в процентах. В 30-39 происходит пересчет содержимого регистров в доли. Цикл организован при помощи уменьшения счётчика на единицу и последующего сравнения с нулём. В 40-41 вывод числа π и останов.

Эта программа будет корректно исполняться на ПМК и в большинстве случаев на МК-152 (далее - ЭВМ). Но при вводе двенадцатого числа, не равного "пи", на ЭВМ программа будет работать не так, как задумал автор.

В программе для обработки этой ситуации использована особенность работы ПМК. После аварийного останова в результате выполнения некорректной операции выполнение программы продолжается не с того места, в котором она была остановлена. Один шаг программы пропускается. Поэтому в ПМК после вывода сообщения "ERROR" по адресу 22 исполнение будет продолжено с адреса 24. При этом в стек заносится число 3 (код этой команды 03h соответствует адресу перехода). Это число не влияет на выполнение дальнейшей части программы по адресам 25-41.

В ЭВМ программа продолжает выполнение со следующей команды без каких-либо пропусков. Что, вообще говоря, гораздо правильнее. Но это приведёт к тому, что в программе переход на адрес 03 будет выполнен в любом случае и счетчик в регистре RD будет увеличен на единицу. В дальнейшем это вызовет ошибки, независимо от того, будет ввод чисел продолжен далее или завершён. Для устранения различия с ПМК на ЭВМ после останова с выдачей сообщения "ERROR" следует нажать клавишу "ШГ вправо". Это вызовет пропуск одного шага программы, что и требуется.

К таким эффектам, к сожалению, может привести использование в программе недокументированных возможностей в погоне за избыточной оптимизацией. Вполне уместное решение в программе ПМК, которое делает эту программу короткой, красивой и лаконичной, вызвает проблемы при переносе на другую совместимую модель.
Перепишем программу так, чтобы ошибок при выполнении на ЭВМ не возникало. Воспользуемся наличием большого количества регистров памяти для расширения возможностей программы. Увеличим максимальное количество обрабатываемых чисел до 47. Для окончания ввода вместо числа π будем использовать отрицательное значение. Заодно будет запрещён ввод отрицательных чисел, что в рассмотренной программе не предусмотрено.

 	x0	x1	x2	x3	x4	x5	x6	x7	x8	x9

0x	1	П0	Сх	РП	99	Cx	B↑	B↑	ИП0	С/П
1x	F≥0	28	РКП	00	РИП	99	+	РП	99	ИП0
2x	1	+	П0	4	8	-	F≥0	05	КИП0	ИП0
3x	Fx≠0	05	РП	98	РИП	99	2	F10x	÷	РП
4x	99	РКИП	00	РИП	99	÷	ПП	77	↔	РКП
5x	50	КИП0	ИП0	Fx=0	41	1	П0	ПП	77	Cx
6x	ИП0	РКИП	00	РКИП	50	С/П	ИП0	1	+	П0
7x	РИП	98	-	Fx≥0	57	БП	00	ИП0	5	0
8x	+	РП	50

Для работы с программой следует нажать клавиши "В/О", "С/П". После этого поочерёдно вводить числа и нажимать клавишу "С/П". Номер вводимого числа выводится в RX. После ввода сорок седьмого по счёту или отрицательного числа происходит расчёт долей. После расчёта на каждое нажатие "С/П" на индикатор выводится: в RZ - номер числа, в RY - введённое значение и в RX - доля в процентах. Можно и не пролистывать всю память, а считать нужные значения прямо из регистров, что более удобно делать в режиме просмотра из главного меню ЭВМ.

Для накопления суммы используются регистр памяти R99. Регистр R0 выполняет роль счетчика. В регистрах R1-R47 сохраняются введённые значения. В R51-R97 вычисленные значения долей в процентах. Регистры R50 и R98 служат для временного хранения значений счетчика.
Программа получилась вдвое большего размера, но для ЭВМ это большого значения не имеет. В адресах 00-09 происходит инициализация начальных значений и вывод на индикатор номера очередного вводимого числа. Команды 10-11 требуются для проверки ввода отрицательного значения. В адресах 12-27 происходит косвенная запись в регистры R1-R47, подсчёт суммы в R99 и проверка на превышение допустимого количества введённых чисел. В 28-31 происходит проверка ввода хотя бы одного числа. В 32-40 проводится подготовка к расчёту долей. В 41-54 организован цикл в котором искомые доли вычисляются и записываются в регистры R51-R97. В адресах 55-76 происходит циклический вывод на индикатор сохранённых и расчитанных величин. Расчёт и вывод организованы в разных циклах для того, чтобы можно было не пролистывать все вычисленные значения долей, а считать их непосредственно из регистров. Кроме того, командами "БП 55", "С/П" вывод можно повторить заново. В 77-83 расположена подпрограмма, которая помещает в R50 для последующего косвенного обращения значение R0+50.
Команды "РП ММ", "РИП ММ", "РКП ММ" и "РКИП ММ" выполняют прямую и косвенную запись и чтение из регистров памяти от R0 до R99. Команда "КИП0" по адресу 28 используется в программе для вычитания единицы из R0. Команда "РКИП 00" не уменьшает содержимое регистра R0 на единицу. В остальном действие этих команд аналогично.
Эта возможность ЭВМ напоминает использование недокументированных команд "КП↑" и "КИП↑" калькулятора Б3-34, которые обращались косвенно через R0 без вычитания из него единицы. Они были утрачены в моделях МК-61 и МК-52 с появлением пятнадцатого регистра памяти RE.
Изменение назначения команд с кодами 4Eh и 6Eh вызвало в своё время необходимость адаптирования некоторых программ калькулятора Б3-34 к модели МК-61. Один из возможных способов, это замена упомянутых команд на последовательность "ИП0", "ПЕ", "FO", "КИПЕ" (или "КПЕ"), что занимает четыре шага программы и уничтожает содержимое регистров стека RT и RX1.
Перенести в ЭВМ программу Б3-34 с командами "КП↑" и "КИП↑" несколько проще. Для этого достаточно использовать команды "РКП 00" и "РКИП 00", которые занимают всего два шага и ничего лишнего не изменяют.

В этой программе нетрудно увеличить количество чисел примерно до пяти сотен, а с использованием электронного блокнота ЭВМ и до десятков тысяч. Но на практике такие задачи встречаются достаточно редко и обрабатывать такие объемы информации имеет смысл при помощи компьютера, для этого он и предназначен.

Источник: http://mk.semico.ru/dr_info5.htm

Падающие линии. Падающие точки (152)

ПАДАЮЩИЕ ЛИНИИ

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

	0	1	2	3	4	5	6	7	8	9
0	Сх	РР П	90	10	К  СЧ	1	2	9	х	К[x]
1	П  0	Сх	П  1	1	0	РР П	90	50	КГРФ	ИП 1
2	ИП  0	РР П	90	11	РРИП	90	50	F x=0	18	ИП  1
3	1	+	П  1	6	5	-	F x=0	18	БП	04

Алгоритм её чрезвычайно прост:
0-3 – очищаем графический экран
4-12 – делаем СЧ и заносим его в П0 (там будет храниться координата х), заносим 0 в П1 (там будет храниться координата у)
13-17 – запускаем таймер [если вместо 10 в адресах 14-15 ввести другое число, скорость прорисовки линий изменится]
18-23 – рисуем точку на графическом экране
24-28 – смотрим, не истекло ли заданное в таймере время, если нет – рисуем точку ещё раз, перейдя назад на адрес 18. Это бесполезное действие повторяется, пока не истечёт время таймера. Когда при очередной проверке оказывается, что время истекло, идём дальше.
29-39 – прибавляем 1 к координате у и проверяем, не достигнута ли точка (х;65). Если нет, рисуем новую точку с новой координатой (шаг 18), если да, возвращаемся к изготовлению случайного числа, чтобы начать новую линию (шаг 4).

***

ПАДАЮЩИЕ ТОЧКИ

Слегка усовершенствованный вариант первой программы – вместо линий выводятся «падающие» точки, координата х которых также случайна.

	0	1	2	3	4	5	6	7	8	9
0	Сх	РР П	90	10	3	РР П	90	01	К  СЧ	1
1	2	9	х	К[x]	П  0	Сх	П  1	ПП	50	КГРФ
2	0	1	РР П	90	50	РРИП	90	50	F x=0	25
3	ПП 	50	ИП  1	1	+	П  1	6	5	-	F x≠0
4	08	ПП	50	БП	19					
5	ИП  1	ИП  0	РР П	90	11	В/0

0-3 – очистка экрана
4-7 – устанавливаем атрибуты вывода так, чтобы дважды выведенная на одно и то же место экрана тёмная точка давала светлую точку.
8-16 – аналогично адресам 4-12 предыдущей программы
17-19 – вызов подпрограммы
20-29 – работа с таймером, аналог которой - в предыдущей программе.
30-44 – вызов подпрограммы, прибавление 1 к П1, проверка, не достигло ли П1 величины 65, если да, переходим к изготовлению СЧ, нет – рисуем тёмную точку с новой координатой П1 и переходим на шаг 19.
50-55 – подпрограмма, рисующая тёмную точку с координатами П0,П1.

Перевод десятичных чисел в двоичную и шестнадцатеричную формы (61, 152)

Поиски кратчайшей программы по переводу десятичного числа в шестнадцатеричную форму были начаты нашим другом AtH. Для затравки был предложен первый вариант программы на 67 шагов с использованием регистров памяти, которую автор предлагает использовать за основу и сократить. Вывод символов в МК-152, в отличие от старых моделей, осуществляется простым способом.

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

Перевод из десятичного в двоичное

В связи с отсутствием МК-152 эксперимент проводим на эмуляторе МК-61/52.

00.В^  01.0  02.ХУ 03.1    04.ХУ  05.2   06./   07.К[x] 08.FBx 09.К{х}  
10.Кзн 11.ХУ 12.FО 13.ХУ   14.х   15.FBx 16.ВП  17.1    18.FО  19.+
20.В^  21.FО 22.FО 23.Fx=0 24.05  25.FО  26.FО  27.С/П 

Инструкция: ввод десятичного числа в РХ, В/0, С/П - на экране его двоичное представление. Стек используется полностью, то есть вся информация в стеке после выполнения будет потеряна. В связи с ограничениями разрядности индикатора (8 позиций), корректно отобразить можно только числа в диапазоне 0..255.

Например, 234, В/0, С/П дает

11101010

Вывод на индикатор МК-152 должен быть гораздо удобнее, программа сократится, т.к. не понадобится умножать на степень 10 для сдвига разрядов влево (в сторону старших).

Перевод из десятичного в шестнадцатеричное

В МК-152 есть возможность выводить строки символов из памяти данных (регистров с адресами адреса от 1000 до 8167, подробнее см. инструкцию). Идея состит в наполнении регистров с 1000 по 1007 байтами, содержащими ASCII-код шестнадцатеричного символа, а в конце вывести эту строку на экран.

К сожалению, следующий простой алгоритм получения остатка от деления для двух чисел n1 и n2 не работает если разрядность n1 приближается к максимальной (8 разрядов).

n1 B^ n2 : K[x] FBx K{x} n2 * K[x]

Например, остаток деления 99999999 на 16 будет не 15, а 14, при отбрасывании дробной части от 14,5. Поэтому придется честно умножать делитель на целую часть от остатка и вычитать из делимого.

00.П2  01.1   02.0   03.0   04.9   05.ПО   06.Сx  07.ПП  08.45   09.ИП2 
10.ИП2 11.1   12.6   13.П1  14.:   15.K[x] 16.П2  17.ИП1 18.х    19.-    
20.ПП  21.35  22.ИП2 23.ИП1 24.-   25.Fx<0 26.09  27.ИП2 28.ПП   29.35    
30.ИП0 31.РРП 32.90  33.27  34.С/П 35.1    36.0   37.-   38.Fx≥0 39.42
40.7   41.+   42.5   43.8   44.+   45.КП0  46.В/0

Программа использует стек и регистры Р0, Р1 и Р2.

Инструкции: вводим десятичное число, В/0, С/П, на экран в строку выводится шестнадцатеричное представление.

Второй вариант был предложен AtH, программа использует цикл вместо блока сравнения остатка с делителем (16) по шагам 22-29. Прежняя проблема с целочисленным делением на МК-152 отсутствует, то есть для 99999999 остаток получится 15,00032.

Вот вариант AtH (завершающий БП 00 не является обязательным по условиям, тем более, в качестве подпрограммы, поэтому я убрал его в обоих вариантах.).

00.П1  01.7    02.П0   03.3   04.F10x 05.+     06.П3  07.1   08.6    09.П2
10.Сх  11.КП3  12.ИП1  13.ИП2 14./    15.К[x]  16.П1  17.FBx 18.K{x} 19.ИП2
20.х   21.K[x] 22.1    23.0   24.-    25.Fx≥0  26.29  27.7   28.+    29.5
30.8   31.+    32.КП3  33.FL0 34.12   35.ИП3   36.1   37.+   38.РРП  39.90
40.27  41.С/П

Попробуем сократить код. Цифру 7 заменяем на 8, в противном случае, максимальным выводимым числом будет не 99999999, а 16777215 (преобразуется в FFFFFF). Далее, заменим блок 03-06 более коротким, а 07-09 безболезненно перенесем по месту первого использования делителя на адрес 13.

Команду 32.КПЗ можно убрать, а цикл замкнуть на шаг 06. Тогда не понадобятся и шаги 35-37 (правда, в этом случае числа больше 99999999 обрабатываться не будут). Это сокращение предложил AtH в ходе рассмотрения промежуточных вариантов.

Также заметим, что алгоритм получения остатка из самой первой версии программы короче используемого на 1 шаг. Его мы и вставим, получая 35 шагов и 4 регистра памяти.

00.П1  01.8    02.П0   03.Fex 04.П3  05.Сх   06.КП3 07.ИП1 08.ИП1  09.1
10.6   11.:    12.К[x] 13.П1  14.1   15.6    16.х   17.-   18.1    19.0
20.-   21.Fx≥0 22.25   23.7   24.+   25.5    26.8   27.+   28.FL0  29.06
30.ИП3 31.РРП  32.90   33.27  34.С/П

Дальнейшие возможные пути сокращений.

Существует также альтернативный вариант блока 18-27. К сожалению, он имеет ту же длину, что и применяемый.
18.8 19.- 20.П2 21.6 22.3 23.+ 24.FL2 25.28 26.7 27.-

Можно ли заменить этот блок функцией? Пока мне это не удалось. Например, следующая апроксимация занимает на 1 шаг больше (11 шагов вместо 10).
18.В1 19.ВП 20.1 21./-/ 22.К[x] 23.7 24.х 25.+ 26.4 27.8 28.+

Посадка на Луну с HP-12C

Оригинальная программа для HP-25 была написана и опубликована в журнале «HP-25 Applications Programs» в 1975 году. После выпуска в 1981 году популярнейшей по сей день модели финансового ПМК HP-12C игру быстро адаптировали и для него. Несовместимость заключалась в том, что HP-12C не имеет операций сравнения типа x<0 и x<y, вместо которых используется x<=y или x<>y.

Сценарий игры прост. Наш лунолет находится в точке на заданной высоте, он вертикально снижается с начальной скоростью, имея запас топлива. Расход топлива в 5 кг позволяет компенсировать тяготение. Соответственно, чтобы затормозить, нужно расходовать больше. Необходимо приземлиться с приемлемой скоростью, например -5 м/сек.

Вводим текст программы.

Шаг  Код команды   Команда                  Комменарий
01      42 4            f 4             4 digit display
02      45 0            RCL 0          
03      26              EEX            
04      4               4              
05      10              /               Divide X by 10000
06      45 1            RCL 1          
07      0               0              
08      43 34           g x<=y          If 0<=V?
09      43,33 14        g GTO 14        -->     V positive or zero
10      33              R dn            V negative
11      34              x<>y            Add V and -X
12      30              -              
13      43,33 16        g GTO 16        -->    
14      33              R dn            Add V and X
15      40              +              
16      31              R/S             Display V.X and get burn
17      45 2            RCL 2           Fuel
18      34              x<>y           
19      43 34           g x<=y          If Burn<=Fuel?
20      43,33 22        g GTO 22        -->     Yes, so OK
21      43,33 42        g GTO 42        -->     No, so prepare for crash
22      44,30 2         STO - 2         Subtract burn from fuel
23      5               5              
24      30              -              
25      44 3            STO 3           Acceleration is burn-5
26      2               2              
27      10              /              
28      45 0            RCL 0          
29      40              +              
30      45 1            RCL 1          
31      40              +              
32      44 0            STO 0           Altitude X=X+V+A/2
33      0               0              
34      43 34           g x<=y          If 0<=Altitude?
35      43,33 37        g GTO 37        -->     Yes, so OK
36      43,33 53        g GTO 53        -->     No, so crash
37      45 3            RCL 3          
38      44,40 1         STO + 1         V=V+A
39      45 2            RCL 2           Display fuel remaining
40      43 31           g PSE          
41      43,33 02        g GTO 02        -->     Return to display V.X
42      45 1            RCL 1           Show crash
43      36              ENTER          
44      20              *              
45      45 0            RCL 0          
46      1               1              
47      0               0              
48      20              *              
49      40              +              
50      43 21           g SQR           V=Sqrt(V*V+2gX)
51      16              CHS             Show crash as down
52      44 1            STO 1           V
53      45 1            RCL 1           Jump here if hit ground
54      42 0            f 0            
55      43,33 0         g GTO 00        -->     Stop

Теперь вводим начальные данные:

Нажимаем R/S, на экране число: целая часть показывает скорость, дробная – высоту. В регистре 2 находится текущий запас топлива.

Начинаем торможение. Вводим расход 5 кг чтобы не ускорять падение. 5 R/S - на секунду экран показывает 115 – это запас топлива, затем новые данные телеметрии: -50,0450. Высота 450, скорость -50. Дальше протокол в виде "расход топлива : результат".
5 : -50,0400
5 : -50,0350
5 : -50,0300
10 : -45,0253
5 : -45,0208
5 : -45,0163
5 : -45,0118
10 : -40,0075
10 : -35,0038
Резко тормозим...
25 : -15,0038
Смотрим STO 2: осталось всего 30 кг топлива!
20 : 0,0005
Мы зависли в 5 метрах от Луны!
3 : -2,0004
3 : -4,0001
Осталось 4 кг, используем их все: 4 R/S
-4

Посадка со скоростью -4 м/с. Для первого раза неплохо, но можно и лучше. Не сомневаюсь, что опытным пилотам «Лунолета-1» или тем более динамического орбитального "Лунолет-3" не составит труда прилуниться с почти нулевой скоростью.

Мягкой посадки!

Приложение для любопытных

Несколько фото ПМК HP-12C, из которых видна его специализация на финансово-статистические расчеты. Например, отсутствует тригонометрия, но есть такие операции, как умножение или деление на 12 :)

Стандартный набор: маленькое печатное руководство, все остальное - на прилагаемом диске. Очень приятные клавиши.

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

Две стандартные батарейки и "шпаргалка" по некоторым функциям. ПМК бережливый, если в течение минуты-двух не касаться клавиш, дисплей отключается. Программа и данные, конечно, сохраняются.

Преобразование десятичной дроби в рациональную (HP).

Тексты программ для HP-28S, HP-42S и HP-41C выложены на сайте. Ниже приводится RPL-код программы 'Fract' для 28S, написанной Thomas Affinito & Jurjen E. Bos и адаптированной Xose. Фактически это исходный код команды →Q более развитых калькуляторов. Взят из архивов музея HP, не проверялся.

%decimal_number -> 'fraction' (with default precision)

%decimal_number %precission -> 'fraction'

('fraction' is EVALuable to the original number, the '6' in the first row of code is the default precission)
«
  IF DUP FP THEN 6 END
  NEG ALOG 2 / 1 0 4 ROLL DUP ABS 5 ROLLD SIGN
  -> X P A B S
  «
   X ABS
   WHILE 'ABS(FLOOR(X*A+.5)-X*A)>=P*A'
     EVAL
     REPEAT INV DUP IP ABS A * B + A 'B' STO 'A' STO FP
   END
   DROP 'FLOOR(X*A+.5)' EVAL S * A
  »
  "'" ROT ->STR + "/" + SWAP ->STR + "'" + STR->
»

Преобразователь структуры двоичных данных (161)

Программа преобразует данные из двоичной области в формат выводимого через регистровую функцию R9016 графического образа.

На сайте НПП "Семико" есть программа преобразования чёрно-белых графических файлов в формат графического экрана ЭКВМ. Для примера взято изображение:

Для просмотра изображения на экране калькулятора нужна специальная программа.

Но если вывести изображение на экран с помощью регистровой функции (R9016), то получаемое изображение даже отдалённо не напоминает оригинал:

Это связано с несовпадением внутренней структуры графического экрана и формата выводимого через регистровую функцию R9016 графического образа.

Вывод изображения на экран с помощью регистровой функции имеет неоспоримые преимущества: простота и повышенное быстродействие.

Для преобразования двоичных данных формат графического образа написана простая программа.
После запуска программы ждём пару минут...
После останова вводим, 1002 РРП 9016 КГРФ и получаем изображение:

Как видите, теперь изображение полностью совпадает с оригиналом.

Программа для решения задачи на пирамиду (TI-89T)

Задача. Даны четыре точки: A(xa;ya;za), B(xb;yb;zb), C(xc;yc;zc), D(xd;yd;zd). Найти:

1) координаты всех векторов, построенных на этих точках;
2) длины сторон пирамиды ABCD;
3) все плоские углы при вершинах;
4) площади всех граней пирамиды;
5) все высоты всех граней пирамиды;
6) объем пирамиды;
7) все высоты пирамиды;
8) общие уравнения плоскостей, проходящих через грани пирамиды;
9) канонические уравнения прямых, проходящих через рёбра пирамиды;
10) все углы между гранями пирамиды;
11) все углы между рёбрами и соответствующими гранями пирамиды;
12) расстояния и углы между скрещивающимися рёбрами пирамиды.

После запуска программы потребуется ввести четыре точки как списки координат.

Программу написал полностью на локальных переменных. В самом начале может немного

притормаживать (нужно попробовать оптимизировать).

Программы для решения задач по теории вероятностей (HP 50g)

Программа BAIES позволяет решать задачи на формулу Байеса. После запуска требуется ввести список условных вероятностей и список вероятностей гипотез. Последовательно (нажимать ENTER) в текстовых окнах выводится полная (безусловная) вероятность события А и вероятности гипотез при условии, что событие А произошло.

Программа DSV позволяет рассчитать основные числовые характеристики дискретной случайной величины (ДСВ). После запуска потребуется ввести список значений случайной величины и список вероятностей их реализации. Последовательно выводится математическое ожидание, дисперсия, среднее квадратическое отклонение, начальные и центральные моменты до 4-го порядка включительно, асимметрия и эксцесс. В зависимости от режима вычислений (точный/приближённый) выдаёт точные/приближённые значения числовых характеристик.

Программа HI2 позволяет определять критические точки распределения хи квадрат (правосторонняя критическая область) по введённым в стек числу степеней свободы и вероятности (т.е. эта программа реализована как функция, без оконного интерфейса).

Программа NSV позволяет рассчитывать основные числовые характеристики непрерывной случайной величины (НСВ). После запуска потребуется выбрать способ задания НСВ (функция распределения или плотность распределения), а затем в виде матрицы нужно ввести выбранную функцию (проверка корректности данных не производится [в новой версии может добавлю]). После продолжения потребуется выбрать точный/приближённый режим вычислений.

Программа REPEXP (повторение испытаний) позволяет рассчитывать локальные и интервальные вероятности в схеме Бернулли. Расчёты производятся либо по формуле Бернулли, либо по локальной/интегральной формуле Муавра-Лапласа.

Программа TUV3 (теорема умножения вероятностей) позволяет получить список вероятностей одновременного наступления ни одного, одного, двух, трёх, ... , эн независимых событий по введённому списку вероятностей наступления каждого из этих событий в одном испытании. Если все вероятности равны, то результат совпадает с последовательными расчётами по формуле Бернулли.

Все программы сделал на локальных переменных. Из "негативных" последствий запуска этих программ: 1) установка точного режима вычислений; 2) удаление переменной X; 3) в случае аварийной остановки (до естественного завершения расчётов) захламление памяти локальными переменными [использовать программу DelLOC, число показывает приблизительный (по нескольким причинам) объем освободившейся памяти].

ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ ПРОГРАММ

Задача 1. Студент Козлов плохо подготовился к экзамену, но ожидает получить 
подсказки от своих друзей Иванова, Петрова и Сидорова. Иванов подсказывает 
верный ответ с вероятностью 3/11, Петров - с вероятностью 2/7, Сидоров - с 
вероятностью 1/7. Если Козлов получит три верных подсказки, то он сдаст 
экзамен наверняка; две подсказки - с вероятностью 1/2; одну подсказку - с 
вероятностью 1/3; ни одной - с вероятностью 1/5. Козлов сдал экзамен. Сколько 
подсказок вероятнее всего он получил? 

Событие А - Козлов сдал экзамен. Это событие может произойти с четырьмя попарно несовместными событиями, образующими полную группу (гипотезами):
Н1 - не получено ни одной (верной) подсказки;
Н2 - получена одна подсказка;
Н3 - получены две подсказки;
Н4 - получены три подсказки.

По условию задачи известны условные вероятности наступления события А при условии реализации каждой из гипотез:
P(А|Н1)=1/5;
P(А|Н2)=1/3;
P(А|Н3)=1/2;
P(А|Н4)=1.

Перед использованием программы BAIES нужно воспользоваться программой TUV3, чтобы определить вероятности гипотез. Иванов, Петров и Сидоров дают подсказки, но при этом могут получиться ситуации Н1 - Н4.

Сбрасываем на первый уровень стека список с вероятностями верных подсказок для каждого из "помощников", т.е. {'3/11' '2/7' '1/7' }, и запускаем программу TUV3. Получим результат (округлено до 4 знаков):
{0,4453 0,4193 0,1243 0,0111}

или
P(Н1)=0,4453;
P(Н2)=0,4193;
P(Н3)=0,1243;
P(Н4)=0,0111.

Пересчитаем вероятности гипотез в предположении, что событие А уже произошло. Запускаем программу BAIES и набираем соответствующие списки:
P(A|Hi): {'1/5' '1/3' '1/2' 1 }
P(Hi): {0,4453 0,4193 0,1243 0,0111}

После переключения в APPROX режим получим (округлено):
P(A)=0,30207(6);
P(Н1|A)=0,2948;
P(Н2|A)=0,4627;
P(Н3|A)=0,2057;
P(Н4|A)=0,0368.

Наибольшая вероятность у гипотезы Н2 - получена одна подсказка.

Задача 2. Пара игральных костей подбрасывается 90 раз. 
Какова вероятность того, что сумма очков, равная 9, выпадет:
а) ровно 15 раз;
б) от 10 до 20 раз?

Запускаем программу REPEXP и выбираем пункт BINOMIAL (NORMAL для вычисления по формулам Муавра-Лапласа). Для получения ответа на первый вопрос выбираем LOCAL, и набираем указанные на экране коэффициенты: n=90, k=15 и p='4/36'. Получим ответ: P=0,0324.

Для получения ответа на второй вопрос выбираем INTERVAL, набираем указанные на экране коэффициенты: n=90, k1=10, k2=20 и p='4/36'. Получим ответ: P=0,5488.

Задача 3. Дана функция распределения F(x) непрерывной случайной величины X. 
Найти математическое ожидание, дисперсию, среднее квадратическое отклонение, 
начальные и центральные моменты до 4-го порядка включительно, если:

           0, x < 0,
F(x)= sin(x), 0 < x <= pi/2,
           1, x > pi/2.

Запускаем программу NSV, выбираем "тип" вводимой функции F(x). Набираем заданную в условии функцию распределения как матрицу:
[ [0 '-oo' 0] ['sin(x)' 0 'pi/2'] [1 'pi/2' 'oo'] ], где oo - бесконечность.

Если выбраны точные расчёты, то получим следующий ответ (текущая версия программы не позволяет прокрутить экран):
M(X)='(pi-2)/2'
D(X)='pi-3'
sigma(X)='sqrt(pi-3)'
v1(X)='(pi-2)/2'
v2(X)='(pi^2-8)/4'
v3(X)='(pi^3-24*pi+48)/... [v3(X)='(pi^3-24*pi+48)/8']
v4(X)='(pi^4-48*pi^2+38... [v4(X)='(pi^4-48*pi^2+384)/16']
u1(X)='0'
u2(X)='pi-3'
u3(X)='-((3*pi^2-12*pi+... [u3(X)='-((3*pi^2-12*pi+8)/4)]
u4(X)='(pi^3-6*pi^2-12*... [u4(X)='(pi^3-6*pi^2-12*...pi+66)/2']

Если выбраны приближённые расчёты, то получим:
M(X)=0,5708
D(X)=0,1416
sigma(X)=0,3763
v1(X)=0,5708
v2(X)=0,4674
v3(X)=0,4510
v4(X)=0,4793
u1(X)=0
u2(X)=0,1416
u3(X)=0,0225
u4(X)=0,0448

Если точные значения всё-таки нужнее приближённых, то в текущей версии программы их можно получить следующим способом:
1) после вывода на экран M(X)=... остановить выполнение программы клавишей "ON";
2) набрать команду UNBIND и прочитать нужные значения.

Задача 4. Вычислить критическое значение критерия Хи-квадрат с 5 степенями свободы и доверительной вероятностью 0,05.

Сбрасываем в стек 5 и 0,05, запускаем программу HI2. Получаем ответ: 11,07.

Программы из справочника Дьяконова, 3-е изд.

Гоняю тесты программного калькулятора ВК-6, приходится набивать программы из Дьяконова. Буду выкладывать набранные mkp-файлы здесь, т.к. могут и другим пригодиться.

Название файла отражает номер программы в справочнике. Кому приходилось набивать другие программы из третьего издания Дьяконова, добавляйте.

Разложение на простые множители (152)

Загружать программу лучше на нулевую страницу (иначе не выведется корректно сообщение в строке комментариев). Перед запуском следует ввести в регистр Х число: программа разложит его на множители, которые занесёт в память МК. На прошивке 1.02 программа может иногда работать ошибочно из-за погрешности деления.

Разложение на простые множители (Citizen SRP-400G)

Две простые программы поиска разложения целых чисел на простые множители. Диапазон 1<=n<=999999999. В первой в качестве пробных делителей проверяются числа 2 и все нечетные. Во второй - 2,3 и все числа вида 6*I+1, 6*I-1.

1 программа:

Input N;
If(N==1)Then{Goto 1};
For(P=2;NRmdr2==0;N=N/2){Print P};
If(N==1)Then{Goto 2};
For(P=3;P^2<=N;P=P+2)
{
    If(NRmdrP==0)Then
    {
       Print P;
       N=N/P;
       P=P-2;
    }
};
Label 1:;
Print N;
Label 2:;
End

2 программа:

Input N;
If(N==1)Then{Goto 1};
For(P=2;NRmdrP==0;N=N/P){Print P};
For(P=3;NRmdrP==0;N=N/P){Print P};
If(N==1)Then{Goto 2};
For(I=1;(6I-1)^2<=N;I++)
{
    For(P=6I-1;NRmdrP==0;N=N/P){Print P};
    For(P=6I+1;NRmdrP==0;N=N/P){Print P};
};
Label 1:;
Print N;
Label 2:;
End

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

Например,
1111111=239*4649 12 сек. (1 программа), 11 сек. (2 программа)
11111111=11*73*101*137 8 сек. (1 программа), 5 сек. (2 программа)
111111111=3*3*37*333667 31 сек. (1 программа), 25 сек. (2 программа)
1111111111=11*41*271*9091 15 сек. (1 программа), 13 сек. (2 программа)
1111111121=простое 29 мин. 20 сек. (1 программа), около (меньше) 24 мин. 7 сек. (2 программа)

Разные программы для решения задач по высшей математике (HP 50g)

ПРОГРАММЫ:

Расчёт активного ФНЧ (161)

Небольшая программа для Электроники МК-161 для расчёта звена активного фильтра низких частот на операционном усилителе. Операционный усилитель используется в качестве повторителя. Методика расчёта описана И. Романовым в журнале "Радио" №3 за 1995 год.


Схема фильтра показана на рисунке.
Программу надо загружать с 0-й страницы. Запускаем программу. В/О, С/П.

F=? вводим частоту фильтра, например, 15 (кГц) С/П.

Q=? вводим добротность фильтра, например, 0,707 (однозвенный фильтр Баттерворта) С/П.

R=? Вводим сопротивления резисторов, например, 4,7 (кОм) С/П.

Получаем расчётное значение ёмкости конденсатора C1 3,1921289*10^-3 (мкФ). Вводим ближайшее стандартное значение 3300пФ: 3300 ВП /-/ 06 С/П.

Получаем значение C2 1,5965466*10^3. Вводим 1600пф: 1600 ВП /-/ 06 С/П.

Получаем реальную частоту настройки фильтра 14,736872 кГц С/П.

Получаем реальную добротность фильтра 0,71807033. Расчёт окончен. С/П. Можно рассчитывать новый фильтр.

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

Расчёт асинхронного генератора (161)

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

Чтобы асинхронный двигатель начал выдавать электроэнергию раскрутить его ротор выше синхронной частоты вращения недостаточно. Двигатель, рассчитанный на напряжение 380В за счет остаточной намагниченности ротора будет выдавать напряжение всего... 2 - 5В.
Для возбуждения асинхронного генератора до номинального напряжения, в данном случае до 380В, к обмотке статора надо подключить три конденсатора, соединённых между собой в звезду или треугольник. Напряжение на клеммах двигателя возрастает до номинального за 2 - 3 секунды.

Возможность использования асинхронного двигателя в качестве генератора проверена лично.

Достоинства:
-В качестве генератора можно применить обыкновенный асинхронный двигатель, который относительно дешёв.
-Выдаёт переменный ток напряжения 220В. Большинство трёхфазных асинхронных двигателей можно переподключить на напряжение 220В
-Не боится короткого замыкания! Самолично замыкал металлической отвёрткой (с изолированной ручкой :)) клеммы работающего асинхронного генератора, после устранения замыкания напряжение восстанавливалось! Правда, таким образом можно полностью размагнитить ротор.

Недостатки:
-Не любит индуктивной нагрузки, при подключении, например, трансформатора параллельно ему придётся подключить дополнительные конденсаторы.
-Частота вращения ротора должна быть стабильной, отклонения не должны превышать 5%. Возбуждение генератора появляется при достижении частоты вращения, близкой к номинальной, при превышении из-за перевозбуждения могут сгореть обмотки.
-Мощность асинхронного генератора с конденсаторным возбуждением на практике ограничивается на уровне 10 киловатт габаритами батареи конденсаторов.

Методика расчёта описана в "Книге сельского электрика". Также подробные рекомендации можно найти в журнале "Сделай сам" 2005, № 3, с.78 – 82.
Основная идея заключается в том, что номинальный ток батареи конденсаторов должен быть примерно равен току холостого хода двигателя.

Для расчёта параметров генератора на основе трёхфазного двигателя понадобятся данные с таблички, имеющейся на его корпусе.
За основу генератора возьмём, например, двигатель АИР63В2.

Загружаем первую программу с 0-й страницы. В/О, С/П.

Pдв=? Вводим номинальную мощность двигателя, 0,55(кВт), С/П.

кпд=? Вводим кпд двигателя, 72(%), С/П.

cosф=? Вводим коэффициент мощности, 0,83, С/П.

nсин=? Вводим синхронную частоту вращения, 3000(об/мин), С/П.

nдв=? Вводим номинальную частоту вращения, 2730(об/мин), С/П.

nген=? Получаем расчётную частоту вращения ротора генератора, 3296,7033 об/мин. Если механический двигатель имеет другую частоту вращения, например 3100об/мин, вводим 3100(об/мин), С/П.

Uном=? Вводим номинальное напряжение, 380(В), С/П.

С=5,4162201, нужная ёмкость каждого из трёх конденсаторов примерно 5,4мкФ. Конденсаторы надо соединять в звезду. С/П.

Pвых=3,72372*10^-1, генератор может отдать в нагрузку примерно 0,37кВт, С/П.

Uвых=357,32667 выходное напряжение примерно 357В, С/П.

fвых=47,016667, частота выходного переменного тока равна примерно 47Гц.

Если найти трёхфазный двигатель не удаётся, то в качестве генератора можно применить однофазный асинхронный двигатель. Однофазный двигатель можно добыть, например, раскурочив любимую стиральную машину... :) Конденсатор подключается параллельно рабочей обмотке двигателя.

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

Например, имеется однофазный двигатель на 220В, 180Вт 1400 об/мин, без нагрузки потребляет от сети 0,6А.

Загружаем вторую программу, также с 0-й страницы. В/О, С/П.

Pдв=? Вводим мощность двигателя, 180(Вт), С/П.

Uном=? Вводим номинальное напряжение, 220(В), С/П.

Iхх=? Вводим ток холостого хода, 0,6(А), С/П.

nсин=? Вводим синхронную частоту вращения, 1500(об/мин), С/П.

nдв=? Вводим номинальную частоту вращения, 1400(об/мин), С/П.

nген=? Получаем расчётную частоту вращения ротора генератора, 1607,1429 об/мин. Можно ввести другое значение, например 1650 (об/мин), С/П.

С=8,45556936, нужная ёмкость конденсатора примерно равна 8,5мкФ, С/П.

Pвых=129,36, генератор может отдать в нагрузку почти 130Вт. Можно телевизор смотреть... :) С/П.

Uвых=225,866667, выходное напряжение примерно 226В, С/П.

fвых=51,333333, частота выходного переменного тока равна 51Гц.

Используемые в качестве генераторов асинхронные двигатели должны быть рассчитаны на частоту 50Гц! При появлении возбуждения генератора заметно возрастает нагрузка на механический двигатель. На холостом ходу генератор выдаёт напряжение на 5 - 10% больше расчётного. В зависимости от нагрузки, частота переменного тока будет немного меняться. Если генератор не выдаёт напряжение, то надо на несколько секунд подсоединить к клеммам, ВНИМАНИЕ, ОСТАНОВЛЕННОГО!!! генератора батарею или аккумулятор на 6-12В. Если напряжения нет или оно в разы меньше расчётного, то надо немного увеличить ёмкость конденсаторов.

Расчёт выпрямителя с емкостным фильтром (161)

Программа рассчитывает ёмкость сглаживающего конденсатора на выходе выпрямителя. Методика расчёта авторская, прошу не судить строго :-). Программа рассчитывает параметры выпрямителя в установившемся режиме. Переходные процессы, например, при включении выпрямителя, не учитываются.

Программу загружать с 0-й страницы. В/О, С/П.

Схема 1/2? Выбираем одно- либо двухполупериодную (мостовую) схему выпрямителя, например, двухполупериодную, 2 С/П. При вводе числа меньше 1 и больше 2, программа повторит вопрос.

Uвх=? Вводим напряжение на входе выпрямителя, например 15 (В), С/П.

2Uпул=?. Вводим двойное напряжение (размах) пульсаций, например, 2 (В), С/П.

Iн=? Вводим потребляемый ток нагрузки, например 1 (А), С/П.

Uдпр=? Вводим прямое падение напряжения на диодах, например, 0,6(В), С/П.

Cф=? Получаем расчётную ёмкость фильтрующего конденсатора, 4247,1095 мкФ. Вводим стандартное значение, 4700 (мкФ), С/П. Получаем напряжение на выходе выпрямителя, Uвых= 19,101649, то есть примерно 19,1В. С/П. Получаем реальный размах пульсаций, 2Uпул= 1,8231091, то есть, примерно 1,82В. С/П. Получаем наибольший импульсный ток через диоды выпрямителя, Iди= 13,703831, то есть примерно 13,7А. С/П. Можно рассчитывать дальше.

Размах напряжения пульсаций не должен превышать 20% от выходного напряжения, иначе может выйти из строя электролитический конденсатор на выходе выпрямителя. Заметьте, импульсный ток значительно превышает средневыпрямленный! Диоды должны его выдерживать.

Рис. 1. Принципиальная схема однополупериодного выпрямителя.

Рис. 2. Принципиальная схема двухполупериодного (мостового) выпрямителя.

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

Краткое описание работы схемы.

На вход выпрямителя подаётся синусоидальное переменное напряжение. Амплитуда входного напряжения в 1,4142 раза превышает эффективное значение входного напряжения: Um=1,4142Uвх.

Как только мгновенное значение напряжения на входе выпрямителя превысит напряжение на конденсаторе фильтра, диоды выпрямителя откроются, и конденсатор окажется подключённым к источнику переменного тока. Разность напряжений амплитудного входного и на конденсаторе в момент включения диодов есть размах пульсаций выходного напряжения 2Uпул=Um-Ucфmin.
Угол включения диодов определяется выражением Овкл=arccos(Ucфmin/Um), то есть Oвкл=arccos(1-(2Uпул/Um))
Потребляемый ток от источника переменного тока равен сумме токов заряда конденсатора и потребления нагрузкой. Iди=2*pi*F*Um*Cф*sinOвкл+Iн.

При достижении амплитудного напряжения на входе выпрямителя, ток, потребляемый конденсатором фильтра становится равным нулю, а далее становится отрицательным.
Как только ток разряда конденсатора фильтра превысит ток потребления нагрузки, диоды выпрямителя закроются.Угол выключения диодов определяется выражением Oвыкл=arcsin(Iн/(2*pi*F*Um*Cф)).

Напряжение на нагрузке будет поддерживаться за счёт заряда конденсатора фильтра, пока мгновенное напряжение на входе выпрямителя снова не превысит напряжение на конденсаторе фильтра. Время, поддержания напряжения за счёт заряда конденсатора фильтра определяется выражениями t=(180-Oвкл-Oвыкл)/(180*2*F) для мостовой и t=(360-Oвкл-Oвыкл)/(180*2*F) для однополупериодной схемы выпрямителя.

Необходимая ёмкость конденсатора фильтра: Cф=Iн*t/2Uпул. Размерности вышеприведённых формул: напряжение, В; ток, А; частота, Гц; ёмкость, Ф; угол, градусы.

Методика расчёта.

Предполагается, что выпрямитель работает в установившемся режиме, внутреннее сопротивление источника переменного тока и диодов выпрямителя равно нулю.
Частота переменного тока равна 50Гц, размерность ёмкости конденсатора - мкФ.

Выбираем схему выпрямителя, одно-, или двухполупериодную. Задаёмся входным напряжением, Uвх, В; размахом напряжения пульсаций, 2Uпул, В; потребляемым током нагрузки, Iн, А; прямым падением напряжения на диодах, Uдп, В.

1) Получаем амплитудное значение входного напряжения Um=1,4142*Uвх (В) (1);
Внимание! Рабочее напряжение конденсатора фильтра должно превышать амплитудное входное.
Рассчитываем:

2) Угол включения диодов, Oвкл=arccos(1-(2Uпул/Um)) (2);

3) Ёмкость конденсатора фильтра для двухполупериодной схемы, Cф=10000*Iн*(1-(Oвкл+Oвыкл)/arccos(-1))/2Uпул (мкФ) (3);
или для однополупериодной схемы Cф=10000*Iн*(2-(Oвкл+Oвыкл)/arccos(-1))/2Uпул (мкФ) (4) Пока значение Oвыкл не известно, зададимся Oвыкл=0;
4) Oвыкл=arcsin(10000*Iн/(pi*Uвых*Cф)) (5);
Подставляем Oвыкл в формулу (3) или (4) и получаем уточнённое значение ёмкости конденсатора фильтра. Если необходимо ещё раз уточнить значение ёмкости конденсатора фильтра, повторно рассчитывают Oвыкл по формуле (5), а затем получаем значение ёмкости конденсатора фильтра по формуле (3) или (4).

Находим ближайшее к расчётному, стандартное значение ёмкости конденсатора, и производим проверочный расчёт.
Рассчитываем:

5) Oвыкл по формуле (5);

6) Размах пульсаций выходного напряжения для двухполупериодной схемы, 2Uпул=10000*Iн*(1-(Oвкл+Oвыкл)/arccos(-1))/Cф (В) (6);
или для однополупериодной схемы 2Uпул=10000*Iн*(2-(Oвкл+Oвыкл)/arccos(-1))/Cф (В) (7);

7) Угол включения диодов, Oвкл по формуле (3).
Подставляем Oвкл в формулу (6) или (7) и получаем уточнённое значение размаха пульсаций выходного напряжения. Если необходимо ещё раз уточнить значение размаха пульсаций выходного напряжения повторно рассчитывают Oвкл по формуле (3), а затем получаем значение размаха пульсаций выходного напряжения по формуле (6) или (7).

8) Среднее значение выходного напряжения для двухполупериодной схемы Uвых=Um-2Uпул/2-2*Uдп (8);
или для однополупериодной схемы Uвых=Um-2Uпул/2-Uдп (9);

9) Наибольший импульсный ток диодов, Iди=pi*Uвых*Cф*sinOвкл/10000+Iн. (10).
Результаты расчётов хорошо согласуются с результатами, рассчитанными по распространённым методикам, описанных технических справочниках.

Расчёт генератора на однопереходном транзисторе (161)

Программа рассчитывает номиналы деталей генератора на однопереходном транзисторе.

Подробное описание работы схемы и методика расчёта описана 1104-м выпуске массовой радиобиблиотеке, книге Я. С. Кублановского "Тиристорные устройства".
Схему можно применить для управления тиристорным регулятором мощности.

Схема генератора на однопереходном транзисторе изображена на рисунке.

Программу надо загружать с 0-й страницы. В/О, С/П.

Uпит=? Вводим напряжение питания схемы, например, 15(В), С/П.

Tи=? Вводим наибольший период следования импульсов, например, 3,3(мс), С/П.

Выбираем для схемы однопереходный транзистор КТ117А.

n=? Вводим усреднённый коэффициент передачи транзистора, 0,6, С/П.(по справочнику 0,5-0,7)

Rб1б2=? Вводим усреднённое межбазовое сопротивление транзистора, 6,5(кОм), С/П.(по справочнику 4-9кОм)

Iэвкл=? Вводим наибольший ток включения, 20(мкА), С/П.

Iэвыкл=? Вводим наименьший ток выключения, 1(мА), С/П.

Схема будет управлять тиристором Т106-10

Uувкл=? Вводим напряжение управления тиристора, 2,5(В), С/П.

Iувкл=? Вводим ток управления тиристора, 25(мА), С/П.

R5=? Вводим сопротивления резистора R5, если его значение не приводится в справочнике, его можно принять равным 100 Ом.
Вводим 0,1 (кОм), С/П.

Получаем:

C=1.2004923*10^-2 мкФ. Ёмкость времязадающего конденсатора равна примерно 0,012мкФ. С/П.

Сопротивления резисторов:

R1=285кОм. Выбираем стандартное значение 270кОм. С/П.

R2=15кОм. С/П.

R3=4.1333333*10^-1 кОм. Выбираем стандартное значение 430 Ом. С/П.

R4=8.6666667*10^-2 кОм. Выбираем стандартное значение 82 Ом. С/П.

Расчёт окончен. Можно рассчитывать схему заново.

По результатам расчёта был собран макет схемы. Измеренный период следования импульсов оказался равен 2,7 мс, точность расчета на практике равна 22%.

Расчёт глубины резкости (Citizen)

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

Приведённые ниже программы писались и тестировались на ПМК CITIZEN srp-175. Он дает возможность ввести четыре программы с общим числом шагов – 128. На сайте Citizen я нашёл информацию ещё о двух программируемых моделях: srp-45N и srp-145T. У них одно поле программы и всего 40 шагов памяти.

1. Расчёт ближнего и дальнего расстояний (58 шагов памяти).

Входные данные:

Выходные данные:

01..15 [x] STO 1 [x] STO 2 1/X * 1 7 2 0 * RCL 0
16..29 = STO 3 * RCL 1 / ( RCL 3 - RCL 1 +
30..44 RCL 0 ) = STO 4 RCL 3 * RCL 1 / ( RCL 3
45..58 + RCL 1 - RCL 0 ) = a RCL 4 b R® P P® R

Перед первым запуском программы, а также после каждой смены объектива фокусное расстояние (м) заносится в регистр памяти 0. Например:

0 . 1 3 5 STO 0

После запуска программы (у меня RUN 9):
* на запрос -001- вводить расстояние по шкале, например, 7;
* RUN;
* на запрос -002- ставить значение диафрагмы, например, 5.6;
* RUN;
на экране получаем ближайшее расстояние: 6.005675351 (занесено в переменную a), нажимаем b - читаем 8.388901505. Теперь можно, нажимая a и b, смотреть соответственно ближнее и дальнее расстояния. иперфокальное расстояние лежит в ячейке памяти 3:

RCL 3 ® 41.46428571.

Для дальнейших вычислений повторить абзац сначала.

2. Расчёт расстояния по шкале и значения диафрагмы (49 шагов памяти).

Входные данные:

Выходные данные:

01..10 2 * [x] STO 1 * [x] STO 2 / ( RCL 1 +
15..30 RCL 2 ) = STO 3 - RCL 1 = * 1 7 2 0 /
31..43 RCL 1 / ( RCL 3 / RCL 0 - 1 ) =
44..49 b RCL 3 a R® P P® R

Перед первым запуском программы, а также после каждой смены объектива фокусное расстояние (м) заносится в регистр памяти 0. Например,

0 . 0 5 0 STO 0

После запуска программы (у меня RUN 6)
* на запрос -001- вводить ближнее расстояние, например, 5;
* RUN;
* на запрос -002- ставить дальнее расстояние, например, 10;
* RUN;
на экране получаем расстояние по шкале 6.666666667 (занесено в переменную a), нажимаем b - читаем 4.332493703 (значение диафрагмы). Теперь можно, нажимая a и b, смотреть эти значения поочерёдно.

Для дальнейших вычислений повторить абзац сначала.

Для вычислений использовались формулы:
G = 1720 * f / d
m1 = G * m / ( G + ( m – f ) )
m2 = G * m / ( G – ( m – f ) )
m = 2 * m1 * m2 / ( m1 + m2 )
d = 1720 * ( m – m1 ) / m1 / ( m / f – 1 )

(последние две формулы выведены из первых трёх)
G – гиперфокальное расстояние;
m1 – ближнее расстояние;
m2 – дальнее расстояние;
f – фокусное расстояние объектива;
d – значение диафрагмы.

Из-за очень малого объёма памяти и неразвитой системы условных переходов, в программах отсутствует любая проверка корректности данных. Полученное отрицательное значение m2 означает бесконечность.

Несколько рекомендаций:

Статья подготовлена Иваном Савоченко (http://www.reklama.rezultat.com/foto/01/25.htm)

Расчёт емкостей (161)

Программы помогут рассчитать различные емкостные элементы.

Доработанные программы из третьего издания справочника В. П. Дьяконова с подсказками в строке комментариев.

В отличие от индуктивных элементов, конденсаторы обычно являются стандартными, и их ёмкости не рассчитывают. Исключение составляют расчёт плёночных конденсаторов ( например, для плёночных схем ) и ёмкости проводников в свободном пространстве ( для оценки паразитной ёмкости монтажа ) .

Программа 7.37. Расчёт ёмкости C или площади обкладок S плоского конденсатора в виде пластины диэлектрика толщиной h с нанесёнными обкладками.

Eд - диэлектрическая проницаемость.

В/О, С/П, 0C/1S? Если нужно рассчитать ёмкость, вводим 0, если площадь обкладок - 1.

Вводим: 0, С/П, h=0,15 см, С/П, Eд=1, С/П, S=2 см2, С/П.

Получаем: C=1,1813333 пФ.

Программа 7.38. Расчёт ёмкости C или диаметра D круглого конденсатора в виде пластины диэлектрика толщиной h с нанесёнными обкладками.

Eд - диэлектрическая проницаемость.

В/О, С/П, 0C/1D? Если нужно рассчитать ёмкость, вводим 0, если диаметр обкладок - 1.

Вводим: 0, С/П, h=0,1 см, С/П, Eд=4,7, С/П, D=1 см, С/П.

Получаем: C=3,2665 пФ.

Программа 7.39. Расчёт ёмкости C или длины l трубчатого конденсатора без учёта краевых эффектов.

Eд - диэлектрическая проницаемость, Dн - наружний диаметр трубки, Dв - внутренний диаметр трубки.

В/О, С/П, 0C/1l? Если нужно рассчитать ёмкость, вводим 0, если длину конденсатора - 1.

Вводим: 0, С/П, Eд=4,7, С/П, Dн=0,5 см, С/П, Dв=0,4 см, С/П, l=2 см, С/П.

Получаем: C=23,376325 пФ.

Программа 7.40. Расчёт ёмкости C или длины электродов l трубчатого конденсатора с электродами одинаковой длины, если длина трубки больше длины электродов.

Eд - диэлектрическая проницаемость, Dн - наружний диаметр трубки, Dв - внутренний диаметр трубки.

В/О, С/П, 0C/1l? Если нужно рассчитать ёмкость, вводим 0, если длину электродов - 1.

Вводим: 0, С/П, Eд=4,7, С/П, Dн=0,5 см, С/П, Dв=0,4 см, С/П, l=2 см, С/П.

Получаем: C=23,789079 пФ.

Программа 7.41. Расчёт ёмкости C или длины короткой обкладки l трубчатого конденсатора с электродами разной длины.

Eд - диэлектрическая проницаемость, Dн - наружний диаметр трубки, Dв - внутренний диаметр трубки.

В/О, С/П, 0C/1l? Если нужно рассчитать ёмкость, вводим 0, если длину короткой обкладки - 1.

Вводим: 0, С/П, Eд=4,7, С/П, Dн=0,5 см, С/П, Dв=0,4 см, С/П, l=2 см, С/П.

Получаем: C=24,369819 пФ.

Программа 7.42. Расчёт ёмкости C шарового конденсатора.

Eд - диэлектрическая проницаемость, Dв - внутренний диаметр шара, Dн - наружний диаметр шара.

В/О, С/П.

Вводим: Eд=4,7, С/П, Dв=9 см, С/П, Dн=10 см.

Получаем: C=232,65 пФ.

Программа 7.43. Расчёт ёмкости C или длины цилиндра l горшкового конденсатора в виде цилиндра с наружним диаметром Dн и внутренним диаметром Dв, заканчивающимся внизу полушаром диаметром Dн.

Eд - диэлектрическая проницаемость.

В/О, С/П, 0C/1l? Если нужно рассчитать ёмкость, вводим 0, если длину цилиндра - 1.

Вводим: 0, С/П, Eд=4,7, С/П, Dн=5 см, С/П, Dв=4 см, С/П, l=10 см, С/П.

Получаем: C=143,01363 пФ.

Расчёт ёмкости шара с диаметром D в свободном пространстве.

C = 0,555 Eд D

В связи с простотой формулы, рассчитывать с и D проще вручную.

Программа 7.44. Расчёт ёмкости C между двумя шарами диаметром D и расстоянием между центрами шаров a.

Eд - диэлектрическая проницаемость.

В/О, С/П.

Вводим: Eд=1, С/П, D=10 см, С/П, a=15 см.

Получаем: C=4,2626667 пФ.

Программа 7.45. Расчёт ёмкости C или диаметра D круглого диска толщиной h в свободном пространстве.

Eд - диэлектрическая проницаемость.

В/О, С/П, 0C/1D? Если нужно рассчитать ёмкость, вводим 0, если диаметр диска - 1.

Вводим: 0, С/П, Eд=1, С/П, h=0,1 см, С/П, D=10 см, С/П.

Получаем: C=3,755 пФ.

Программа 7.46. Расчёт плёночного конденсатора с заданной ёмкостью C.

m - число обкладок, d - толщина диэлектрика, Eд - диэлектрическая проницаемость, Q - соотношение сторон, C0 - удельная ёмкость, A - длина обкладки, B - ширина обкладки, S - площадь обкладки.

В/О, С/П.

Вводим: m=3, С/П, d=0,01 см, С/П, Eд=4,7, С/П, Q=2 см, С/П, C=100 пФ.

Получаем: C0=83,19 пФ/см2, С/П, A=1,5505274 см, С/П, B=0,77526368 см, С/П, S=1,2020676 см2.

Программа 7.47. Расчёт ёмкости проводников в свободном пространстве длиной l диаметром d.

Eд - диэлектрическая проницаемость, k1, k2 - коэффициенты, x - параметр, см. таблицу.

Коэффициенты k1 и k2 для расчёта ёмкости проводников.

Ёмкость С Коэффициент k1 Коэффициент k2 Параметр х
Между двумя проводами вдали от земли 0,12 2 расстояние между проводами
Между горизонтальным проводом и землёй 0,24 4 высота подвески
Между вертикальным проводом и землёй при расстоянии от земли до нижнего конца больше четверти длины провода 0,24 1 длина провода
Между вертикальным проводом и землёй при расстоянии от земли до нижнего конца меньше четверти длины провода 0,24 1,15 длина провода
Между проводом и корпусом при вводе провода через отверстие 0,24 2 диаметр отверстия

В/О, С/П.

Вводим: k1=0,24, С/П, k2=4, С/П, Eд=1, С/П, l=1000 см, С/П, d=0,2 см, С/П, x=200 см.

Получаем: C=66,62854 пФ.

Программа 7.48. Расчёт расстояния между центрами двух шаров x по заданной ёмкости C.

Eд - диэлектрическая проницаемость.

В/О, С/П.

Вводим: C=5 пФ, D=10 см, Eд=1, С/П, С/П, С/П, С/П, С/П.

Получаем: x=12,259 см.

Каждое очередное нажатие на клавишу С/П даёт следующий десятичный знак.

Расчёт индуктивностей (161)

Программы помогут рассчитать различные индуктивные элементы.

Доработанные программы из третьего издания справочника В. П. Дьяконова с подсказками в строке комментариев.

Индуктивность везде выражается в наногенри ( нГн ), конструктивные размеры - в сантиметрах ( см ).

Программа 7.13. Расчёт индуктивности L отрезка круглого провода длиной l и диаметром d.

В/0, С/П.

Вводим: d=0,1 см, С/П, l=1 см, С/П.

Получаем: L=4,1864708 нГн.

Программа 7.14. Расчёт индуктивности L отрезка прямоугольного провода длиной l, шириной b и толщиной t.

В/0, С/П.

Вводим: b=0,1 см, С/П, t0,001 см, С/П, l=1 см, С/П.

Получаем: L=7,0167109 нГн.

Программа 7.15. Расчёт индуктивности L одиночного круглого витка со средним диаметром витка D и диаметром провода d.

В/0, С/П.

Вводим: d=0,1 см, С/П, D=2 см, С/П.

Получаем: L=41,785367 нГн.

Программа 7.16. Расчёт индуктивности L тонкоплёночного круглого витка диаметром D и шириной полоски b ( при условии, что толщина полоски намного меньше его ширины ).

В/0, С/П.

Вводим: b=0,01 см, С/П, D=1 см, С/П.

Получаем: L=25,082773 нГн.

Программа 7.17. Расчёт индуктивности L тонкоплёночного квадратного витка со стороной квадрата l и шириной полоски b ( при условии, что толщина полоски намного меньше его ширины ).

В/0, С/П.

Вводим: b=0,01 см, С/П, l=1 см, С/П.

Получаем: L=30,652894 нГн.

Программа 7.18. Расчёт индуктивности L или числа витков w по заданной индуктивности L однослойной катушки круглого сечения со средним радиусом R и длиной катушки l.

В/0, С/П, 0L/1w? Если нужно рассчитать индуктивность, вводим 0, если число витков - 1.

Вводим: 0, С/П, R=1 см, С/П, l=2 см, С/П, w=10 вит, С/П.

Получаем: L=1359,627 нГн.

Программа 7.19. Расчёт индуктивности L или числа витков w по заданной индуктивности L однослойной катушки квадратного сечения со средней длиной стороны квадрата 2a и длиной катушки b.

В/0, С/П, 0L/1w? Если нужно рассчитать индуктивность, вводим 0, если число витков - 1.

Вводим: 0, С/П, a=1 см, С/П, b=2 см, С/П, w=40 вит, С/П.

Получаем: L=26816,55 нГн.

Программа 7.20. Расчёт индуктивности L или числа витков w по заданной индуктивности L однослойной тороидальной катушки круглого сечения со средним диаметром D и диаметром сечения D1.

В/0, С/П, 0L/1w? Если нужно рассчитать индуктивность, вводим 0, если число витков - 1.

Вводим: 0, С/П, D=3 см, С/П, D1=1 см, С/П, w=300 вит, С/П.

Получаем: L=97022,175 нГн.

Программа 7.21. Расчёт индуктивности L или числа витков w по заданной индуктивности L однослойной тороидальной катушки квадратного сечения со внутренним диаметром тора D1, наружним D2 и высотой h.

В/0, С/П, 0L/1w? Если нужно рассчитать индуктивность, вводим 0, если число витков - 1.

Вводим: 0, С/П, h=1 см, С/П, D1=1 см, С/П, D2=3 см, С/П, w=100 вит, С/П.

Получаем: L=21972,246 нГн.

Программа 7.22. Расчёт индуктивности L или числа витков w по заданной индуктивности L многослойной тороидальной катушки со средним диаметром тора D ( включая обмотку ) и диаметром сечения тора D1.

В/0, С/П, 0L/1w? Если нужно рассчитать индуктивность, вводим 0, если число витков - 1.

Вводим: 0, С/П, D=4 см, С/П, D1=0,8 см, С/П, w=100 вит, С/П.

Получаем: L=487293,56 нГн.

Программа 7.23. Расчёт индуктивности L или числа витков w по заданной индуктивности L многослойной цилиндрической катушки со средним диаметром D, длиной l, меньшей, чем средний диаметр D и толщиной обмотки c.

В/0, С/П, 0L/1w? Если нужно рассчитать индуктивность, вводим 0, если число витков - 1.

Вводим: 0, С/П, l=1 см, С/П, c=1 см, С/П, D=2,5 см, С/П, w=100 вит, С/П.

Получаем: L=185235,42 нГн.

Программа 7.24. Расчёт индуктивности L или числа витков w по заданной индуктивности L катушки с плотно распределённой на [ тороидальном ] ферромагнитном сердечнике прямоугольного сечения обмоткой.

dн - наружний диаметр сердечника, dв - внутренний диаметр сердечника, h - высота сердечника.

В/0, С/П, 0L/1w? Если нужно рассчитать индуктивность, вводим 0, если число витков - 1.

Вводим: 0, С/П, u=1000, С/П, h=1 см, С/П, dв=3 см, С/П, dн=4 см, С/П, w=200 вит, С/П.

Получаем: L=22857143 нГн.

Программа 7.25. Расчёт индуктивности L или числа витков w по заданной индуктивности L катушки на замкнутом П- или Ш-образном сердечнике.

u - магнитная проницаемость, a = 1-2 - поправочный коэффициент на рассеивание в зазоре, lс - длина магнитной силовой линии, Sс - площадь сердечника, lz толщина немагнитного зазора.

В/0, С/П, 0L/1w? Если нужно рассчитать индуктивность, вводим 0, если число витков - 1.

Вводим: 0, С/П, u=1000, С/П, a=1,5, С/П, lс=10 см, С/П, Sс=1 см2, С/П, lz=0,05 см, С/П, w=400 вит, С/П.

Получаем: L=46398907 нГн.

Программа 7.26. Расчёт индуктивности L или числа витков w по заданной индуктивности L катушки на броневом ферромагнитном цилидрическом сердечнике, см. рисунок.

В/0, С/П, 0L/1w? Если нужно рассчитать индуктивность, вводим 0, если число витков - 1.

Вводим: 0, С/П, d1=1 см, С/П, d2=2 см, С/П, d3=4 см, С/П, d4=5 см, С/П, h1=3 см, С/П, h2=4 см,

С/П, u=10, С/П, w=100 вит, С/П.

Получаем: L=468914,42 нГн.

Программа 7.27. Расчёт индуктивности L или числа витков w по заданной индуктивности L тонкоплёночной круглой (или квадратной ) катушки со внутренним диаметром ( или стороной квадрата ) Aв и внешним диаметром ( или стороной квадрата ) Aн.

В/0, С/П, 0L/1w? Если нужно рассчитать индуктивность, вводим 0, если число витков - 1.

(0)/[1]? Если нужно рассчитать круглую катушку вводим 0, если квадратную - 1.

Вводим: 0, С/П, 0, С/П, Aн=1 см, С/П, Aв=0,5 см, С/П, w=5 вит, С/П.

Получаем: L=126,9718 нГн.

Программа 7.28. Расчёт взаимной индуктивности M двух тонких проводов длиной l, расположенных параллельно на расстоянии h друг от друга.

Вводим: h=1 см, С/П, l=10 см, С/П.

Получаем: M=41,864708 нГн.

Программа 7.29. Расчёт взаимной индуктивности M двух тонких проводов длиной a и b, расположенных на одной прямой с расстоянием между стыкуемыми концами h.

Вводим: a=10 см, С/П, b=5 см, С/П, h=1 см, С/П.

Получаем: M=7,2340147 нГн.

Программа 7.30. Расчёт взаимной индуктивности M двух прямых проводов длиной l, сходящихся в одной точке, с расстоянием между сходящимися концами c и углом между ними ф.

Вводим: c=5 см, С/П, ф=30 град, С/П, l=20 см, С/П.

Получаем: M=76,114092 нГн.

Программа 7.31. Расчёт взаимной индуктивности M двух тонких катушек диаметром D и расстоянием h между ними.

w1 и w2 - число витков катушек.

Вводим: w1=50 вит, С/П, w2=50 вит, С/П, D=2 см, С/П, h=0,5 см, С/П.

Получаем: M=192000 нГн.

Программа 7.32. Расчёт взаимной индуктивности M двух коаксиальных катушек, намотанных на тороидальный ферромагнитный сердечник.

w1 и w2 - число витков катушек, Sср - площадь среднего поперечного сечения, с учётом толщины первой катушки, заполняющей весь сердечник, lср - длина средней окружности тора.

Вводим: w1=200 вит, С/П, w2=50 вит, С/П, Sср=1 см2, С/П, lср=8 см, С/П.

Получаем: M=15707,963 нГн.

Программа 7.33. Расчёт числа витков w по заданной индуктивности L тонкоплёночной круглой (или квадратной ) катушки с заданным шагом l и внутренним диаметром ( или стороной квадрата ) Aвн.

(0)/[1]? Если нужно рассчитать круглую катушку вводим 0, если квадратную - 1.

Вводим: 0, С/П, Aвн=0,2 см, С/П, l=0,05 см, С/П, L=100 нГн, С/П, С/П, С/П.

Получаем: w=7,14 вит.

Каждое очередное нажатие на клавишу С/П даёт следующий десятичный знак.

Расчёт источника питания с гасящим конденсатором (161)

Программа рассчитывает ёмкость гасящего и фильтрующего конденсаторов. Методика расчёта описана С. Бирюковым в журнале "Радио" №5 за 1997 год.

Программу загружать с 0-й страницы. В/О, С/П.

Схема 1/2? Выбираем одно- либо двухполупериодную схему выпрямителя, например, двухполупериодную, 2 С/П. При вводе числа меньше 1 и больше 2, программа повторит вопрос.

Uвых=? Вводим требуемое выходное напряжение, например 9 (В), С/П.

Iнmin=? Вводим наименьший потребляемый ток нагрузки, например 5 (мА), С/П.

Iнmax=? Вводим наибольший ток нагрузки, например, 15 (мА). С/П.

Iстmin=? вводим наименьший ток стабилизации имеющегося стабилитрона, например, 5 (мА), С/П.

Uсmin=? Вводим наименьшее напряжение сети, например, 200 (В), С/П.

Uсmax=? Вводим наибольшее напряжение сети, например, 240 (В), С/П.

2Uпул=?. Вводим двойное напряжение (размах)пульсаций, например, 0,25 (В), С/П.

Cгас=? Получаем расчётную ёмкость гасящего конденсатора, 3,6138358*10^-1мкФ. Вводим ближайшее стандартное значение, например, 0,39 (мкФ), С/П.

Получаем наибольший ток стабилитрона, Iстmax=26,040857, то есть примерно 26 мА. С/П.

Cф=? Получаем расчётную ёмкость фильтрующего конденсатора, 400 мкФ. Вводим стандартное значение, 470 (мкФ), С/П.

Получаем реальный размах пульсаций, 2Uпул= 2,1276596*10^-1, то есть, примерно 0,21В. С/П. Можно рассчитывать заново.

В качестве гасящего конденсатора можно применить бумажный или плёночный конденсатор, но не электролитический. Рабочее напряжение гасящего конденсатора должно быть не менее 400В (для сети 220В). Рабочее напряжение выпрямительных диодов также должно быть не менее 400В (для сети 220В). Рабочее напряжение фильтрующего конденсатора должно с запасом превышать выходное напряжение. Для описанного примера, выходное напряжение равно 9В, ближайшее большее стандартное напряжение равно 10В; нужно выбрать следующее стандартное напряжение, 16В.
Схемы выпрямителей изображены на рисунках.

Рис. 1. Однополупериодная схема выпрямителя.

Рис. 2. Двухполупериодная схема выпрямителя.

Расчёт качества обслуживания (61, 152)

Это одна из основных формул теории массового обслуживания - первая формула Эрланга. Пучок приборов (например кассовых аппаратов) конечной ёмкости обслуживает требования от бесконечного количества источников нагрузки (например клиентов). Требования на облуживание соответствуют закону распределения вероятностей Пуассона.

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

           N
          A / N!
E (A) = ----------
 N        N
         ---  i
          \  A 
          / ----
         --- i!
         i=0

N - число линий в пучке, А - поступающая нагрузка в Эрлангах (среднее число занятых линий в час наибольшей нагрузки)

Программа считает по рекуррентной формуле:

                      AE(N-1)(A) 
E0(A) = 1 ; EN(A) = --------------
                    N + AE(N-1)(A)

Текст программы

     0     1     2     3     4     5     6     7     8     9
00   ПП    19    ПП    27    ИП0   -     Fx<0  02    ИП2   ИП4
10   С/П   ПП    19    ПП    27    FL0   13    БП    10    П1
20   XY    П0    0     П4    1     П2    В/О   КИП4  ИП2   ИП1
30   *     ^     ИП4   +     /     П2    В/О

Регистры:
П0 - содержит требуемую вероятность отказа или число приборов в пучке (зависит от задачи)
П1 - содежит поступающую нагрузку на пучёк приборов
П2 - регистр накопления результата
П4 - регистр счётчик приборов в пучке

Прграмма содержит две подпрограммы: подпрограмму ввода исходных данных (адр. 19..26) и подпрограмму расчета одной итерации формулы Эрланга (адр. 27..36). В первой задаче цикл вычислений (адр. 02..07) выполняется до тех пор пока полученная вероятность не окажется меньше либо равна заданной. Затем подготовка данных к выводу (адр. 08, 09) Во второй задаче количество приборов заранее известно, потому расчёт происходит в явном цикле (адр. 13..16).

После ввода программы БП 11
*******************
Задача: Известна нагрузка и ёмкость пучка приборов. Найти вероятность отказа в обслуживании.

Ввод данных: (Емкость пучка) [^] (нагрузка) [С/П]

Результат: (фактич. вероятность отказа)

Пример: E30(20) = 8.4574979e-3
*******************
Задача:
Известна нагрузка и максимальная вероятность отказа.
Определить необходимое количество приборов в пучке

Ввод данных: [В/О] (требуемая вероятность отказа) [^] (нагрузка) [С/П]

Результат: (емкость пучка) [XY] (фактич. вероятность отказа)

Пример: EN(20)<= 0.02 Результат: N = 28 [XY] E28(20) = 1.87924e-2

Расчёт лампового предусилителя (161)

Программа рассчитывает номиналы некоторых деталей и основные параметры резистивного лампового усилителя на триоде. Методика расчёта широко описана в различной справочной литературе, например, в книге Д. А. Климова "Ламповые усилители. Методика расчёта и проектирования".

Внимание! Первоначально принятая точность промежуточных расчётов (1/1000), от которых зависит точность расчёта уровня 2-й и 3-й гармоники, а также коэффициента нелинейных искажений, оказалась недостаточной. Из-за этого, особенно была велика погрешность расчёта уровня 3-й гармоники, хотя точность расчёта уровня 2-й гармоники и общего коэффициента нелинейных искажений была вполне приемлемой.

После экспериментов, точность промежуточных расчётов была повышена до 1/100000, однако при этом увеличилось время расчёта. Дальнейшее повышение точности незначительно сказалось на точности расчёта уровня 2-й и 3-й гармоники и коэффициента нелинейных искажений. Новый файл программы выложен вместо старого.

Схемы усилителя представлены на рисунках.

Программу загружать с 0-й страницы. В/О, С/П, С/П, С/П.

Сначала вводим параметры лампы из справочника, например 6Н1П(двойной триод, в схеме используется один).

Uа=? Вводим напряжение анода, 250 (В), С/П.

Iа=? Вводим ток анода, 7,5 (мА), С/П.

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

-Uс=? Вводим абсолютное значение отрицательного напряжения сетки, 0(В, параметр не указан), С/П, то есть если в справочнике указано, например, Uс=-1,5В, программе надо указывать 1,5.

-Uст=? Наименьшее абсолютное значение отрицательного напряжения сетки, при котором появляется сеточный ток. Этот параметр в справочной литературе приводится редко, у большинства маломощных ламп сеточный ток появляется при напряжении на сетке выше -1В. Вводим 1(В), С/П.

Rк=? Вводим сопротивление катодного резистора, 0,6(кОм), С/П.

u=? Вводим коэффициент усиления лампы, 35, С/П.

Pад=? Вводим наибольшую мощность, рассеиваемую анодом, 2,2(Вт), С/П, С/П.

Теперь задаём рабочую точку лампы.

Iао=? Вводим рабочий ток анода, например, 10(мА), С/П.

-Uсо=? Вводим абсолютное значение отрицательного сеточного напряжения смещения, например, 2(В), С/П, С/П.

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

Получаем расчётные данные схемы.

Uа=182,05577, напряжение на аноде равно примерно 182В, С/П.

Rа=? 37,351923, оптимальное сопротивление нагрузки равно примерно 37кОм, но можно ввести другое, например, 22(кОм), С/П.

Eа=402,05577, напряжение питания схемы порядка 400В! С/П.
Если напряжение питания кажется слишком большим, уменьшите ток анода, сопротивление нагрузки, напряжение сеточного смещения, либо выберите другую лампу.

PRа=2,2 мощность рассеиваемая на анодном резисторе равна 2,2Вт, С/П.

Rк=2*10^-1, сопротивление катодного резистора автоматического смещения равно 0,2 кОм, С/П.
Если предполагается применить фиксированное смещение, то катодный резистор можно исключить, а напряжение смещения подавать через сопротивление утечки сетки.
Наличие катодного резистора уменьшает усиление схемы.

PRк=2*10^-2 мощность рассеиваемая на катодном резисторе равна 0,02Вт, С/П.

Ku=26,127925, коэффициент усиления схемы по напряжению примерно равен 26, С/П.

A=1,2375266, коэффициент влияния местной отрицательной обратной связи, возникающей из-за катодного резистора. То есть при наличии катодного резистора усиление схемы(а также нелинейные искажения, см. ниже) уменьшается примерно в 1,24 раза. С/П.

2Uвх=2, наибольший размах входного напряжения равен 2В, С/П. Немного ждём, программа рассчитывает промежуточные результаты...

Точность промежуточных расчётов задаётся числом, записанным по адресу 0243 программы. По этому адресу записано число 5, точность равна 1/100000 (раньше было 3, точность 1/1000). При желании, точность промежуточных расчётов можно дополнительно увеличить.

2Uвых=52,243827, наибольший размах выходного напряжения равен примерно 52В, С/П.

y2=-52,004084, уровень второй гармоники равен примерно -52дБ, С/П.

y3=-75,263685, уровень третьей гармоники равен примерно -75дБ, С/П.

Kг=2,5166252*10^1, общий коэффициент нелинейных искажений порядка 0,25%. Неплохо! С/П, С/П.
Коэффициент нелинейных искажений зависит от уровня сигнала. При меньшем уровне входного сигнала искажения пропорционально уменьшатся.
Реальный уровень искажений будет в полтора-два раза выше, из-за неидеальности характеристик и разброса параметров ламп.
Можно схему рассчитывать заново.

Для другой лампы параметры схемы будут иными.

Например, для лампы 6Н23П:
-исходные данные: Uа=100В, Iа=15мА, -Uс=9В, -Uст=1,5В Rк=0,68кОм, u=32, Pа=1,8 Вт.
-рабочая точка: Iао=10мА, -Uс0=2,5В.
-расчётные данные: Uа=127В, Rа=15,67кОм, пусть будет 15кОм, Eа=277В, PRа=1,5Вт, Rк=0,25кОм, PRк=0,025Вт, Ku=26,5, A=1,44, 2Uвх=2В, 2Uвых=52,9В, y2=-51,8дБ, y3=-71,8дБ, Kг=0,258%.

Программа рассчитывает основные параметры усилителя на ламповом триоде. Расчёт усилителя с использованием параметров тетродов и пентодов приведёт к ошибочным результатам, а расчётные цифры могут оказаться самыми неожиданными.

Расчёт линейных электрических цепей (161)

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

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

Здесь выложено несколько доработанных программ из третьего издания справочника В. П. Дьяконова с подсказками в строке комментариев.

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

Пересчёт треугольника в звезду:

0, В/О, С/П.

Вводим: Rac=10 Ом, С/П, Rab=20 Ом, С/П, Rbc=30 Ом, С/П.

Получаем: Ra=3,3333333Ом, С/П, Rb=10 Ом, С/П, Rc=5 Ом.

Пересчёт звезды в треугольник:

1, В/О, С/П.

Вводим: Ra=3,3333333Ом, С/П, Rb=10 Ом, С/П, Rc=5 Ом, С/П.

Получаем: Rac=10 Ом, С/П, Rab=20 Ом, С/П, Rbc=30 Ом.

Программа 7.2. Расчёт ослабления мощности Т- и П-образными аттенюаторами.

В/О, С/П.

Вводим: Rи=100 Ом, С/П, R1=75 Ом, С/П, R2=38 Ом, С/П, R3=19 Ом, С/П, Rн=50 Ом, С/П.

Получаем: Gт=11,46924дБ, С/П, Gп=14,559762дБ.

Программа 7.3. Расчёт сопротивлений R1, R2, R3 Т- И П-образных аттенюаторов по заданному в N раз ослаблению.

В/О, С/П. 1/0? Для расчёта Т-образного аттенюатора нужно ввести 1, для расчёта П-образного - нужно ввести 0.

Расчёт сопротивлений Т-образного аттенюатора:

Вводим: 0, С/П, Rи=200 Ом, С/П, Rн=100 Ом, С/П, N=50, С/П.

Получаем: R1=167,34694 Ом, С/П, R2=40,816327 Ом, С/П, R3=63,265306 Ом.

Расчёт сопротивлений П-образного аттенюатора:

Вводим: 1, С/П, Rи=100 Ом, С/П, Rн=50 Ом, С/П, N=100, С/П.

Получаем: R1=136,14661 Ом, С/П, R2=350,01786 Ом, С/П, R3=56,989658 Ом.

Программа 7.4. Расчёт сопротивлений аттенюаторов четырёх типов (1-П-образного, 2-Т-образного, 3-мостового, 4_комбинированного) для заданного входного и выходного сопротивления по заданному в неперах ослаблению.

В/О, С/П.

Вводим: Z=100 Ом, A=1 неп.

Получаем:

1. R=117,52012, С/П, 2W=216,39534, С/П.
2. R/2=46,211716, С/П, W=85,091813, С/П.
3. R=46,211716, С/П, W=216,39534, С/П.
4. K=1,7182818, С/П, ZK=171,82818, С/П, Z/K=58,197671.

Примечание: 1 непер равен 8,5858896дБ.

Программа 7.5. Расчёт частоты среза для простейших пассивных фильтров НЧ и ВЧ, а также коэффициента передачи A и фазового сдвига ф на заданной частоте f.

В/О, С/П, 0НЧ/ВЧ? Если рассчитываем ФНЧ вводим 0, если ФВЧ - 1, С/П.

Расчёт ФНЧ:

Вводим: 0, С/П, R=100 кОм, С/П, C=0,001 мкФ, С/П. Получаем частоту среза f=1,5915494 кГц. Далее, вводим произвольную частоту f=2 кГц, С/П.

Получаем: A=0,62267699, С/П, ф=-51,488113 град, С/П. Можно вводить новые значения частоты и получать коэффициенты А и ф.

Расчёт ФВЧ:

Вводим: 1, С/П, R=100 кОм, С/П, C=0,001 мкФ, С/П. Получаем частоту среза f=1,5915494 кГц. Далее, вводим произвольную частоту f=2 кГц, С/П.

Получаем: A=0,78247899, С/П, ф=38,511887 град, С/П.

Программа 7.6. Расчёт средней частоты среза пассивного полосового фильтра, а также коэффициента передачи A и фазового сдвига ф на заданной частоте f.

В/О, С/П.

Вводим: R=100 кОм, С/П, C=0,001 мкФ, С/П. Получаем среднюю частоту среза f=1,5915494 кГц. Далее, вводим произвольную частоту f=5 кГц, С/П.

Получаем: A=0,24274329, С/П, ф=-43,261797 град, С/П. Можно вводить новые значения частоты и получать коэффициенты А и ф.

Программа 7.7. Расчёт частоты максимума коэффициента передачи моста Вина-Робинсона, а также коэффициента передачи A и фазового сдвига ф на заданной частоте f.

В/О, С/П.

Вводим: R=100 кОм, С/П, C=0,001 мкФ, С/П. Получаем частоту максимума коэффициента передачи f=1,5915494 кГц. Далее, вводим произвольную частоту f=5 кГц, С/П.

Получаем: A=-0,22844432, С/П, ф=46,738203 град, С/П. Можно вводить новые значения частоты и получать коэффициенты А и ф.

Программа 7.8. Расчёт частоты подавления двойного Т-образного моста, а также коэффициента передачи A и фазового сдвига ф на заданной частоте f.

В/О, С/П.

Вводим: R=100 кОм, С/П, C=0,001 мкФ, С/П. Получаем частоту подавления f=1,5915494 кГц. Далее, вводим произвольную частоту f=5 кГц, С/П.

Получаем: A=-0,57664957, С/П, ф=54,784765 град, С/П. Можно вводить новые значения частоты и получать коэффициенты А и ф.

Программа 7.9. Расчёт резонансной частоты последовательного LCR-контура, действительной x, и мнимой y составляющихмодуля полного сопротивления |z| и фазового сдвига O.

В/О, С/П.

Вводим: R=100 Ом, С/П, L=2Гн, С/П, C=0,1 мкФ, С/П. Получаем частоту f=355,88127Гц. Далее, вводим произвольную частоту f=400 Гц, С/П.

Получаем: x=100 Ом, С/П, y=1047,6747 Ом, С/П, z=1052,4363 Ом, С/П, O=84,547666 град, С/П. Можно вводить новые значения частоты и получать значения x, y, z, O.

Программа 7.10. Расчёт резонансной частоты параллельного LCR-контура, действительной x, и мнимой y составляющихмодуля полного сопротивления |z| и фазового сдвига O.

В/О, С/П.

Вводим: R=100 Ом, С/П, L=2Гн, С/П, C=0,1 мкФ, С/П. Получаем частоту f=355,88127Гц. Далее, вводим произвольную частоту f=400 Гц, С/П.

Получаем: x=99,997256 Ом, С/П, y=-0,52382296 Ом, С/П, z=99,998628 Ом, С/П, O=-0,30013394 град, С/П. Можно вводить новые значения частоты и получать значения x, y, z, O.

Программа 7.11. Расчёт резонансной частоты резонансног контура, действительной x, и мнимой y составляющихмодуля полного сопротивления |z| и фазового сдвига O.

В/О, С/П.

Вводим: R1=1000 Ом, С/П, R2=100 Ом, С/П, L=2Гн, С/П, C=0,1 мкФ, С/П. Получаем частоту f=355,88127Гц. Далее, вводим произвольную частоту f=400 Гц, С/П.

Получаем: x=204,40993 Ом, С/П, y=1016,0982 Ом, С/П, z=1036,455 Ом, С/П, O=78,625545 град, С/П. Можно вводить новые значения частоты и получать значения x, y, z, O.

Программа 7.12. Расчёт резонансной частоты связанных контуров, расстройки E, при заданной частоте f и относительного коэффициента передачи K(E).

Вводим: Pсв=2, С/П, L=1000 мкГн, С/П, C=1000 пФ, С/П, Q=100, С/П. Получаем частоту f=0,15915494 МГц. Далее, вводим произвольную частоту f=0,16 МГц, С/П.

Получаем: K(E)=1,1314698, С/П, E=1,0591255. Можно вводить новые значения частоты и получать значения K(E), E.

Ну вот и всё! Как говорится, всё новое - это очень хорошо забытое старое!

Расчёт линий передач и задержки (161)

Программы помогут рассчитать различные линии передачи и задержки.

Доработанные программы из третьего издания справочника В. П. Дьяконова с подсказками в строке комментариев.

Программа 7.49. Расчёт линий в виде круглого проводника диаметром d:

1. Расположенного, в середине между проводящими плоскостями, находящимися на расстоянии D друг от друга, K=1,27.

2. Помещённого в экран с квадратным сечением и стороной его D, K=1,08.

3. Помещённого в экран с круглого сечения с диаметром D, K=1 ( коаксиальная линия ).

4. Расположенного на биссектрисе прямого угла, образованного двумя полубесконечными проводящими плоскостями, на расстоянии D/2 от каждой плоскости, K=1,4.

В/О, С/П.

Вводим: Eд=1, С/П, K=1, С/П, z=100 Ом, С/П.

Получаем: x=D/d=5,2944901.

Программа 7.50. Расчёт ширины полоски W и v/c ( c - скорость света в вакууме ) несимметричной полосковой линии.

В/О, С/П.

Вводим: z=75 Ом, С/П, h=1 мм, С/П, t=0,05 мм, С/П, Eд=4,7, С/П.

Получаем: v/c=0,58699727, С/П, W=0,2651163 мм, С/П.

Программа 7.50a. Расчёт ширины полоски W и v/c симметричной полосковой линии.

В/О, С/П.

Вводим: z=50 Ом, С/П, b=2,5 мм, С/П, t=0,5 мм, С/П, Eд=4,7, С/П.

Получаем: v/c=0,4612656, С/П, W=0,34932502 мм, С/П.

Программа 7.51. Расчёт диаметра d внутреннего проводника коаксиальной линии, смещённого относительно внешнего проводника, с отверстием диаметром D на расстоянии l.

В/О, С/П.

Вводим: D=1 см, С/П, l=0,25 см, С/П, z=100 Ом, С/П, Eд=1, С/П, С/П, С/П, С/П.

Получаем: d=0,1403 см.

Каждое очередное нажатие на клавишу С/П даёт следующий десятичный знак.

Программа 7.52. Расчёт параметра x = a/d линии в виде двух одинаковых проводников диаметром d расположенных на расстоянии a друг от друга.

В/О, С/П.

Вводим: z=300 Ом, С/П, Eд=1, С/П.

Получаем: x=a/d=6,1322895.

Программа 7.53. Расчёт параметра x = D/d линии в виде круглого проводника диаметром d расположенного на расстоянии D от проводящей плоскости.

В/О, С/П.

Вводим: z=300 Ом, С/П, Eд=1, С/П.

Получаем: x=D/d=74,209949.

Программа 7.54. Расчёт расстояния a между двумя проводниками линии в виде двух проводников с диаметром d, расположенных на расстоянии D от проводящей плоскости.

В/О, С/П.

Вводим: D=1,5 см, С/П, d=0,1 см, С/П, z=200 Ом, С/П, Eд=1, С/П, С/П, С/П, С/П.

Получаем: a=0,275 см.

Каждое очередное нажатие на клавишу С/П даёт следующий десятичный знак.

Программа 7.55. Расчёт расстояния a между двумя проводами линий с диаметром d1 и d2, расположенными в свободном пространстве.

В/О, С/П.

Вводим: d1=0,1 см, С/П, d2=0,05 см, С/П, z=300 Ом, С/П, Eд=1, С/П.

Получаем: a=0,43433843.

Программа 7.56. Расчёт n для линии со спиральным проводником с внешним диаметром d, расположенным внутри проводящего экрана с внутренним диаметром D.

В/О, С/П.

Вводим: Fw=4, С/П, d=0,5 см, С/П, D=1 cм, С/П.

Получаем: n=3,3521454.

Программа 7.57. Расчёт искусственной линии задержки, построенной на основе многозвенных LC-фильтров K- или M-типа по заданному волновому сопротивлению zл, времени задержки tз и длительности фронта tз.

В/О, С/П, 0K/1M? Если нужно рассчитать линию задержки на фильтрах K-типа, вводим 0, M-типа - 1.

Вводим: 1, С/П, zл=600 Ом, С/П, tз=1 мкс, С/П, tф=0,05 мкс, С/П.

Получаем: n=84,076156.

Вводим уточнённое значение: n=85, С/П.

Получаем: C=16,339869 пФ, С/П, L=5,8823529 мкГн.

Рассчитаем аналогичную заводской ЛЗЯС-0,7/1500 линию задержки яркостного канала цветного телевизора, построенную на основе многозвенного LC-фильтра K-типа с волновым сопротивлением 1500 Ом, временем задержки 0,7 мкс и длительностью фронта 0,09 мкс.

В/О, С/П.

Вводим: 0, С/П, zл=1500 Ом, С/П, tз=0,7 мкс, С/П, tф=0,09 мкс, С/П, n=24, С/П.

Получаем: C=18,172378 пФ, С/П, L=40,88785 мкГн.

Программа 7.58. Расчёт модуля характеристического сопротивления линии |zл| на заданной частоте гармонического сигнала f, фазового сдвига ф и коэффициентов a и b постоянной распространения.

В/О, С/П.

Вводим: R=167 Ом/км, С/П, G=1,66x10^-6 сим/км, С/П, C=0,05x10^-6 Ф/км, С/П, L=0,49x10^-3 Гн/км, С/П, f=1000Гц, С/П.

Получаем: |zл|=729,15048 Ом, С/П, ф=-44,320544 град, С/П, a=0,16091029, С/П, b=0,16304025, С/П.

Можно вводить новое значение частоты f.

Программа 7.59. Расчёт модуля входного сопротивления |zвх|, составляющих Rвх и Xвх комплексного входного сопротивления линии zвх = Rвх + iXвх, коэффициента отражения |K0| и угла сдвига фаз ф линии заданной длины l, нагруженной на комплексное сопротивление zн = Rн + iXн.

В/О, С/П.

Вводим: zл=75 Ом, С/П, R=50 Ом, С/П, Xн=30 Ом, С/П, a=0,01 Нп/м, С/П, b=1рад/м, С/П l=0,31416 м, С/П.

Получаем: |zвх|=82,343297 Ом, С/П, Rвх=68,888018 Ом, С/П, Xвх=45,109417 Ом, С/П, |K0|=0,3037835, С/П, ф=2,0299896 рад.

Можно вводить новое значение длины линии l.

Расчёт умножителя напряжения (161)

Несложная программа поможет рассчитать последовательный умножитель напряжения. Расчётные соотношения приведены в статье Д. Садченкова в журнале "Радио" №10 за 2000 год.

Схема умножителя показана на рисунке.

Программа предполагает, что на вход умножителя подаётся меандр!

Программу надо загружать с 0-й страницы. В/О, С/П.

Uвх=? Вводим входное напряжение, например, 300(В), С/П.

Uн=? Вводим напряжение на нагрузке, например, 1000(В), С/П.

Iн=? Вводим ток нагрузки, например, 1(мА), С/П.

fр=? Вводим рабочую частоту входного напряжения, например, 0,05(кГц), С/П.

rв=? 50 Программа рассчитывает предварительное значение выходного сопротивления умножителя, но можно ввести другое значение, например, 60(кОм), С/П.

N=? 4 Расчётное число ступеней умножения, внимание, если число ступеней получается нецелым, то программа округляет до ближайшего большего целого значения. Также можно ввести своё количество ступеней умножения. С/П.

С=? 2,8333333 Расчётная ёмкость конденсаторов умножителя, вводим реальное значение, например, 2,2(мкФ), С/П.

Uхх=1200 Выходное напряжение холостого хода равно 1200В, С/П.

UН=1122,7273 Выходное напряжение под расчётной нагрузкой равно примерно 1123В, С/П.

rв=77,272727 Выходное сопротивление умножителя равно примерно 77,3кОм, С/П.

Uобр=660 Обратное напряжение диодов и рабочее напряжение конденсаторов умножителя должны быть не меньше 660В! С/П.

Можно рассчитывать заново.

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

При изготовлении умножителя нужно учесть некоторые ограничения:

- Входное напряжение не более 15кВ! Однако, труднодоступность диодов (выпрямительных столбов) с обратным напряжением более 10-12кВ, ограничивают на практике входное напряжение умножителя на уровне 5кВ.
- Частота переменного напряжения должна быть в пределах 5-100кГц! При работе с частотами ниже 5 кГц потребуются конденсаторы внушительных габаритов(и стоимости!). Верхний предел входной частоты недорогие диоды ограничивают на уровне 20-50кГц.
- Выходное напряжение не более 150кВ! Напряжение порядка 150кВ может понадобиться разве что для питания рентгеновских трубок... На практике вряд ли понадобятся напряжения выше 50кВ(для люстры Чижевского нужно порядка 40кВ).
- Выходная мощность не более 50Вт. Мощность высоковольтного источника питания кинескопа цветного телевизора составляет порядка 30Вт. Хотя, при большом желании, можно построить умножитель и на 200Вт.

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

Расчет ускорения силы тяжести g (152)

Как известно, в настоящее время при решении ЕГЭ по физике принимается, что ускорение свободного падения имеет значение ровно 10 м/с2. Поскольку для сдачи ЕГЭ требуется лишь формальное соответствие "правильному" ответу, это вызывает немало глупых ошибок и потерянных баллов у грамотных школьников.
Изучавшие физику чуть раньше скажут, что g равно 9,8 или 9,81 м/с2. В справочниках можно встретить нормальное значение ускорения силы тяжести, равное 9,80665 метров в секунду за секунду (или 980,665 см/сек2). Это значение фигурирует и в таблицах констант некоторых зарубежных научных и программируемых калькуляторов.
Рассмотрим, чему оно равно на самом деле.

Если пренебречь влиянием местных предметов, рельефом местности и особенностями геологического строения, то ускорение силы тяжести g, выраженное в см/сек2, описывается формулой [1]:

g = 978,049 × (1 + 0,005288 sin2φ - 0,000006 sin2 2φ),
где φ - географическая широта.

При подъеме над уровнем моря на каждый километр подъема g убывает примерно на 0,0003 своей величины.
В [1] приведена таблица для некоторых географических пунктов.

 	g, см/сек2	φ
Экватор                 978,05	0°
Ташкент                 980,08	41°12,5'
Одесса                  980,76	46°28,6'
Москва                  981,56	55°45,3'
Ленинград *             981,93	59°50,5'
Северный и Южный полюсы 983,22	90°
 
* В настоящее время - Санкт-Петербург

Ускорение силы тяжести на двух гравиметрических станциях можно сравнить с большей точностью, чем измерить его величину на каждой станции в отдельности. Поэтому гравитационная сетка на земной поверхности основана на относительных измерениях g на станциях, которые связаны с одной определенной станцией, причем для последней предполагается, что величина g установлена весьма точно. Основной международной гравиметрической станцией считается Потсдамский геодезический институт, где g было определено в результате работ Кюнена и Фуртвенглера при помощи оборотных маятников типа Катера. Более поздние вычисления были сделаны этим же методом Хейлем и Куком в Национальном Бюро Стандартов в Вашингтоне, Кларком в Национальной физической лаборатории США и Агалецким и Егоровым в Метрологическом институте в Ленинграде.

Результаты этих измерений таковы [2] (см/сек2):

                               ТеддингтонВашингтонЛенинградПотсдам
Кюнен и Фуртвенгрер            -         -        -        981,274
Хейль и Кук                    -         980,082  -        981,256
Кларк                          981,183   -        -        981,262
Агалецкий и Егоров             -         -        981,919  981,262

Последние три величины в колонке "Потсдам" были выведены из абсолютных измерений и из относительных разностей. Международный союз геодезии и геофизики рекомендовал (1957 г.) уменьшить результаты измерений ускорения силы тяжести, основанные на значении 981,274 для Потсдама, на величину 0,010-0,012 см/сек2.

Было выполнено несколько сотен тысяч относительных измерений ускорения силы тяжести. Наиболее точным является измерение с помощью пружинного гравиметра, который в благоприятных условиях дает точность более чем 1•10-7.

В 1930 г. Международный союз геодезии и геофизики принял для определения g в зависимости от географической широты места наблюдения и его высоты над уровнем моря формулу [2]:

g = 978,049 × (1 + 0,0052884 sin2φ - 0,0000059 sin2 2φ) - 0,0003086 H,
где φ - географическая широта; H - высота в метрах.

Измерения g в зависимости от φ, даваемые этой формулой, соответствуют эллипсоиду, сплюснутость которого равна 1/297.
Все величины, даваемые формулой, вычислены для значения g=981,274 см/сек2 в Потсдаме, поэтому они нуждаются в уменьшении на 0,011, чтобы соответствовать последним определениям.
Приведенная выше формула дает наиболее простой способ вычисления g в том месте, где оно не было измерено непосредственно. Этот расчет почти всегда дает результаты с точностью до 0,1, а иногда - до 0,05 см/сек2. Соответствие с наблюдением обычно ухудшается в результате применения поправок по топографическим данным. Если эти данные относятся к проекциям на бесконечную горизонтальную плоскость, то величина поправки равняется 0,04191•10-3 Hρ см/сек2, где ρ обозначает плотность в г/см3, а H - высоту в метрах.

Расчет g на ЭВМ

Для упрощения программы не будем учитывать высоту над уровнем моря. Таким образом, для рачета ускорения потребуется только одна исходная величина - широта места наблюдения φ. Более привычно определять ее в градусах, минутах и секундах. Тем более, что навигаторы GPS и ГЛОНАСС выдают такие значения. Исходя из этого составим программу длиной 26 байт, текст которой приведен ниже.

 	x0	x1	x2	x3	x4	x5	x6	x7	x8	x9

0x	К МС→Г	П А	0	РР П	90	45	ИП А	F sin	F x2	ИП 2
1x	×	ИП А	2	×	F sin	F x2	ИП 3	×	-	1
2x	+	ИП 1	×	С/П	БП	00

Перед началом работы следует загрузить значения в регистры памяти:
R1 = 978,049 (или 9,78049 для получения значений в м/с2)
R2 = 0,0052884;
R3 = 0,0000059 (для набора проще нажать "5", "9", "ВП", "/-/", "7").

Для расчета следует ввести значение широты - число в формате "ГГ,ММССсс", где Г - градусы, М - минуты, С - секунды, с - доли секунды. После ввода нажать "В/О", "С/П". После останова программы считать значение ускорения силы тяжести с индикатора ЭВМ из регистра X.

Программа достаточно проста, пояснений требуют, пожалуй, только две команды. Команда "К МС→Г" по нулевому адресу преобразует число из формата "ГГ,ММССсс" в градусы и доли градуса. Именно с такими значениями оперируют тригонометрические функции ЭВМ.

Расположенная следом команда "РРП 9045" обращается к функции установки размерности аргумента для тригонометрических функций. При записи числа 0 устанавливается размерность - градусы. При использовании этой функции пользователь застрахован от получения неверных результатов даже в том случае, если он забудет установить нужную размерность клавишей "Р-ГРД-Г" перед запуском программы.

Взято с http://mk.semico.ru/dr_info10.htm

Расчет фазоинвертора АС (34, 61)

Фазоинвертор с установленной в нем головкой можно представить с некоторыми упрощениями, как акустический фильтр верхних частот (ФВЧ). Расчет его довольно сложен, так как требует учета большого числа параметров, обеспечивающих наилучшую равномерность АЧХ громкоговорителя.

Для расчета необходимо измерить смещение (провес) звуковой катушки головки Д (в миллиметрах) под действием груза из немагнитного материала массой М=0,2...0,4 кг, положенного на диффузор в месте его соединения катушкой. Делают это с помощью полоски масштабно-координатной бумаги марки H1 ("миллиметровки"), отмечая удаление какой-либо отметки на диффузоре от линейки, положенной на диффузородержатель. Измерять смещение диффузора следует с большой тщательностью, поскольку оно обычно не превышает 1...2 мм (для примера, диффузор головки 8ГД-1РРЗ смещается под действием груза массой 0.2 кг всего на 1 мм). Затем находят гибкость подвижной системы Сг=10-4/DМ (в метрах на ньютон), объем ящика фазо-инвертора V=0,875CяD4эфф (в литрах), где Ся - гибкость воздуха в ящике, равная 0,7Сг (в метрах на ньютон), а Dэфф - эффективный диаметр диффузора (в сантиметрах), равный 0,76...0,82Dном. Длину прохода L находят из соотношения (4L+3,4d)/d2=34З2d2/4pVfo. где L и d - соответственно длина и диаметр туннеля фазо-инвертора (в метрах), V - объем ящика (в кубических метрах), fo - резонансная частота головки (в герцах). Выбирая длину L (рис. 1), следует иметь в виду, что расстояние от конца туннеля до задней стенки ящика должно быть не менее 40 мм, причем сама длина L не должна превышать 0,1 длины волны, соответствующей резонансной частоте fo головки, т. е. необходимо выполнить условие: L(мм)<3400/fo (Гц). Если расчетная длина прохода окажется слишком большой, задаются меньшим его диаметром, с тем чтобы указанные выше условия соблюдались.

При расчете на микрокалькуляторе вначале записывают в него программу 1, затем заносят в регистры P1, P2, РЗ, Р4 и Р5 исходные данные: массу груза М (в килограммах), смешение катушки D (мм), диаметр диффузора Dном (см), диаметр прохода d (мм) и резонансную частоту fo (Гц). После этого нажимают на клавиши В/О и С/П и через несколько секунд считывают с табло калькулятора длину прохода, а из регистра Р6 извлекают объем фазоинвертора в литрах.

Пример.
Рассчитать фазоинвертор. в котором установлена головка 4ГД-35 с диаметром диффузора Dном=20cм и резонансной частотой fо=65Гц. Груз массой 0,2 кг вызывает смещение звуковой катушки на расстояние D=1,5 мм. Диаметр прохода d выбираем равным 0,05 м. Записав программу в калькулятор, заносим исходные данные в регистры памяти: 0,2 П1, 1,5 П2, 20 П3, 0,05 П4, 65 П5. Затем нажимаем на клавиши В/О и С/П и, дождавшись остановки расчета, читаем на табло длину прохода: L=6,6х10-2 м. Проверяем условие: L<3400/fo. Если на табло высвечивается сочетание "ЕГГОГ" (ошибка). то условие не выполняется и необходимо уменьшить диаметр прохода, если же получилось некоторое число, то условие выполняется. Нажимаем клавишу С/П - на табло число 52,3, значит, условие выполняется. Из регистра ИП6 извлекаем объем фазоинвертора V=13 л.

Журнал "Радио" №5-1987
Сайт "Радиофанат"

Расчет частотных характеристик цифровых систем с конечной импульсной характеристикой (52,61)

Приведенная ниже программа предлагается для расчета частотных характеристик цифровых систем с конечной импульсной характеристикой, а именно: реальной R(ω) и мнимой I(ω) части частотной характеристики цифровой системы H(jω), ее модуля H(ω) – амплитудно-частотной характеристики (АЧХ) и аргумента φ(ω) – фазо-частотной характеристики (ФЧХ).

    x0    x1    x2    x3    x4    x5    x6    x7    x8    x9
0x  П→Х0  1     +     Х→П0  КП→Х0 Fx≠0  17    П→Х0  1     -
1x  П→Ха  х     Fcos  x     П→Хd  +     Х→Пd  FL0   00    П→Хd
2x  С/П   П→Х0  1     +     Х→П0  КП→Х0 Fx≠0  39    П→Х0  1       
3x  -     П→Ха  х     Fsin  x     П→Хe  ↔     -     Х→Пe  FL0    
4x  21    П→Хe  С/П   Fx2   П→Хd  Fx2   +     F√    С/П   П→Хd   
5x  Fx<0  63    П→Хe  Fx>0  59    КППb  Fpi   +     С/П   КППb  
6x  Fpi   -     С/П   КППb  С/П   П→Хe  П→Хd  ÷     Ftg-1  B/O  

Перед началом работы с программой нужно ввести исходные данные в следующие регистры:

После запуска программы (В/О, С/П) последовательно вычисляется R(ω), I(ω), H(ω), φ(ω). После каждого этапа происходит останов ПМК, с индикацией результата вычислений (для φ(ω) он в радианах), для продолжения программы необходимо нажать С/П, а после расчета R(ω) необходимо еще раз ввести в регистр Rg 0 количество элементов последовательности.

Для повторного использования кода, в дополнение к вышеизложенному, следует предварительно обнулить регистры Rg d (R(ω)) и Rg e (I(ω)).

Статистическая обработка результатов измерений (52, 61)

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

	0	1	2	3	4	5	6	7	8	9
00	Cx	П1	П2	П3	П4	П5	ИП5	С/П	­^	ИП1
10	+	П1	XY	Fx2	ИП2	+	П2	ИП1	Fx2	КИП5
20	Fo	ИП5	/	-	­^	ИП5	1	-	Fx!=0	38
30	/	Fsqr	П3	Fo	ИП5	/	Fsqr	П4	ИП1	ИП5
40	/	П0	БП	06						

Инструкция: Перед каждой серией опытов дать команды В/О, С/П. Затем очередной результат измерений в РХ, С/П. После останова на индикаторе номер текущего опыта.

Информация содержится в следующих регистрах:
ИП0 – математическое ожидание (среднее арифметическое)
ИП1 – сумма значений
ИП2 – сумма квадратов
ИП3 – среднеквадратическое отклонение 1 - сигма (n-1)
ИП4 – среднеквадратическое отклонение 2 - сигма (n)
ИП5 – номер следующего опыта

Ну и файл программы для калькулятор3000(старый вариант)

Таблица ASCII (152)

Поздравляю всех любителей ЭКВМ с наступившим 2008 годом и публикую первую в этому году программу для МК-152.

Исторически сложилось, что «таблицей ASCII» называется хэк (hack), выводящий на экран все символы, поддерживаемые дисплеем. Сервисная программа «Таблица ASCII» позволяет выводить на графический экран МК-152 символы всех трёх шрифтов ЭКВМ (клавиши 0, 1 и 2), а также их шестнадцатеричные коды (клавиша /-/). Поскольку экран маленький, для выбора отображаемой части таблицы используются клавиши выбора.

Это моя первая программа, написанная прямо в компиляторе MK.EXE с использованием латинской транскрипции. Программа «Таблица ASCII» проверена на прошивке 1.03, но должна работать со всеми прошивками. Она должна быть загружена в страницы 0…2 и запускается клавишами В/О С/П.

Тестирование знания таблицы умножения и деления (CASIO fx-9750G, fx-9860G)

Программа написана мной для автоматизированного контроля знания таблицы умножения и деления у моего сына.

В начале программа спрашивает до какого числа проверяем (можно только на 2, можно 2 и 3, можно от 2 до 4, ..., можно от 2 до 9 и более)

После этого программа задает 20 примеров по очереди 1 на умножение и 1 на деление в выбранном диапазоне и подсчитывает правильные и ошибочные ответы. Число ниже - номер примера (от 1 до 20) В случае ошибки пример повторяется, пока не будет решён правильно. По получении 20 правильных решений программа выводит на экран сколько правильных и сколько неправильных решений.

Ребёнок был доволен что папа для него написал программу и тренировка помогла повысить его уровень знаний по математике! :D

Тригонометрические и обратные им функции (HP-17BII)

В интереса точности обратные тригонометрические функции поделены на несколько доменов, так работает быстрее полиномиальное преобразование. Функции ASIN и ACOS разбиты на два домена: [0,π/4] и [π/4,π/2]. Функция ATAN немножко сложнее; её домены: [0,~0.3927], [~0.3927,~1.1781], и [~1.1781,∞). Точность функции ATAN НАМНОГО лучше, чем приближение с помощью tangent рядов Тейлора (и потому НАМНОГО быстрее).

В последующих уравнениях: "∑" означает символ суммирования:

(В меню ALPHA:
[WXYZ][OTHER][MORE],
потом вторую кнопку)

"ANGLE" означает символ угла:

(В меню ALPHA:
[WXYZ][OTHER][MORE][MORE][MORE][MORE],
затем пятую клавишу)

DEGREES~RADIANS:
   DEG/180*PI=RAD


SIN,COS,D~R:
   IF(S(SIN):
      ∑(N:0:9:1:(-1)^N*
      ANGLE^(2*N+1)/FACT(2N+1))-SIN
   :
      IF (S(COS):
         ∑(N:0:9:1:(-1)^N*
         ANGLE^(2*N)/FACT(2N))-COS
      :
         DEG/180*PI-RAD
      )
   )


ASIN,ACOS,D~R:
   IF(NOT (S(DEG) OR S(RAD)):
      0*
      IF(X<.7071:
         L(R3:X)+
         IF(S(ASIN):
            L(R1:0)+L(R2:1)
         :
            L(R1=1)+L(R2=-1)
         )
      :
         L(R3:SQRT(1-SQ(X)))+
         IF(S(ASIN):
            L(R1=1)+L(R2=-1)
         :
            L(R1:0)+L(R2:1)
         )
      )
      +G(R1)*PI/2+G(R2)*(
      G(R3)+
      ∑(N:3:31:2:
      (FACT(N-2)*(G(R3))^N/
      (2^(N-2)*FACT((N-3)/2)*FACT((N-1)/2)*N)))
      )
      -
      IF(S(ASIN):
         ASIN
      :
         ACOS
      )
   :
      DEG/180*PI-RAD
   )


ATAN,D~R:
   IF(NOT (S(DEG) OR S(RAD)):
      0*
      IF(L(AA:ABS(SQ(X)-1)/(SQ(X)+1))<.7071:
         L(R1:.5)+
         L(R2:SGN(X-1)/2)+
         L(R3:G(AA))
      :
         L(R1:.5+SGN(X-1)/2)+
         L(R2:.5-G(R1))+
         L(R3:2*X/(SQ(X)+1))
      )
      +G(R1)*PI/2+G(R2)*(
      G(R3)+
      ∑(N:3:31:2:
      (FACT(N-2)*(G(R3))^N/
      (2^(N-2)*FACT((N-3)/2)*FACT((N-1)/2)*N)))
      )
      -ATAN
   :
      DEG/180*PI-RAD
   )

Примеры вычислений:

Sin(30°):
"CALC" уравнения для SIN, COS, затем нажмите:

30[DEG][RAD][STO][клавишу-angle][SIN]

Ответ = 0.5000

---------------------------------

Tan(45°):
"CALC" уравнения для SIN, COS, затем нажмите:

45[DEG][RAD][STO][клавишу-angle][SIN][COS][клавишу-деления]

Ответ = 1.0000

---------------------------------

ArcSin(0.5):
"CALC" уравнения для ASIN, ACOS, затем нажмите:

0.5[X][ASIN]

Ответ = 0.5236 радиан
Чтобы получить ответ в градусах, нажмите:

[STO][RAD][DEG]

Ответ = 30.000°

---------------------------------

Функция ArcTan работает также, как ArcSin и ArcCos, только вам надо "CALC" уравнение для ATAN, а не уравнения для ASIN, ACOS. Функции для вычисления синуса и косинуса работают лишь в первом квадранте.

Программы составлены W. B. Maguire II и опубликованы 26 сентября 2001 года на форуме Музея HP. Я всего лишь перевёл его инструкцию на русский язык.

Факторизация (разложение на простые множители) тремя способами (CASIO fx-9750G Plus)

Эта страница была утеряна месяца два назад в результате аварии на сервере и теперь мною восстановлена повторно.

Вариант 1 - Разложение на множители методом перебора

Самый простой метод с точки зрения реализации, целесообразно использовать для чисел размера примерно до 1020 Алгоритм имеет экспоненциальную сложность с точки зрения времени счёта.

ClrText
“INPUT NUMBER”
?->A:sqrA->B
For 2->C To B
If Frac(A/C)=0
Then A/C->A:C■
C-1->C:sqrA->B
IfEnd
If I>2
Then I+1->I
IfEnd
Next
A■
“END FACTORISATION”

Сокращения: sqr - квадратный корень; / - символ деления,  - перевод строки

Вариант 2 - Р-1 метод Полларда

Этот метод самый быстрый (имеет полиномиальную сложность), но работает только для составных чисел специального вида, так называемых "гладких". По этому методу разложить не удаётся гораздо чаще, чем удаётся. Кроме того, этот метод раскладывает числа на два множителя не зависимо от того из скольки простых чисел состоит составное.
Суть метода заключается в следующем:
1. N - факторизуемое число;
2. B = Int(ln(N)); целая часть натурального логарифма
3. X = 2B!mod N;
4. P = НОД(X-1,N);//наибольний общий делитель
5. Q = N/P;

ClrText
“INPUT NUMBER”?->N
Abs ln N->B:2->A:1->I
Do
I+1->I:A->C
1->J
While J < I
AC-NInt(AC/N)->N
J+1->J
WhileEnd
C->A:A-1->C
N->X:C->Y
Prog “SUB NOD” 
LpWhile(((X=1)Or(X=N))And(I<=B))
N/X->Y
“ITER=”
Locate 6,3,I
Locate 3,4,X
Locate 3,5,Y

Подпрограмма "SUB NOD" вычисления наибольшего общего делителя по алгоритму Евклида

While Y>0
X-YInt(X/Y)->X
Y->Z:X->Y:Z->X
WhileEnd
Return

Вариант 3 - Ро метод Полларда

Это субэкспоненциальный метод, который требует значительных объёмов памяти, но для больших чисел даёт результат гораздо быстрее, чем переборный метод.
Суть метода состоит в следующем:
1. Вычисляем по рекуррентной формуле Xi = (X2i-1+1) mod N, X0 = 2 и запоминаем результаты до тех пор пока очередной результат не совпадёт с каким-либо предидущим.
2. Пусть совпали значения чисел на итерациях номер I и J. Тогда находим наибольший общий делитель из выражения P = НОД(N,(Xi-1-Xj-1)mod N)
3. Q = N/P.
Как и в предидущем методе, число раскладывается только на два множителя. Из-за конструктивных ограничений (длина списка в калькуляторе не более 255 чисел), если алгоритм потребует больше, чем 255 итераций, то калькулятор остановится и сообщит о недостатке памяти. Однако из-за большой продолжительности поиска список может заполнится за время превышающее 8 минут.

ClrText:“RO POLLARD”
“INPUT NUMBER”?C
255->Dim List1
2->List1[1]
For 1->I To 254
List1[I]->X
X2+1->X
X->List 1[I+1]
For I->J To 1 Step -1
If List1[J]=X
Then Break
IfEnd
Next
If J!=1
Then List 1[J-1]->X
List 1[J-1]->Y
X-Y+C->X
X-CInt(X/C)->X
C->Y
Prog “SUB NOD”
C/X->Y
Break
IfEnd
Next
If J>1 And I<254
Then “ITER=”
“REPT=”
“MUL1=”
“MUL2=”
Locate 6,4,I
Locate 6,5,J-1
Locate 6,6,X
Locate 6,7,Y
Else “=LOW MEMORY=”
IfEnd

Это, конечно, не все методы, но самые простые для понимания и запоминания.

Эффект Допплера (152)

Благодаря тому, что в прочитанной мной сегодня статье по физике упоминался эффект Допплера, а ещё тому, что почему-то долго не хотелось спать, была создана одна из гениальнейших программ современности.
Она являет собой наглядный пример ситуации, где проявляется эффект Допплера: длинна волны - в том числе и звуковой - от удаляющегося от наблюдателя объекта увеличивается, а от приближающегося - уменьшается [по крайней мере, с точки зрения наблюдателя]. Например, если к нам едет поезд, то сначала тон звучания его гудка высокий, а когда он проезжает мимо и начинает уезжать - гудок звучит ниже. Моделированию этого замечательного явления и посвящена программа. Достаточно только выставить громкость на МК на максимум, загрузить программу, запустить её и наслаждаться великолепным зрелищем.
Примечание: моделирование гудка поезда получилось не очень точным - человек, на котором впервые была испытана программа, сообщил, что звук больше похож на визг поросёнка.

→ Астрономические программы (152)

Программы, написанные для «Электроники МК-152» и полезные для любителей астрономии.

Расчёт дифракционного предела объектива

00.%       01.1   02.,  03.2    04.2   05.ВП  06.6  07./-/  08.x  09.F arctg
10.К Г→МС  11.ВП  12.4  13.С/П  14.БП  15.00

Инструкция.

Вводим длину волны в нанометрах (380 для фиолетового, 760 для красного или 550 для зелёного цвета), потом В↑ и диаметр объектива в миллиметрах. Нажимаем В/О, С/П. На экране — разрешающая способность данного объектива в угловых секундах по критерию разрешения Релея.

Переключатель Р-ГРД-Г должен стоять в положении «ГРАД» (градусы), т.к. на шаге 09 используется команда для быстрого преобразования из радиан в градусы (трюк, кстати, взят из «Пути к Земле»). Шаги 10-12 осуществляют преобразование полученных долей градуса в угловые минуты. При желании эти два блока можно расписать точными формулами — тогда программа заработает и на старых ПМК, где команда ВП ведёт себя не всегда очевидно.

Тестовый пример.

Рассчитаем разрешение новосибирского рефрактора ТАЛ-125R с объективом 125мм.

550 В↑ 125 В/О С/П «1,1072295»

→ Восток

Программы для ЭКВМ в помощь любителям буддистской и восточной культуры.

«Китайский год», новогоднее издание

Уровень качества, заданный советскими ПМК, довольно высок.

К новому 2010 году мне удалось подготовить достойное издание программы «Китайский год». Оно не только на целую страницу (то есть 100 шагов) короче первого издания, но также обладает большей функциональностью, что сразу видно из следующего экранного снимка:

Растровые изображения циклических знаков значительно улучшены. Спасибо востоковеду Павлу Лаку (ryu@ru.ru, icq: 400-383-835), который много часов провёл со мной за Гимпом, добиваясь идеальной формы каждого из 22 иероглифов. И хотя для изображения циклических знаков был применён обычный (печатный, не каллиграфический) шрифт, я бы рискнул назвать получившиеся изображения первой электронной каллиграфией на МК-161.

При создании программы и снимка экрана использовались новые программы М.Б. Степанищева bmp2mkl и mki2bmp. Исходный текст программы предназначен для новой версии 1.17 компилятора mk.exe — более старые версии компилятора годятся, просто не позволят вывести на экран букву "ё".

Скачать новую версию программы «Китайский год» можно по прежнему адресу:
http://the-hacker.ru/2009/kitgod.mkl
http://the-hacker.ru/2009/kitgod.mkp

Книга перемен на МК-161

И-Цзин («Книга перемен») это классический китайский труд, включённый в китайское Пятикнижье. Предположительно он появился до возникновения письменности и представлял из себя простейший способ записи 64 наиболее важных и часто повторяющихся ситуаций (с помощью шести палочек, целых или сломанных). В последующие тысячелетия человечество накапливало опыт, развивало вокабуляр и изобразительные средства, а в «Книгу перемен» добавлялись новые смысловые пласты: афоризмы, комментарии, трактовки,… Сейчас она представляет из себя самую древнюю базу данных, к которой охотно обращаются за мудрым советом писатели, учёные и политики Востока — как жившие в прошлых веках, так и современные.

«Книга перемен» настолько повлияла на культуру Китая, Японии и других стран Востока, что исследователи-востоковеды сравнивают её с «Библией» стран Запада. В России и на Западе «Книга перемен» в-основном используется эмигрантами из стран Востока, а также гадалками-«эзотериками». В доме книги на Арбате две книжные полки заполнены книгами с различными трактовками И-цзин. Моя инструкция даже не пытается заменить подобную книгу, но программа «Книга перемен» способна помочь читателю любой из них.

Предлагаемая программа рисует на экране МК-161 (и МК-152, не проверялось) все 64 гексограммы «Книги перемен», а также их номера и названия на китайском и русском языках. Для определённости мной использовался академический перевод Щуцкого, но представители аутентичных школ могут использовать собственный, изменив текст (содержимое регистров R5096…8167) во встроенном текстовом редакторе МК-161.

При запуске программы на экран выводится случайная гексограмма, выбранная в соответствии с КСЧ. Чтобы МК-161 самостоятельно (и независимо от вас) генерировал последующие случайные гексограммы, нажимайте клавишу Cx. Для просмотра соседних гексограмм используйте клавиши ШГ. Чтобы перейти на нужную гексограмму, просто наберите её двухзначный номер (например, 02 для перехода на гексограмму «Кунь»).

Также в программе реализован способ гадания, традиционный для ПМК. Стоит нажать клавишу Р-ГРД-Г, как ЭКВМ начнёт последовательно перебирать все 64 гексограммы по нескольку за секунду, начиная с последней отображённой. При повторном нажатии на клавишу Р-ГРД-Г на экран будет выведена та гексограмма, которая рассматривалась микрокалькулятором в момент вашего вмешательства.

Существует множество других, не менее традиционных, способов гадания по «Книге перемен». Можно гадать на дату рождения или события. Некоторые школы китайской медицины и астрономии используют гексограммы в качестве ключа к своим научным базам данных. Чтобы облегчить реализацию вашего проверенного способа использования «Книги перемен», программа составлена из удобных подпрограмм, обращение к которым вынесено в самое начало нулевой страницы. Просто закодируйте собственный алгоритм, а выводом гексограмм и их преобразованием между стандартной нумерацией Вэнь-вана и двоичным представлением Фу-си займутся мои мощные подпрограммы.

Программа «Книга перемен» представляет из себя пакет, то есть требует наличия в памяти ЭКВМ заранее подготовленного набора байтовых регистров, что реализуется загрузкой кроме программного кода (MKP) двух дополнительных файлов, двоичного (MKB) и текстового (MKT). Все необходимые файлы (и приведённый скриншот) присутствуют в архиве YiJing.zip

Для записи «Книги перемен» в МК-161 рекомендую использовать MK.EXE версии 1.16 или выше, т.к. в предыдущих содержалась ошибка передачи двоичных файлов. Подходящую версию MK.EXE можно скачать с сайта производителя, то есть отсюда:
http://mk.semico.ru/prog.htm


		.CHARSET 1251

; Файл YiJing.mkl
; Разработан в Москве, 31 июля 2009 года
; Автор Васильев И.В.
; Вывод гексограмм по "Книге перемен"
;
; Не забудьте загрузить в ЭКВМ файлы MKT и MKB
;
; Файл MKT содержит перевод гексограмм по Щуцкому:
; Щуцкий Ю.К. Китайская классическая "Книга перемен": 2-е изд., испр. и доп.
; под ред. А.И.Кобзева. -- М.: Изд. фирма "Восточная литература" РАН, 1997.
; -- 606 c. -- ISBN 5-02-017991-4
;
; Структура файла MKB:
; 000..004  R1000..R1004  Картинка символа №
; 010..019  R1016..R1025  Заголовок экрана гадания
; 020..037  R1032..R1055  Первая строчка экрана гадания
; 040..054  R1064..R1084  Вторая строчка экрана гадания
; 060..078  R1096..R1119  Третья строчка экрана гадания
; FA1..FE0  R5001..R5064  Двоичные картинки гексограмм 1..64 (номера Фу-си)
;

		.ORG 0

; ======= № 33
; ======= Дунь
; =======
; =======
; === ===
; === ===
;
; Бегство
;
;

BIN_IMG_N	.EQU	1000
BIN_HEADER	.EQU	1016
BIN_LINE1	.EQU	1032
BIN_LINE2	.EQU	1064
BIN_LINE3	.EQU	1096

;
; Функции "Книги перемен" используют (портят) регистры R0, R1, R6, Ra, Rc
;
		GOTO	Start			; 0000 Dialog
		KNOP
		GOTO	StartN			; 0003 N --> (dialog)
		KNOP
		PGOTO	DrawN			; 0006 N --> (screen)
		PGOTO	DrawBin			; 0009 Фу-си -->
		GOTO	CreateN			; 0012 N --> Фу-си
		KNOP
		GOTO	SearchBin		; 0015 Фу-си --> N
		KNOP
		GOTO	MachineN		; 0018 --> N (1..64)
		KNOP
		PGOTO	UserN			; 0021 --> N (1..64)
		GOTO	TextChi			; 0024 N --> text
		KNOP
;		GOTO	TextRus			; 0027 N --> text

TextRus:	GSB TextChi			; Получить китайское название
		M6				; Известно, что первый символ не ноль
SearchZ:	KRM6 FX=0 SearchZ		; Поиск первого нуля
		RM6 1 + RTN			; Искомая строка после него

TextChi:	ENT 48 * 5048 + RTN		; Китайское название идёт первым

;----------------------------------
; Найти гексограмму с рисунком в RX
; Ответ в R0 и RX
; Изменяет R1
;
SearchBin:	ENT 64 M0 5 EE 3 + M1		; Ищем 64 раза, начиная с R5064
CmpBin:
		FX!=0 FoundBin			; Если найдена, выдать её номер
		FR ENT KRM1 - FL0 CmpBin	; Сравнить и перейти к следующей
FoundBin:	RM0 RTN				; Возвращаем найденную тетраграмму

CreateN:	ENT 5 EE 3 + MA KRMA RTN	; Преобразовать N в двоичный код Фу-си

MachineN:	KRAN 64 * 1 + KINT RTN		; Получить случайное N от 1 до 64

Start:
		GSB MachineN			; Получить случайную гексограмму
StartN:
		PGSB DrawN			; Вывести картинку с гексограммой
;
; ШГ -- перейти на соседнюю гексограмму
; Cx -- перейти на случайную гексограмму (RND)
; 0..9 -- задать номер гексограммы
; Р-ГРД-Г -- гадать (до повторного нажатия Р-ГРД-Г)
;
Wait:
		PPRM 9029
		10 - PX>=0 Key09		; 0..9 выбирает номер с клавиатуры
		3  - FX!=0 Start		; Cx выводит случайную гексограмму
		10 - FX!=0 KeyRight		; ШГ> Последующая гексаграмма
		1  - FX!=0 KeyLeft		; ШГ< Предыдущая гексаграмма
		7  - PX=0  Wait			; Р-ГРД-Г, гадание
		PGSB	UserN
		GOTO	StoreN

Key09:
		FANS + RMC FANS / KFRAC
		100 * 60 KMAX FR
jPlusStoreN:
		+ 64 KMAX FR EE
StoreN:
		PGOTO StartN
KeyLeft:
		RMC 1 - FX=0 StoreN
		64 GOTO StoreN
KeyRight:
		RMC 63 KAND 1
		GOTO jPlusStoreN

;--------------------------------------------
; Выводим гексограмму с номером в RX.
; Помимо гексограммы выводится всё обрамление
; Переходим на графический экран
; Изменяет регистры R0, R6, RA, RC
;
DrawN:
		MC				; Запомним номер гексограммы в RC
		PGSB CreateN			; Перевести гексограмму в двоичный код Фу-си
		PGSB DrawBin			; Вывести гексограмму на экран
		0 ENT 40 PPM9000
		78 PPM 9020			; N
		.NUM BIN_IMG_N			; №
		PPM 9016			; Вывод графического образа из памяти данных
		0 ENT 52 PPM9000
		RMC PPM9023			; Вывести номер гексограммы
		8 ENT 40 PPM9000
		RMC PGSB TextChi M6 PPM 9022	; Вывести название гексограммы
		48 ENT 0 PPM9000
		PGSB SearchZ PGSB MLit		; Вывести перевод гексограммы
		K GRPH				; Графический режим
		RTN

; R4=8 расстояние между линиями плюс R5 (8)
; R5=5 толщина линии (5)
; R7=16 длина малой чёрточки (15)
; R8=8 зазор между малыми чёрточками (5)

;----------------------------------------------------------
; Выводим гексограмму Фу-си RX.
; Изменяет регистры R0, RA
; Инициализирует графический экран, но не переходит на него
;
DrawBin:	MA
		2 PPM 9010			; Инициализация экрана (Графический экран)
		6 M0				; Обработать 6 линий
NextLine:	RMA 2 / KINT MA			; Перейти к следующей линии
		FANS KFRAC FX!=0 OutLine0	; Какую черту выводим?
		5 ENT 35			; Вывести длинную чёрточку
		GOTO OutRect			; Вывод прямоугольника (Графический экран)
OutLine0:					; Вывести прерывистую черту
		5 ENT 15			; Вывести малую чёрточку
		PPM 9013			; Вывод прямоугольника (Графический экран)
		PPRM 9000			; Считать начальные координаты объекта (Графический экран)
		20 +				; Сдвинуть вправо на чёрточку и зазор
		PPM 9000			; Установить начальные координаты объекта (Графический экран)
		5 ENT 15			; Вывести малую чёрточку
OutRect:	PPM 9013			; Вывод прямоугольника (Графический экран)
		7 RM0 - 8 *			; На следующую строчку
		0
		PP M 9000			; Начальные координаты объекта (Графический экран)
		FL0 NextLine			; Вывести следующую линию
		RTN

;------------------------------------------------------
; Получаем случайный номер гексограммы от пользователя.
; Ответ в RC и RX.
;
UserN:
		2 PPM 9010			; Инициализация экрана (Графический экран)
		0 ENT PPM 9000
		.NUM BIN_HEADER
		PPM 9022			; Вывод строки символов из памяти программ
		16 ENT 0 PPM 9000
		.NUM BIN_LINE1
		PPM 9022
		32 ENT 0 PPM 9000
		.NUM BIN_LINE2
		PPM 9022
		48 ENT 0 PPM 9000
		.NUM BIN_LINE3
		PPM 9022
		K GRPH
Razdumja:
		RMC 63 KAND 1 + MC
		PPRM 9029 31 - FX=0 Razdumja
		RMC
MLfinished:	RTN

;--------------------------------------------------
; Вывести строчку, начиная с R6+1
; Результат может занимать несколько строчек экрана
; при этом символ FF служит переводом строки
;
Multiline:	RM6 1 +
MLit:		PPM9022				; Вывод строки символов из памяти данных
Search255:	KRM6 FX!=0 MLfinished		; Строчка заканчивается нулевым символом
		KNOT FX=0 Search255		; Поиск символа с кодом 255
		PPRM9000			; Программирование начальных координат объекта
		Cx 8 + 0 PPM9000		; Переход на следующую строчку
		GOTO Multiline

		.END

Таймер для медитаций (МК-161)

Программа «Таймер Дзэн» позволяет отмерять промежутки времени от 0,5 минуты до нескольких часов и предназначена в помощь тем, кто проводит дзадзэн или медитирует самостоятельно.

Наберите, сколько минут собираетесь сидеть и нажмите В/О С/П. Программа выведет полный круг. Для начала первого отсчёта нажмите любую клавишу. Круг начнёт уменьшаться пропорционально пройденному времени.

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


		.CHARSET 1251

; Файл ZenTimer.mkl
; Программа "Таймер Дзэн"
; Разработана в Москве, 12 июля 2010 года
; Автор Васильев И.В.
;
; Таймер для медитаций замеряет время в широком диапазоне:
; от 0,5 минуты до нескольких часов, с точностью до единиц
; секунд.
;
; Для компиляции используйте программу MKL2MKP.
;
; Инструкция:
; 1. Набрать продолжительность медитации в минутах, например 45
;    и нажать В/О С/П.
; 2. Дождаться знака паузы и изображения круга.
; 3. Приготовиться к медитации и нажать любую клавишу, кроме С/П.
;    Знак паузы исчез с экрана, круг начал уменьшаться.
;    Именно с этого момента МК-161 начал отсчёт времени.
; 4. По завершении периода медитации МК-161 издаст короткий
;    звуковой сигнал и вновь отобразит символ паузы и полный круг.
; 5. При желании можно нажать любую клавишу (см. пункт 3),
;    чтобы повторить сеанс медитации той же длительности.
;
; ВНИМАНИЕ!  Программа "Таймер Дзэн" не проверяет, хватит ли
; у МК-161 питания на запрошенный интервал времени.  Если
; аккумулятор сильно подсажен, выключите подсветку МК-161 или
; даже включите ЭКВМ в сеть питания.
;

		.ORG 0

		ENT 60 / M0				; Продолжительность медитации, теперь в часах
		9 EE 3 Me				; Регистр начальных координат объекта
		44 + Ma					; Регистр чтения памяти программ
		11 + Mb					; Регистр текущего времени
		Cx PPM 9045				; Размерность: градусы
NextPeriod:
		2 PPM 9010				; Инициализация графического экрана
		19 PPM 9020				; Вывод знака паузы
		KGRPH					; Отображаем паузу, ещё до вывода круга
;
; Нарисуем круг.
;
		.NUMT tblCircle				; Предвычисленный круг
		PPM 9042				; Запись индексного регистра
		32 M1					; Половина количества линий в круге
Circle:
		32 RM1 -				; Координата y верхней линии
		64					; Середина горизонтали
		KRMa					; Чтение содержимого памяти программ
		- M2					; Левая граница отрезка
		KMe					; Начальные координаты отрезка
		Cx 63 FANS + M3				; Границы отрезка по горизонтали
		PPM 9012				; Вывод линии
		31 RM1 +				; Координата y нижней линии
		RM2 KMe					; Начальные координаты отрезка
		FR RM3 PPM 9012				; Вывод линии
		KGRPH					; Отобразить графический экран
		FL1 Circle				; Заполнить круг до конца
KeyWait:
		PPRM 9029				; Чтение кода нажатой клавиши
		KNOT FX!=0 KeyWait			; Ожидание нажатия
		KRMb KMS->D Mc				; Засечь время начала медитации
;
; Постепенно стираем круг.
;
		.NUMT tblErase				; Таблица с инструкциями для 4 квадрантов
		PPM 9042				; Запись индексного регистра
;
; R0  продолжительность медитации, в часах и долях часа
; R1  счётчик по точкам
; R2  счётчик по сторонам квадранта
; R3  счётчик по квадрантам: 4, 3, 2, 1
; R4  x0 центр
; R5  y0 центр
; R6  x конец радиус-вектора
; R7  y конец радиус-вектора
; R8  dx шаг радиус-вектора
; R9  dy шаг радиус-вектора
; Ra  =9044
; Rb  =9055
; Rc  время начала медитации, в часах и долях часа
; Rd  требуемое время от начала медитации
; Re  =9000
;
		4 M3 PPM 9001				; Четыре квадранта, рисование стирает
		64 M6 Cx M7				; Конец радиус-вектора, направленного вверх
		ENT KMe					; Объект (прямоугольник) в начале координат
		8 ENT 3 PPM 9013			; Сотрём знак паузы
		KGRPH					; Обновим экран без знака паузы
NxtUgol:
		KRMa M5 KRMa M4 KMe			; Считаем из таблицы координаты радиус-вектора
		2 M2					; В каждом квадранте две стороны
		31					; Длина первой стороны
NxtLine:
		M1					; Сохраним длину текущей стороны в R1
		KRMa Fcos M8 KRMa Fcos M9		; Считаем dx, dy из таблицы в регистры 8, 9
NxtDot:
;
; Вычисляем новый градус.
;
		RM6 RM4 - RM5 RM7 -			; Вычислим проекции радиус-вектора на оси
		Fx=0 Atangens				; Если отрезок горизонтален, особый случай
		90					; это прямой угол, где арктангенс сбоит
		RM3 3 - Fx>=0 Plus180			; В квадрантах 1 и 2 это 180+90 градусов
		FR GOTO StoreGradus			; В квадрантах 4 и 3 это 90 градусов
Atangens:
		/ Farctg				; Вычислим угол радиус-вектора через арктангенс
Gradus:
		4 RM3 - Fx!=0 Done			; В квадранте 4 это и есть угол
		3 - Fx=0 Plus180			; В квадрантах 3, 2 вычисляем 180+угол
		Cx 360					; В квадранте 1 вычисляем 360+угол
		GOTO Done
Plus180:
		Cx 180					; Заменяем число в RX на 180
Done:
		+					; Корректируем градусную меру угла
StoreGradus:
;
; RX: величина очищаемого сектора круга, в градусах.
; Вычисляем требуемую задержку.
;
		RM0 * 360 / Md				; За 360 градусов должно пройти R0 часов
;
; Временная задержка.
;
WaitTime:
		KRMb KMS->D RMc -			; Сколько длится медитация?
		FX<0 General				; Если длительность отрицательная,
		24 +					; значит мы перешли через полночь
General:	RMd -					; Сравнить с требуемой длительностью
		FX>=0 WaitTime				; Если не дождались, ждать
;
; Стираем очередную линию.
;
		RM7 RM6 PPM 9012			; Вывод радиус-вектора
		KGRPH					; Обновляем экран
		RM8 + M6 FR RM9 + M7			; Вычисляем координаты следующего радиус-вектора
		FL1 NxtDot				; Обработать сторону до конца
		32					; Количество точек во второй стороне
		PFL2 NxtLine				; Обработать обе стороны
		PFL3 NxtUgol				; Обработать все четыре квадранта

		440 ENT 10 PPM 9052			; Звуковая сигнализация
WaitSound:
		PPRM 9052				; Звук всё ещё звучит?
		FX=0 WaitSound				; Дождёмся окончания звука
		PGOTO NextPeriod			; Переходим на ожидание следующего периода

tblCircle:						; Данные для рисования круга
		.DB 6, 10, 12, 15, 16, 18, 19, 21	; Ширина линий 0..31 (63..32)
		.DB 22, 23, 24, 25, 25, 26, 27, 27
		.DB 28, 29, 29, 29, 30, 30, 31, 31
		.DB 31, 31, 32, 32, 32, 32, 32, 32
tblErase:						; Данные для стирания круга
		.DB 31,64, 0,90, 90,0			; y0,x0, dx,dy, dx,dy
		.DB 32,64, 90,0, 180,90
		.DB 32,63, 180,90, 90,180
		.DB 31,63, 90,180, 0,90

		.END
  0 1 2 3 4 5 6 7 8 9
0000 B↑ 6 0 ÷ П 0 9 ВП 3 П E 4
0010 4 + П A 1 1 + П B Cx PP П 90
0020 45 2 PP П 90 10 1 9 PP П 90 20
0030 K ГРФ 2 2 3 PP П 90 42 3 2 П 1
0040 3 2 ИП 1 - 6 4 K ИП A - П 2 K П E
0050 Cx 6 3 F Bx + П 3 PP П 90 12 3
0060 1 ИП 1 + ИП 2 K П E F O ИП 3 PP П 90 12
0070 K ГРФ F L1 40 PP ИП 90 29 K NOT F x≠0 73 K ИП B
0080 K МС→Г П C 2 5 5 PP П 90 42 4 П 3
0090 PP П 90 01 6 4 П 6 Cx П 7 B↑ K П E
0100 8 B↑ 3 PP П 90 13 K ГРФ K ИП A П 5 K ИП A
0110 П 4 K П E 2 П 2 3 1 П 1 K ИП A F cos П 8
0120 K ИП A F cos П 9 ИП 6 ИП 4 - ИП 5 ИП 7 - F x=0
0130 41 9 0 ИП 3 3 - F x≥0 58 F O БП
0140 63 ÷ F arctg 4 ИП 3 - F x≠0 62 3 -
0150 F x=0 58 Cx 3 6 0 БП 62 Cx 1
0160 8 0 + ИП 0 × 3 6 0 ÷ П D
0170 K ИП B K МС→Г ИП C - F x<0 79 2 4 + ИП D
0180 - F x≥0 70 ИП 7 ИП 6 PP П 90 12 K ГРФ ИП 8
0190 + П 6 F O ИП 9 + П 7 F L1 23 3 2
0200 PF L2 01 16 PF L3 01 07 4 4 0 B↑
0210 1 0 PP П 90 52 PP ИП 90 52 F x=0 15
0220 P БП 00 21 06h 0Ah 0Ch 0Fh 10h 12h 13h
0230 15h 16h 17h 18h 19h 19h 1Ah 1Bh 1Bh 1Ch
0240 1Dh 1Dh 1Dh 1Eh 1Eh 1Fh 1Fh 1Fh 1Fh 20h
0250 20h 20h 20h 20h 20h 1Fh 40h 00h 5Ah 5Ah
0260 00h 20h 40h 5Ah 00h B4h 5Ah 20h 3Fh B4h
0270 5Ah 5Ah B4h 1Fh 3Fh 5Ah B4h 00h 5Ah FFh
0280 FFh FFh FFh FFh FFh FFh FFh FFh FFh FFh
0290 FFh FFh FFh FFh FFh FFh FFh FFh FFh FFh

Контрольная сумма ADD 23224

Контрольная сумма XOR 130

Страничка программы на официальном сайте ЭКВМ, с дополнительными картинками:
http://mk.semico.ru/mkpr_58.htm

→ Вычисление корней уравнений высоких степеней

Вычисление осуществляется приближённым методом Лобачевского.

3я степень (34)

Текст программы:

	0	1	2	3	4	5	6	7	8	9
0	ИП1	Fx^2	ИПС	ИП2	х	2	х	-	ПА	ИП2
1	Fx^2	ИП1	ИП3	х	2	х	-	ПВ	ИПС	Fx^2
2	ПС	ИП3	Fx^2	П3	ИПА	П1	ИПВ	П2	FL0	00
3	С/П	%	Fx<0	35	/-/	ИПD	ХУ	Fx^y	С/П	БП
4	00

Ввод данных:
а1, а2, а3 занести соотв. в П1, П2, П3, а а0 - в ПС, где
а0 - коэф. при 0 степени,
а1 - коэф. при 1 степени,
а2 - коэф. при 2 степени,
а3 - коэф. при 3 степени.

Инструкция:
а) Определение m: возведением m раз в квадрат |amax| до тех пор, пока порядок возводимого числа не превысит 50.
б) Засылка: m->0.
в) Пуск: В/0, С/П.
г) Засылка: 1/2^m -> D.
д) Вычисления модуля хi; нажать клавиши i-1;i;С/П.

Взято из книги "Решение алгебраических уравнений методом Лобачевского".

4я степень (34)

Текст программы:

	0	1	2	3	4	5	6	7	8	9
0	ИП 1	F x^2	ИП С	ИП 2	х	2	х	-	П А	ИП 2
1	F x^2	ИП С	ИП 4	х	ИП 1	ИП 3	х	-	2	х
2	+	П В	ИП 3	F x^2	ИП 2	ИП 4	х	2	х	-
3	П 9	ИП С	F x^2	П С	ИП 4	F x^2	П 4	ИП А	П 1	ИП В
4	П 2	ИП 9	П 3	F L0	00	С/П	+	F x<0	50	/-/
5	ИП D	ХУ	F x^y	С/П	БП	46

Ввод данных:
а0, а1, а2, а3, а4 занести соотв. в ПС, П1, П2, П3, П4, где
а0 - коэф. при 0 степени,
а1 - коэф. при 1 степени,
...
а4 - коэф. при 4 степени.

Инструкция:
а) Определение m: возведением m раз в квадрат |amax| до тех пор, пока порядок возводимого числа не превысит 50.
б) Засылка: m->0.
в) Пуск: В/0, С/П.
г) Засылка: 1/2^m -> D.
д) Вычисления модуля хi; нажать клавиши i-1;i;С/П.

Взято из книги "Решение алгебраических уравнений методом Лобачевского".

5я степень (34)

Текст программы:

	0	1	2	3	4	5	6	7	8	9
0	ИП С	ИП 2	х	2	х	/-/	П 7	ИП С	ИП 4	х
1	ИП 1	ИП 3	х	-	2	х	П 8	ИП 1	ИП 5	х
2	ИП 2	ИП 4	х	-	2	х	П 9	ИП 3	ИП 5	х
3	2	х	/-/	П А	6	П 6	Сх	П В	ИП 6	5
4	-	ПD	КИПD	F x^2	КПП6	+	КПD	5	ИПD	-
5	Fx=0	38	ИП С	F x^2	П С	F L0	00	С/П	%	F x<0
6	62	/-/	ИП D	ХУ	F x^y	С/П	БП	58

Ввод данных:
а0, а1, а2, ... , а5 занести соотв. в ПС, П1, П2, ... , П5, где
а0 - коэф. при 0 степени,
а1 - коэф. при 1 степени,
...
а5 - коэф. при 5 степени.

Инструкция:
а) Определение m: возведением m раз в квадрат |amax| до тех пор, пока порядок возводимого числа не превысит 50.
б) Засылка: m->0.
в) Пуск: В/0, С/П.
г) Засылка: 1/2^m -> D.
д) Вычисления модуля хi; нажать клавиши i-1;i;С/П.

Взято из книги "Решение алгебраических уравнений методом Лобачевского".

6я степень (34)

Текст программы:

	0	1	2	3	4	5	6	7	8	9
0	ИП 1	F x^2	ИП С	ИП 2	х	2	х	-	П А	ИП 2
1	F x^2	ИП С	ИП 4	х	ИП 1	ИП 3	х	-	2	х
2	%	П В	ИП 3	F x^2	ИП 1	ИП 5	х	ИП С	ИП 6	х
3	-	ИП 2	ИП 4	х	-	2	х	+	П 9	ИП 4
4	F x^2	ИП 2	ИП 6	х	ИП 3	ИП 5	х	-	2	х
5	+	П 8	ИП 5	F x^2	ИП 4	ИП 6	х	2	х	-
6	П 7	ИП 6	F x^2	П 6	ИП С	F x^2	П С	ИП А	П 1	ИП В
7	П 2	ИП 9	П 3	ИП 8	П 4	ИП 7	П 5	F L0	00	С/П
8	%	F x<0	84	/-/	ИП D	ХУ	F x^y	С/П	БП	80

Ввод данных:
а0, а1, а2, ... , а6 занести соотв. в ПС, П1, П2, ... , П6, где
а0 - коэф. при 0 степени,
а1 - коэф. при 1 степени,
...
а6 - коэф. при 6 степени.

Инструкция:
а) Определение m: возведением m раз в квадрат |amax| до тех пор, пока порядок возводимого числа не превысит 50.
б) Засылка: m->0.
в) Пуск: В/0, С/П.
г) Засылка: 1/2^m -> D.
д) Вычисления модуля хi; нажать клавиши i-1;i;С/П.

Взято из книги "Решение алгебраических уравнений методом Лобачевского".

7я степень (34)

Текст программы (Квадрирование уравнения):

	0	1	2	3	4	5	6	7	8	9
0	ИП 1	F x^2	ИП С	ИП 2	х	2	х	-	П А	ИП 2
1	F x^2	ИП С	ИП 4	х	ИП 1	ИП 3	х	-	2	х
2	+	П В	ИП 3	F x^2	ИП 1	ИП 5	х	ИП 2	ИП 4	х
3	-	ИП С	ИП 6	х	-	2	х	+	П 0	ИП 4
4	F x^2	ИП 2	ИП 6	х	ИП 1	ИП 7	х	-	ИП 3	ИП 5
5	х	-	2	х	+	П D	ИП 5	F x^2	ИП 3	ИП 7
6	х	ИП 4	ИП 6	х	-	2	х	+	П 9	ИП 6
7	F x^2	ИП 5	ИП 7	х	2	х	-	П8	ИП С	F x^2
8	П С	ИП 7	F x^2	П 7	ИП А	П 1	ИП В	П 2	ИП 0	П 3
9	ИП D	П 4	ИП 9	П 5	ИП 8	П 6	ИП Z	С/П

Ввод данных:
а0, а1, а2, ... , а7 занести соотв. в ПС, П1, П2, ... , П7, где
а0 - коэф. при 0 степени,
а1 - коэф. при 1 степени,
...
а7 - коэф. при 7 степени.

Вместо "ИП Z" в коде следует вставить чтение из ячейки, содержащей наибольший коэффициент (для каждого уравнения разная).

Инструкция:
а) Пуск: В/0, С/П.
б) Запись знаков коэффициентов в этом цикле квадрирования.
д) Исполнить п.а)
Квадрирование прекращается при amax > 10^60.

Как с помощью полученных результатов найти сами корни, см., например, книгу "Решение алгебраических уравнений методом Лобачевского" или любую книгу, в которой описывается метод Лобачевского.
Коэффициенты квадрированного уравнения после выполнения программы остаются в ячейках ПС, П1, П2, ... , П7.

Вычисление действ. части комплексно-сопряжённых корней

Текст программы:

	0	1	2	3	4	5	6	7	8	9	   
0	ИП А	F x^2	ИП В	F x^2	-	ИП 9	F x^2	+	ИП 9	%	   
1	ИП 9	%	С/П

Ввод исходных данных:
b -> П9; ri -> ПА; r1,2 -> ПВ,
где b - модуль корня; ri - модуль до разложения уравнения; r1,2 - после разложения.

Инструкция:
Нажать на клавиши В/0; С/П.
После останова в ячейке х (на индикаторе) будет записано значние αi - действ. часть корня.

Взято из книги "Решение уравнений методом Лобачевского"

Деление (умножение) коэффициентов уравнения на заданное число (34, 61, 152)

Текст программы:

	0	1	2	3	4	5	6	7	8	9	   
0	ИП 0	П 9	КИП9	ИП А	%	КП9	F L0	00	ИП С	ИП А	   
1	%	П С	С/П

Примечания:
1. При умножении коэффициентов в ячейки 04 и 10 записывается "х" вместо "%".
2. При записи программы с z-й ячейки, в ячейку (z + 08) записывается число z.

Ввод исходных данных:
а0 -> ПС, а1,а2, ... ,аn -> П1,П2, ... ,ПN.

Инструкция: БП z; С/П.

Текст программы и пояснения к нему взяты из книги решение уравнений методом Лобачевского

Определение знаков модулей

Текст программы:

	0	1	2	3	4	5	6	7	8	9	   
0	Сх	П С	ИП А	/-/	П А	ИП 8	+	ИП А	х	ИП 9	   
1	+	П В	ИП С	Fx=0	19	ИП В	П С	БП	02	%	   
2	F x^2	F√	1	-	Fx≥0	36	ИП С	П 9	ИП А	/-/	   
3	П А	ИП 8	+	П 8	ИП А	С/П	ИП В	П 9	ИП А	БП	   
4	31

Ввод исходных данных:
аn-1 -> П8
(аn-2 - Eri^2) -> П9
|xi| или |2αi| -> ПА

Инструкция:
Нажать на клавиши В/0, С/П.
После останова счёта на индикаторе высвечивается модуль с соответствующим знаком.
Повторить для следующего корня, записав его значение в ПА. Содержимое ячеек 8 и 9 не изменять. Счет начинать с модуля или 2α, имеющих наибольшие значения.

Взято из книги "Решение алгебраических уравнений методом Лобачевского"

Решение уравнений 3-й степени (34, 52, 152)

Моя версия программы для МК-52 по мотивам книги "Решение алгебраических уравнений методом Лобачевского", программы из которой почему-то не работали у меня на МК-52.

Текст программы:

    0     1     2     3     4     5     6     7     8     9
0   ИП2   Fx2   П5    ИП3   ИП1   x     2     x     ИП5   -
1   /-/   П5    ИП1   Fx2   П6    ИП4   ИП2   x     2     x
2   ИП6   -     /-/   П6    ИП4   Fx2   П4    ИП3   Fx2   П3
3   ИП5   П2    ИП6   П1    FL0   00    С/П   БП    00

Ввод данных:
а0, а1, а2, а3 занести соотв. в П4, П1, П2, П3, где
а0 - коэф. при 0 степени,
а1 - коэф. при 1 степени,
а2 - коэф. при 2 степени,
а3 - коэф. при 3 степени.
Число циклов квадрирования (достаточно 3-5) занести в П0.

Указания:
Выполнение программы - В/0 С/П.
После выполнения программы коэффициенты квадрированного уравнения а0m, a1m, a2m, a3m остаются в ячейках соотв. П4,П1,П2,П3.
Для вычисления корней - формула X{i}=(a{i-1;m}/a{im})^(1/2^m).
Здесь, например, а{im} - а с индексом im.

→ Игры

Игры для ПМК

Schorched earth (Casio fx9750g)

Моя версия игры schorched earth для casio fx9750g.

В архиве лежит игра (.cat) и скины.
+добавил третью версию.

Бестолковый "теннис" (152)

Единственной причиной, побудившей написАть программу, было прочтение статьи в "Википедии" про первую в мире игровую приставку, на которой можно было играть только в похожий "теннис". Попробовала написАть такую же программу для МК-152, но получилось очень скучно. Буду рада, если кто-нибудь доработает программу.

Быки и коровы (152)

Игра «Быки и коровы». Обновлены инструкция и программа для Б3-34 из книги [1]. Файл bik.mkl предназначен для компиляции программой mkl2mkp версии 0.21 и больше, т.к. использует псевдокоманду .NUMT .

БЫКИ И КОРОВЫ

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

С программируемым микрокалькулятором в «быков и коров» можно играть в одиночку. Можно устроить и соревнования. В этом случае каждый из участников проводит с калькулятором несколько партий. Хотя некоторую роль играет и везение, игрок, систематически делающий на основе получаемой информации логичные умозаключения, обычно имеет лучшие результаты.

Правила игры

Правила игры чрезвычайно просты. Один из партнёров — ведущий. Он задумывает любое четырёхзначное число. Требуется лишь, чтобы ни одна из составляющих это число цифр не повторялась. Задача другого партнёра (будем называть его просто игроком) — отгадать это число. Игрок называет пробные числа. Игра заканчивается, если названо число, задуманное ведущим. Чем меньше ходов-попыток потребуется для этого игроку, тем лучше он играет.

Ведущий помогает игроку подсказками. Что это за подсказки, рассмотрим на конкретном примере.

Пример игры

Предположим, задумано число 9480. Назовём его кодом. Как и предписывается условиями игры, все цифры в коде различны. Игрок называет своё пробное число 7984. Ведущий сравнивает его с кодом 9480. Так как числа не совпадают, то игра не закончена. Ведущий сообщает игроку количество «быков» и «коров», содержащихся в предложенном им пробном числе. «Быками» называются те его цифры, которые по значению и позиции совпадают с соответствующими цифрами задуманного кода. В нашем примере «бык» один — цифра 8. «Коровы» — это цифры, которые совпадают с цифрами задуманного кода, но находятся в иных позициях. В числе 7984 «коров» две: 9 и 4. Понятно, что отгадать код или назвать четыре «быка» — это одно и то же.

На ЭКВМ играть стало проще, так как игра использует строку комментария для сообщения о количестве «быков» и «коров», ведёт журнал попыток, а также самостоятельно подсчитывает их количество. Запуск игры под ВК-6 выявил несколько недостатков эмулятора (неточности двоичной арифметики при K{x} и сравнениях, а также отображения шрифта 1), которые сейчас исправляются. Так что пока поиграть смогут лишь владельцы железной ЭКВМ.

Инструкция

1. Установите счётчик адресов на нуль клавишей В/О. Если программа доступна в электронном виде, загрузите её с диска или компьютера и переходите к пункту 3.

2. Осуществим первоначальный ввод программы:
2.1 переведите калькулятор в режим программирования нажатием клавиш F ПРГ и введите программу до блока текстовых сообщений;
2.2 переведите калькулятор в режим ввода байт нажатием клавиш Р ПРГ и введите шестнадцатеричный код сообщений;
2.3 верните калькулятор в режим вычислений нажатием клавиш F АВТ;
2.4 вновь клавишей В/О установите на нуль счётчик адресов;
2.5 нажмите клавишу ВЫХОД, выберите ДОС, ваш электронный диск, каталог и с помощью клавиши ФАЙЛ создайте файл программы «Быки и коровы» (начальная страница 0, число страниц 6);
2.6 вернитесь в основное меню, нажав несколько раз клавишу ВЫХОД, выберите Калькулятор и нажмите клавишу ВВОД.

3. Запустите программу на счёт командой С/П

4. Нуль, появившийся на индикаторе, означает, что микрокалькулятор «задумал» число и вы можете его отгадывать. В строке комментариев выведено приглашение. Введите пробное четырёхзначное число, закончив ввод клавишей С/П

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

6. Если число, задуманное калькулятором, не отгадано, индикаторе появляется число вида БК, где Б — число «быков», а К — «коров». Оно же расшифровано чуть ниже, в строке комментария. Нажатием клавиш К ГРФ можно просмотреть свои предыдущие попытки отгадать число. Введите новое пробное число так, как описано в п.4

Литература

[1] Кибернетика. Микрокалькуляторы в играх и задачах. — М.: Наука, 1986. — 160 ил. — (Серия «Кибернетика — неограниченные возможности и возможные ограничения»)

Игры для МК-161/152. Часть 1.

Начинаю выкладывать игры для ПМК, адаптированные мной (с улучшением сервиса и новыми функциями) для МК-161 (или МК-152), а также игры собственной идеи и разработки.

По умолчанию везде переключатель угла - "Г".

1. "Гонки на зимнем озере". Rally.mkp

Игра простенькая, но довольно интересная. Есть мультиплеер :), то есть можно играть параллельно на разных ЭКВМ или на одном по очереди, и потом сравнить результаты.

Вот тут исходный вариант:

http://lordbss.narod.ru/pmk240.html

Убрал ненужную проверку на нулевую скорость, добавил сообщения о вылете на обочину и финише. Штрафные очки убрал, при вылете к времени добавляется 3 (сани вытаскивают из снега). Кое-где сделал округление до целых. При запуске вводится длина трассы, ВО СП. При останове сверху вниз:

Время участника
Сколько осталось до конца трассы
Скорость
Расстояние до левой обочины

Ввод хода: приращение скорости (-1, 0, 1) В1 угол руля СП.

При вылете на обочину нажать СП. При финише - в РХ общее время игрока.

2. "На горизонте кит". Whale.mkp

Одна из моих любимых игр. Очень азартная. Опубликована в ТМ 8'87, на ЭКВМ без доработки не идет. Адаптировал, добавил текстовые сообщения, автоматизировал весь ввод исходных данных. Время маневра теперь 60 с (гораздо реалистичнее), дистанция пуска гарпуна 500 м. Обе величины заданы в начале программы, можно менять как угодно.

Запуск: ВО СП.

При останове сверху вниз:

Скорость кита
Курс кита
Y кита от судна
X кита от судна

Маневр: курс судна В1 скорость от 0 до 5 СП. Если появилось сообщение о выстреле, сначала ввести угол прицела пушки, В1, потом маневр. При промахе в РХ - на сколько промахнулся гарпун. При попадании - число сделанных ходов.

Удачной охоты! :)

Продолжение следует.

UPDATE: Выложена новая версия "Кита" - 1.01.

- исправлены ошибки с повторным заходом на кита и неверным выводом дистанции до гарпуна
- игровое поле уменьшено до 10x10 км
- скорость кита увеличена

Игры для МК-161/152. Часть 2.

В конце грозового августа 1914 года легкий крейсер германского флота "Эмден" скользил по тихим водам Индийского океана...

Наследник пиратов и флибустьеров, осколок XVII века в веке XX-м, корабль-одиночка с тремя сотнями моряков вынужден был противостоять всей мощи Британской империи, над которой тогда еще не заходило солнце. Без баз, без поддержки, заранее фактически списанный своей страной со счетов, крейсер должен был успеть уничтожить столько вражеских судов тут, на краю света, сколько удастся.

Его называли "Белым лебедем Индийского океана". Он воевал как настоящий джентльмен, и враги его уважали, а в Великой войне (позже названной Первой мировой) это было уже редкостью. Он не погубил напрасно ни одного человека. Он нанес врагу вреда больше, чем десяток беспомощно стоявших в порту огромных линкоров.

О крейсере "Эмден" и других рейдерах Первой мировой войны написана отличная книга "Корсары кайзера" Игоря Бунича (вообще он, ныне покойный, был отчаянным резунистом и злым антисоветчиком, но вот чисто морские книги ему удавались неплохо). Ссылка: http://lib.rus.ec/b/71651

Ну а написанная мной игра "Белый лебедь" в простейшей форме моделирует потрясающие приключения "Эмдена".

Основной файл - Swan.mkp. В файле Readme.txt - краткая инструкция ко всем трем играм, которую с помощью MK.EXE можно загрузить в область текста ЭКВМ, чтобы иметь всегда под рукой.

Правила:

Игровое поле - квадрат, размер задается в РА перед началом игры (50). В РБ - число торговых кораблей в океане (10). В РС - число английских крейсеров (5). В РД - начальный запас угля на "Эмдене" (100). Затем ВО СП.

Игра расставляет в случайном порядке на поле все корабли. На одной клетке могут быть несколько любых кораблей (кроме "Эмдена, конечно).

При останове сверху вниз в стеке:

Дистанция до ближайшего торговца (данные радиоперехвата)
Дистанция до ближайшего крейсера со знаком минус
Координата Y "Эмдена"
Координата X "Эмдена"

Маневр вводится цифровой клавишей: 1 - влево вниз, 2 - вниз, 7 - влево вверх и т.д. СП.

В РД - текущий запас угля (расход 1 за ход). Пополнять "Эмдену" уголь негде, можно надеяться только на захват вражеских угольщиков.

При сближении с торговым кораблем на дистанцию 1 клетка появляется соообщение о его типе:

Нейтрал - очки не начисляются, на месте стоять не надо
Торговец - обычный грузовой корабль, 1 очко, следующий ход пропускается - проверка груза, снятие команды, подрыв корабля
Угольщик - 1 очко, 100 тонн угля, 2 хода пропускаются (перегрузка угля на "Эмден")
Войсковой транспорт - везет снаряды и вооружение. 2 очка. 1 ход пропускается.
Вспомогательный крейсер - вооруженный торговый корабль. 3 очка. 3 хода пропускаются (ремонт после повреждений в бою).

Торговые корабли не двигаются (они слишком тихоходны, чтобы крейсера считались с их скоростью). После потопления торговца он снимается с карты (в том числе нейтрал, хотя он не и топится).

В начале игры английские крейсера перемещаются случайным образом. Как тольк "Эмден" захватывает и топит торговый корабль, тот посылает по радио сигнал "R.R.R." - "нападение рейдера!". К месту нападения устремляются ВСЕ крейсера. Когда первый из них достигает соседней клетки, он сигнализирует остальным, что "Эмден" ускользнул, и крейсера опять начинают случайный поиск в океане.

Если "Эмден"оказывает на дистанции 1 клетка от английского крейсера - он погибает. Артиллерия легкого крейсера не способна справиться с броней мощных военных кораблей. От общего счета отнимается пять очков и он выводится на экран. То же происходит, если закончился уголь.

Если "Эмден" выходит за границу поля - он покидает театр военных действий и идет на родину. В этом случае выводится сообщение с общим счетом, к которому прибавляется пять очков.

Удачной игры!

Жду любых отзывов, предложений, критики.

Игры для МК-161/152. Часть 3.

Игра "Лунолёт-XXI" представляет собой слияние пяти игр, опубликованных в ТМ №№6-9 за 1985 год: Лунолёт-1, Лунолёт-2, Лунолёт-3, Маскон и Вершина. Добавлена масса сервисных функций, и главное - случайно генерируемый рельеф лунной поверхности и возможность встречи с масконами. Убран только старый посадочный блок, работавший абсолютно неадекватно как на больших перегрузках, так и на любом рельефе.

Рекомендуется летать на "Лунолёте-XXI" в одиночку (Р5=2150) из-за повысившейся сложности игры. И расход топлива меньше, и жертвы :)

1. Общие правила.

Запуск игры производится либо командой 1 ВО СП (в этом случае в регистрах 4, 5, 6, 7, 0, A, B, C, D должен быть задан заранее стандартный набор исходных данных из "Лунолета-3"), либо 0 ВО СП (тогда набор исходных данных создается автоматически для Луны и "Кон-Тики").

При рабочем останове на экране выводятся сверху вниз:

- первая космическая скорость
- гориз. скорость
- верт. скорость
- высота с учетом рельефа (она же в Р3).

В РС, РД, и Р8 - стандартные угол по планете (приведенный к виду -180..+180 градусов), топливо и ускорение. В Р1 - общее время полета (секунды). В РЕ - расстояние от базы (точки старта) вдоль поверхности планеты.

Маневр задается так:

Угол отклонения тяги от вертикали В1 расход топлива В1 время маневра СП.

При посадке или аварии (высота меньше нуля) появляются соответствующие сообщения при обнулившейся высоте. Считается, что лунолет сел, а не разбился, при общей скорости менее 3 м/с и на ровной поверхности (без наклона). В обоих случаях в регистре Т стека - расстояние до точки старта в километрах.

Производится контроль перегрузок (установлено предельное значение 3g). При потере сознания выводится сообщение, в РХ - время "отключки", в РУ - величина перегрузки (кратность g). Далее надо нажать СП и вводить следующий маневр.

2. Рельеф.

Стартовая площадка находится в кратере диаметром около 25 км. При вылете за пределы кратера появляется рельеф. Переключение между экраном рельефа и рабочим экраном делается командами К ГРФ и К ЭКР. "Кон-Тики" обозначен точкой, в левом верхнем углу - Земля. На обратной стороне Луны рельеф не выводится, только положение "Кон-Тики" на темном экране. Рельеф задается случайно и не повторяется при возвращении на очередной участок полета (кроме стартового кратера с его нулевой высотой "над уровнем моря"). Горы на Луне, согласно отчету Перепелкина, бывают высотой до 3500 м. Соответственно, лететь по орбите ниже этой высоты довольно рискованно.

Посадку вне стартового кратера рекомендуется производить на как можно более низкой поверхности (просто чтобы не карабкаться потом в скафандре по лунным горам).

3. Режим полета по орбите.

Когда горизонтальная скорость выравнена с первой космической, а вертикальная приближена к нулю, можно в рабочем экране отдать команду 0 СП. "Кон-Тики" переходит в режим орбитального полета - появляется всегда экран рельефа, двигатель выключен, время маневра установлено равным 120 с. Для следующего шага можно нажимать любую клавишу, кроме СП. Клавиша "ВВОД" возвращает "Кон-Тики" в рабочий режим (для проверки, коррекции и начала посадки).

4. Масконы.

Во время полета по орбите есть небольшая вероятность встречи с масконом (дополнительное ускорение в эпицентре - 1%, согласно лоции Перепелкина). Таким образом, на экране рельефа (особенно над обратной стороной Луны) надо внимательно следить за положением "Кон-Тики", чтобы не допустить сильного падения высоты (там горы!) и вовремя выровнять ее.

Мягкой посадки!

Как обычно, жду отзывов и предложений.

UPDATE: Выложена версия 1.01:

- Земля теперь похожа на Землю :)
- Земля перемещается по экрану рельефа в соответствии с отклонением РС от 0, в противоположном полету направлении

Лунолёты, классические игры для ПМК (34, 61, 152).

Здесь выложены пакеты игровых программ цикла «Путь к Земле», публиковавшихся в журнале «Техника-молодёжи». Программы рассчитаны на советские ПМК, но могут быть запущены на МК-152.

Каждый пакет состоит из файла программы и файла с исходными данными, взятых из соответствующего номера журнала. Значение имеют только 15 первых регистров. Аварийное сообщение, разумеется, цифровое. Это восемь восьмёрок. В версиях, адаптированных для МК-152 эти сообщения легко сделать текстовыми и разнообразить.

Просьба сообщать обо всех замеченных ошибках и неточностях, а также об успешном тестировании программ древнейшего игрового цикла. Мне действительно интересно, как людям летается в 2008 году, при отсутствии такого мощного ЦУП, которым был журнал «Техника-молодёжи».

Лунолёты, посадка на Землю (34, 61).

Последний этап путешествия «Кон-Тики» это приземление. Ниже приводятся четыре «Атмосферы» в том виде, как они были опубликованы в ТМ, плюс исходные данные. Приземление это самый трудный этап, по свидетельству Михаила Пухова до возвращения на Землю дожили лишь немногие участники перелёта.

Также прикреплены остальные игровые программы космического цикла («Многоступенчатая Ракета-2», оба «Гравилёта», «Лунолёт-Д»).

Программы, использующие динамический опрос переключателя градусной меры («Лунолёт-Д»), недокументированную команду «точка» и другую еггогологию, для работы на МК-152 требуют доработки.

Лунолёты, продолжение (34, 61).

Ниже прикрепил следующую порцию игровых программ из серии «Путь к Земле» с полными комплектами данных из существующих игровых заданий. Инструкции, сами задания и н/ф рассказ смотри в подшивке ТМ.

«Маскон» и «Вершина» (из ТМ №9/1985), позволяющие изучить сложности лунного пилотажа, должны пойти на «Электронике МК-152». Не вижу особого криминала и в четвёртом «Лунолёте». Программа «Кеплер» (с детства вгонявшая меня в шок) зациклена в соответствии с инструкцией для МК-61/52 и также готова к тестированию на МК-152.

Программы серии «ОС» (Орбитальная Станция) должны быть доработаны, т.к. стыковочное сообщение «1 -00», занулявшее числа меньшие единицы, является элементом еггогологии. (Мне не жаль, всё равно оно работало ненадёжно.) Как, впрочем, прохудился и «Лунолёт-1М», ведь 3ГГ0Гов на МК-152 нет. Программа «Место под Солнцем» (ТМ №10/1985) трижды использует косвенную адресацию “со стрелочкой”, эти команды следует заменить на двухшаговые.

К счастью, огромная память МК-152 и сервисные возможности MK.EXE по (де)компиляции позволяют сделать необходимые изменения без труда. Первопроходцам МК-152 намного проще осваивать Луну, чем владельцам других “летательных средств”.

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

Морской бой (TI-89)

Эту игрушку писал сначала для Casio fx-9750G PLUS. Приблизительно за неделю придумал основные компоненты игры, а отлаживал работу между блоками и вносил некоторые усовершенствования несколько месяцев. Когда по работе нужно было много считать удалял ее, а потом в течение 3-4 часов :-) набивал ее снова (кабеля для подключения к ПК нет). Купил TI-89T и переписал программу для него без существенных изменений. Ускорилась прорисовка действий. Для начала игры запустите файл waronsea.

Игровое поле выглядит как на листочке в клеточку, два игровых поля 10 на 10. Слева поле калькулятора (C), а справа ваше (G). Для игры используются клавиши с цифрами и буквами (горизонтали и вертикали на экране подписаны), причем для того чтобы набрать 10 нужно нажать ноль. Для информирования программы о результате ее хода нажимайте клавиши M (мимо), R (ранен), U (убит).

Программа не подглядывает расположение ваших кораблей, поэтому нужно играть очень внимательно, чтобы не ответить "мимо" тогда, когда ваш корабль "ранен". Иначе в процессе игры баланс подбитых кораблей не сойдется и игра не завершится (зависнет; нажать "ON", "ESC" и запустить программу снова). В одной из версий реализовывал защиту от таких случайных нажатий, но когда игроки узнавали, что для реализации этой функции программа подсматривает, единодушно высказывались "это нечестно". Пришлось убрать (хотя программа подглядывала лишь для контроля случайных нажатий, но не для генерации хода).

Программа состоит из следующих частей
1) Блок рисования поля;
2) Блок расстановки кораблей калькулятора;
3) Блок контроля ручной или автоматической расстановки кораблей игрока;
4) Блок анализа хода игрока и генерации ответа;
5) Блок генерации хода калькулятора и обработки ответа игрока;
6) Блок добивания раненого корабля игрока;
7) Вывод сообщения о завершении игры.

После запуска программы можно наблюдать следующее:
- Рисуется игровое поле, подписываются горизонтали и вертикали;
- Появляется окно с предложением выбрать игровой набор (по умолчанию используется классический 1, 1, 1, 1, 2, 2, 2, 3, 3, 4). Можно выбрать некоторые другие наборы, а если разобрались с программированием, то можно добавить свои дополнительные наборы в текст самой программы. При повторном запуске они будут доступны в этом окне.
- Появляется окно с информацией о том, что калькулятор расставляет свои корабли (осуществляется секунд за 20);
- Появляется окно с предложением вручную или автоматически расставить ваши корабли (по умолчанию подсвечивается поле AUTO). При выборе поля MANUAL окно исчезает. Нажимаете букву и цифру, т.е. координаты поля с которого начинается корабль и продолжается либо вверх (нажать стрелку вверх), либо вправо (нажать стрелку вправо). Правильность расстановки кораблей автоматически контролируется как при автоматической, так и при ручной расстановке. Нельзя поставить корабль углом или так, чтобы они соприкасались сторонами или углами.
- После завершения расстановки кораблей всегда ваша очередь хода; Нажимаете букву и цифру. Они отображаются над вашим полем со знаком вопроса. Над полем калькулятора высвечивается ответ MIMO (на указанном поле ставится крестик), RANEN (на соответствующей клеточке корабля появляется дырка) или UBIT (точки корабля инверсируют, после чего вокруг убиенного автоматически расставляются знаки мимо [крестики]). В последних двух случаях очередь хода опять переходит к вам.
- Ход калькулятора. Над его полем появляются координаты поля с вопросом. Вы должны нажать M (мимо), R (ранен) или U (убит). Над вашим полем будет выведено соответствующее сообщение. Далее последует автоматическая расстановка соответствующих значков.
- И т.д. и т.п.
- Если количество битых кораблей у кого-либо из игроков равно количеству кораблей выбранного в начале игры набора, то игра завершается. Над игровым полем победителя выводится соответствующее сообщение.

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

Файлы с игрой нужно установить в отдельную папку и защитить их блокировкой или архивированием. Делать это нужно до запуска игры иначе заблокируете созданные игрой переменные и не сможете играть (пока не разблокируете их).

Не добавлял удаление ненужных переменных в конце игры, добавьте сами в конце основного файла. Какие именно переменные узнаете сыграв полностью один раз.

Будет отпуск перепишу эту программу для HP-50G

:-]

Охота на "лис" (152, 161)

За основу взята программа Ю.Иванова и П.Иртюга из журнала "Наука и жизнь" №10 за 1990 г.

Основные изменения: добавлен графический интерфейс и переделан алгоритм генерации поля.

Правила игры (кратко):

На поле 10х10 клеток спрятаны от 1 до 9 "лис" (по выбору игрока).

Игрок может проверить любую клетку. Результатом будет или число "лис", пеленгуемых по горизонтали, вертикали и диагонали из этой клетки, или отметка об обнаружении в этой клетке "лисы".

Цель: Отыскать всех "лис" за наименьшее кол-во ходов.

Особенности реализации:
- в одной клетке не может быть спрятано более одной "лисы"
- повторные проверки клеток без "лис" увеличивают счётчик ходов.
- найденные "лисы" тоже пеленгуются
- можно ставить/убирать отметки на любых клетках (метка XOR-ится с изображением)

Управление(цифровыми клавишами):
1-4, 6-9 - перемещение курсора по полю в соответствующих направлениях
0 - поставить/убрать отметку
5 - проверить клетку

Примечание: чрезмерной оптимизации не делал (так, по мелочам). Программа не переносима и привязана к 0-й странице. Занимает 6 страниц ПП и использует регистры с R0 по R23.

Запуск - просто В/О С/П

Питон (152)

"Цель игры - собрать как можно больше призов за меньшее время. Призы выводятся как отдельные точки на игровом поле (слева). Количество собранных призов выводится справа. После каждого собранного приза питон удлинняется, но не более максимального значения, записываемого в R16 в адресах 32-36. Сбор приза подтверждается звуковым сигналом, частота которого (высота тона) задается в адресах 235-237. Для отключения звука следует записать по этим адресам нули.
Управление питоном производится при помощи клавиш со стрелками: ←,↑,↓,→. Сразу после запуска программы питон неподвижен до нажатия любой клавиши. Игровое поле замкнуто (тороидальная топология), то есть ушедший вправо питон вылезет слева и т.п. Питону нельзя пересекать самого себя.
После окончания игры (самопересечения) в регистре X выводится число собранных призов, в регистре Y - потраченное время в формате "М,С".
Приведенную программу следует рассматривать как основу для более интересных игр. При желании она может быть усовершенствована. Например, добавлено большее количество жизней (допустимое количество самопересечений), различные типы призов, препятствия. Возможна реализация и сетевого варианта игры - несколькими питонами на общем игровом поле, с обменом данными между ЭВМ по параллельному или последовательному порту.

Взято с этой страницы сайта НПП "СЕМИКО". Там же можно найти подробный разбор кода этой программы.

Пятнашки (HP-50G)

Переписал игру "Пятнадцать" для HP-50g. Есть звук, "шустрость" увеличена (загрузка менее 3 сек.). Управление стрелками. После расстановки всех фишек нужно нажать Enter, осуществляется проверка правильности расстановки (выводится соответствующее сообщение), удаляются переменные, очищается экран.

Важно:
1) игру сбросьте в отдельную папку;
2) игра включает (и не выключает) звук, отключает звук нажатия клавиш, устанавливает режим DEC, убирает (и возвращает) часы.

Если Ваши настройки нужно сохранить, пропишите в самом начале и в самом конце программы соответственно сохранение и вызов системных флагов. Тогда после игры все будет как до нее.

В TI-89 T скорость можно увеличить за счет аналогичных команд. В обеих моделях время загрузки можно уменьшить, убрав генерацию случайной расстановки. В этом случае можно использовать перемешивание фишек на исходной расстановке с помощью подпрограммы обработки нажатий. Тогда количество случайных движений, которые можно задать перед игрой, будет соответствовать сложности решения задачи. Как следствие уменьшится размер программы, т.к. нужно будет хранить только одну картинку, а не 17. К сожалению, других более скоростных игрушек без привлечения C или ассемблера не напишешь. Хотя на эмуляторе скорость выше, что-то может будет работать.

ОБНОВЛЕНИЯ:
Программа в архиве Prg15(New).rar использует только локальные переменные, все настройки калькулятора после игры восстанавливаются, ускорена расстановка и прорисовка фишек (генерация расстановки 5-6 сек., прорисовка 1 сек).

В следующей программе Prg15(NewR).rar добавлен блок обеспечивающий восстановление настроек калькулятора в состояние до запуска игры при "аварийном" (нажата клавиша ON) останове игры. В подобном случае в каталог с игрой будет размещена программа восстановления CReStr. После ее активации будут восстановлены все измененные игрой настройки калькулятора, удалены ВСЕ локальные переменные вида <-Var из стека локальных переменных. После активации программа восстановления удалит сама себя из каталога с игрой.

ВАЖНО:
Если "аварийный" останов был выполнен несколько раз подряд, и CReStr не использовалась, то содержимое стека локальных переменных может занимать некоторый объем памяти. Если в этом случае сыграть в игру до конца, то будет удален набор локальных переменных созданный ТОЛЬКО текущей игрой, а остальные останутся в памяти, настройки придется возвращать вручную. Поэтому лучше сразу воспользоваться CReStr.

Фото игрового поля на эмуляторе.

ПРИМЕЧАНИЕ: В старой версии при установленных системных флагах 2 и 3 калькулятор может задавать вопросы об изменении режима (в новых версиях исправлено).

Здесь обновление игры для TI-89 T (время загрузки менее 4 сек.). Также как и для HP-50G полностью на локальных переменных.

Пятнашки (TI-89)

Запускаем игру "prog_15f". Буква f означает что этот вариант игры быстрый. Был еще и медленный вариант в котором фишки двигались плавно, но мне надоело смотреть как их размазывает при движении, оставил только этот вариант.
После запуска генерируется случайная последовательность (перестановка) и выполняется ее проверка на четность. Для чего?

Вы, вероятно, помните что при перемещении фишек, если вы их вынимали из коробочки для перемешивания, не всегда получается расположить их по порядку. Все возможные варианты расположения можно разбить на два класса - четные и нечетные. Все четные разрешимы (упорядоченное расположение является четной перестановкой). Все нечетные сводятся к неразрешимому варианту, в котором первые три ряда фишек расположены как надо, а последний ряд имеет вид 13, 15, 14 (не вынимая фишки решить данную задачу нельзя).

Если перестановка четная, запускается прорисовка игрового поля. В противном случае, меняются местами две соседние фишки (из нечетной перестановки делаем четную) и только после этого запускается прорисовка.

Управление осуществляется стрелочками. Нажатие клавиши подтверждается высвечиванием слов: right, left, up, down. Если нажимается стрелка указывающая движение в том направлении, в котором ни одну фишку сдвинуть нельзя, выводится error ! Отображается число сделанных ходов. Если в течение приблизительно 10 секунд не выполняется никаких перемещений, то выполняется проверка правильности расстановки фишек. Если хотя бы одна фишка находится не на своем месте, то ничего не происходит. В противном случае выводится You win !

Для того чтобы избежать конфликтов с глобальными переменными (a, d, f, fff, g, i, j, k, l, list1, list2, m15, n15, pic, r, stp, t, u, uuu, vol, vvv, w) рекомендую установить игру в отдельную папку. Указанные переменные в момент появления сообщения You win ! будут удалены. Файлы игры (картинки pic1 ... pic15, move*, prog_15f, selpic) рекомендую защитить блокировкой или архивированием.

Для того, чтобы дописать к программе решатель времени пока не могу найти.
Можно было бы, конечно, пойти по короткому пути, перемешивать фишки с исходного расположения и запоминать выполненные случайные ходы, тогда "решением" будет воспроизведение записанных ходов в обратном порядке (возможно из-за того, что считаю такой подход халтурой, так не сделал).

ОБНОВЛЕНИЕ:
В архиве Prg15NewTI89.rar обновление игры с увеличенной скоростью работы (время загрузке менее 4 сек.).

Теннис с настройками (152)

Нововведения

В этом новом теннисе появилось несколько настроек, которые помогут игроку самостоятельно установить размер ракетки и шарика. Кроме этого, у тенниса появилась тёмная сторона!

Также реализованы пожелания SMB и ATH по поводу:
- использования в программе механизма прерываний, что позволило сделать движение ракетки плавным
- дать возможность отбивать шарик разными частями ракетки под разным углом

А также учтены старые пожелания для увеличения скорости:
- уменьшение частоты вызова К ГРФ
- рисование ракеток в виде прямоугольников, а не линий.

Ячейки, используемые для настройки

ПD - размер шарика [осторожно, не cделайте его черезчур гиганским]
ПС - размер ракетки [чем он меньше, тем сложнее отбить мяч]
ПЕ - если ввести сюда 0 или 2, то теннис будет обычным, например, таким:

Или таким:

Если же ввести 1, то мы попадаем на удивительную тёмную сторону тенниса ;) :

Структура программы

Адреса:
0000-0027 - очищаются, а затем задаются вектора, приоритеты и номера прерываний по нажатию и по отпусканию кнопки.
0030-0055 - отрисовывается начальное состояние экрана, в т.ч. оказывается задействована подпрограмма 0112, затем идёт переход на адрес 0130.
0059-0069 - подпрограмма рисования текущего положения шарика по его координатам П2 и П3.
0070-0088 - обработка прерывания по нажатию клавиши: в П20 заносится либо 1, либо -1, в зависимости от того, какая именно клавиша нажата.
0095-0099 - обработка прерывания по отпусканию клавиши: в П20 заносится 0.
0100-0111 - подпрограмма рисования текущего положения ракетки игрока по значению ПА - координате ракетки по Y.
0112-0127 - подпрограмма инициализации начальных значений, использующая подпрограммы 0059 и 0285.
0130-0133 - на этом этапе в первый раз отрисовывается ракетка игрока путём вызова ПП 0100.
0134-0149 - если в П20 не ноль, то положение ракетки игрока соответственно переделывается [она катится на 1 пиксель вверх или вниз], иначе ничего не происходит.
0150-0255 - путём вызова ПП 0059 закрашивается текущее положение шарика и вычисляется новое. При этом скорость мячика хранится в ячейках П6 (по координате Х, записанной в П3) и П5 (по координате Y, записанной в П5) и изменяется в зависимости от столкновений со стенками и игроком. Затем мячик снова рисуется. На адресе 0249 находится злобный оператор К-, который останавливает игру, если игрок пропустит мяч.
0260-0273 - здесь перерисовывается положение ракетки МК, которая всегда верхним концом стремится находиться напротив шарика [поэтому, как и раньше, непобедима]. Затем идёт возвращение на адрес 130.
0285-0299 - подпрограмма рисования ракетки МК по значению ПВ - координате ракетки по Y.

Все ячейки, задействованные программой:
П А - координата ракетки игрока;
П В - координата ракетки МК;
П С - длинна ракеток;
П D - размер шарика;
П Е - нормальный или инвертированный вывод на экран;
П 2, П 3 - координаты шарика;
П 5, П 6 - скорость шарика;
П 20 - скорость ракетки.

Недостаток программы

Заключается в том, что при движении ракетки игрока игра заметно замедляется.

P.S. Думаю, нужно обратить внимание на рябь и чёрную полосу в крайнем правом столбце двух из приведённых рисунков. На самом деле на экране МК-152 этих удивительных вещей не видно, да и неоткуда им взяться. Возможно, это глюки программы обмена ЭКВМ-ПЭВМ версии 1.10.

→ Комбинаторика

Комбинаторика

Вычисление факториала (34, 61, 152)

Вычисление факториала N! = 1x2x3x...xN, включая значение 0! = 1.

00.ВП  01.П0  02.1  03.ИП0  04.x  05.FL0  06.03  07.С/П  08.КБП0

Инструкция: N В/О С/П «N!» N1 С/П «N1!» ...

Пример: 10! = 3628800

Классическая программа, взята из справочника Дьяконова (Программа 3.33, стр. 148, 1989 год; Программа П3.1, стр. 216, 1986 год) и обновлена с учётом комментария уважаемого Гостя. Проверена для МК-152. Входные числа от 0 до 69, максимальное время счёта — 0,16 с.

Вычисление факториала (HP 50g)

« 1 1 ROT FOR I I * NEXT »

Очевидно, такой же фольклор. Знает, что 0!=1. Работает где-то в два раза дольше встроенной операции факториала (ALPHA Пр 2).

Количество сочетаний (61, 152)

Число сочетаний - часто используемая формула в комбинаторике. Это количество вариантов выбрать из множества объектов N наборы по K объектов.

 n      n!
C  = --------
 k   (n-k)!k!

Например вычислить количество вариантов Спортлото 5 из 36

C = 36!/((36-5)! * 5!) = 376992
C = 250!/((250-110)!*110!) = 1.5120188e73 (это долго считает)

    0     1     2     3     4     5     6     7     8     9
00  П1    XY    -     FBx   Kmax  ИП1   XY    -     П0    1
10  П2    ИП2   ИП1   *     ИП0   /     П2    КИП1  FL0   11
20  ИП2   С/П   БП    00

Инструкция: k [^] n [С/П]
при индикации ошибки (ЕГГОГ) перед вводом новых данных нажать [В/О]

Регистры:
П0 - меньшее число из k и (n-k)
П1 - n - количество элементов множества
П2 - регистр накопитель результата

Программа записывает n в П1, вычисляет меньшее из k и (n-k) и записывает в П0, очищает регистр-накопитель П2, записав туда 1 (адр 00..10). Затем выполняется основной цикл вычислений (адр. 11..19) где содержимое накопителя поочерёдно умножается на число из числителя, делится на число из знаменателя, а затем декрементируются оба регистра источника данных П1 и П0. По окончании вывод резкльтатов, останов и переход к началу программы.

Программа всегда выполняет минимальное количество итераций и потому способна считать значения не доступные инженерным калькуляторам со встроенной функцией. Например пример 2 Casio fx-82MS взять не в состоянии.

Здесь файл для Калькулятор3000
http://arbinada.com/pmk/system/files/nCk.C3

Количество сочетаний C(n,k) (152)

Программа для вычисления C(n,k)=n!/(k!(n-k)!) создана путём адаптации для МК-152 программ, написанных для советских ПМК.

00.П1  01.↔  02.–   03.FВx  04.Kmax  05.↔  06.П0  07.1  08.ИП1  09.x
10.ИП0 11.%  12.FL1 13.14   14.FL0   15.08 16.С/П 17.КБП0

Для ускорения счёта использована находка Епанечникова-Цветкова (использование FL1 для модификации R1), для уменьшения длины программы использованы особенности инструкции Kmax на МК-152 (минимальное число помещается в RY). Т.к. все промежуточные результаты хранятся в стеке, точность улучшена на два десятичных знака.

Регистры:
R1 n
R0 меньшее из k и (n-k)

Инструкция.
Чтобы посчитать количество сочетаний из n по k, надо ввести в стек k, затем n и нажать В/0 С/П. Результат можно прочитать на экране: k В↑ n В/0 С/П «C(n,k)»

Тестовые примеры.
1. Количество вариантов Спортлото 5 из 36:
5 В↑ 36 В/0 С/П «376992»
Итого: C(36,5)=376992

2. Вычисление производится с большой точностью. При необходимости дополнительные знаки можно вывести на экран. Например, вычислим C(250,110):
110 В↑ 250 С/П «1,5120243 73»
1,512024 ВП 73 – «2,688502 66»
Итого: C(250,110)≈1,5120242688502x1073

3. C(100,10) (МК-152, прошивка 1.03):
10 В↑ 100 С/П «1,7310309 13»
1,73103 ВП 13 – «9456440»
Итого: C(100,10)=17310309456440 — с точностью до последнего знака!

Основные формулы комбинаторики в HP-50G

В этой программе можно рассчитать количества основных комбинаторных соединений элементов (с повторениями и без них).
Достоинством программы является дружественный интерфейс, т.е. перед запуском программы ничего не нужно вспоминать (как оно работает), в стек ничего не нужно сбрасывать: запустил программу, выбрал нужные пункты, ввел данные, прочитал ответ.

<<
"SELECT TYPE:"
{ { "FACTORIAL" 1 } { "PERMUTATION" 2 } { "COMBINATION" 3 } } 1 CHOOSE
IF
THEN 'W' STO
ELSE "ERROR OF INPUT" MSGBOX KILL
END

"REPETITION:"
{ { "OFF" 0 } { "ON" 1 } } 1 CHOOSE
IF 
THEN "ERROR OF INPUT" MSGBOX KILL
END

CASE 
	'W==1'
THEN 
	IF 'R==0' 
	THEN "ENTER DATA:" 
	{ { "N= " "NUMBER OF ELEMENTS" 0 } } { } { 0 } { 0 } INFORM
	IF 
	THEN OBJ-> DROP R->I 'N' STO
	ELSE "ERROR OF INPUT" MSGBOX KILL
	END
	CLLCD N -> STR "!=" N ! ->STR + + MSGBOX
ELSE 
	"ENTER { ... } DATA: " 
	{ { "LIST:" "NUMBERS OF ELEMENTS" 5 } } { } { 0 } { 0 } INFORM
	IF 
	THEN OBJ-> DROP 'N' STO
	ELSE "ERROR OF INPUT" MSGBOX KILL
	END
	CLLCD "P" N ->STR "=" N SigmaLIST ! N ! PiLIST / ->STR + + + MSGBOX
	END
END
	'W==2'
THEN
	IF 'R==0' 
	THEN "ENTER DATA:" 
	{ { "N= " "TOTAL NUMBER OF ELEMENTS" 0 } 
	{ "K= " PARTIAL NUMBER OF ELEMENTS" 0 } } { } { 0 0 } { 0 0 } INFORM
	IF 
	THEN OBJ-> DROP R->I 'K' STO R->I 'N' STO
	ELSE "ERROR OF INPUT" MSGBOX KILL
	END
	CLLCD "A(" N -> STR  ","  K ->STR ")=" N ! N K - ! / ->STR + + + + + MSGBOX
ELSE 
	"ENTER { ... } DATA: " 
	{ { "N= " "TOTAL NUMBER OF ELEMENTS" 0 } 
	{ "K= " PARTIAL NUMBER OF ELEMENTS" 0 } } { } { 0 0 } { 0 0 } INFORM
	IF 
	THEN OBJ-> DROP R->I 'K' STO R->I 'N' STO
	ELSE "ERROR OF INPUT" MSGBOX KILL
	END
	CLLCD "A^(" N -> STR  ","  K ->STR ")="  N K ^ ->STR + + + + + MSGBOX
	END
END
	'W==3'
THEN
	IF 'R==0' 
	THEN "ENTER DATA:" 
	{ { "N= " "TOTAL NUMBER OF ELEMENTS" 0 } 
	{ "K= " PARTIAL NUMBER OF ELEMENTS" 0 } } { } { 0 0 } { 0 0 } INFORM
	IF 
	THEN OBJ-> DROP R->I 'K' STO R->I 'N' STO
	ELSE "ERROR OF INPUT" MSGBOX KILL
	END
	CLLCD "C(" N -> STR  ","  K ->STR ")=" N ! K ! N K - ! * / ->STR + + + + + MSGBOX
ELSE 
	"ENTER { ... } DATA: " 
	{ { "N= " "TOTAL NUMBER OF ELEMENTS" 0 } 
	{ "K= " PARTIAL NUMBER OF ELEMENTS" 0 } } { } { 0 0 } { 0 0 } INFORM
	IF 
	THEN OBJ-> DROP R->I 'K' STO R->I 'N' STO
	ELSE "ERROR OF INPUT" MSGBOX KILL
	END
	CLLCD "C^(" N -> STR  ","  K ->STR ")="  N K + 1 - ! N 1 - ! K ! * /  ->STR + + + + + MSGBOX
	END
END
END
{ W R N K } PURGE
>>

Программа содержит повторяющиеся модули. Попробуйте ее сократить.
Если же требуется использовать функции вычисления перестановок, размещений и сочетаний (с повторениями и без них), то можно определить следующие функции:
<< -> N 'N SigmaLIST ! N ! PiLIST /'>> 'RFACT' STO EVAL(для перестановок с повторениями)
<< -> N M 'N K ^'>> 'RPERM' STO EVAL(для размещений с повторениями)
<< -> N M 'N K + 1 - ! N 1 - ! K ! * /'>> 'RCOMB' STO EVAL (для сочетаний с повторениями)
Остальные случаи (без повторений) можно рассчитать встроенными функциями калькулятора.

Программа «Факториал-2» (152)

Программа вычисляет факториалы натуральных чисел N! = 1×2×3×...×N. При N<70 числа перемножаются напрямую, в цикле. При N≥70 используется уточнённая формула Стирлинга для log N! с членами до N5 включительно, что позволяет вычислять факториалы действительных чисел Г(N+1) практически мгновенно и с разумной точностью. Её быстродействие — существенный плюс по сравнению с программой «Факториал», если вам приходится часто вычислять факториалы больших чисел.

Порядок числа выводится в регистр X, цифры мантиссы можно взять в регистре Y. Разумеется, 1≤RY<10. Расположение чисел в стеке обратно по отношению к программе «Факториал» и сделано для того, чтобы с помощью двух команд F 10x × можно было привести вычисленное значение факториала в экспоненциальный вид, используемый в ЭКВМ. Конечно, такой трюк возможен лишь если RX≤99, то есть N<70.

Тестовые примеры (МК-161 версия 1.08):
10! = 3,6288 × 106 (все знаки верны)
69! = 1,7112245242812 × 1098 (13 знаков)
100! ≈ 9,3326215440544 × 10157 (10 знаков)
220! ≈ 2,2838603357443 × 10421 (10 знаков)
254! ≈ 1,3140590927665 × 10502 (10 знаков)
500! ≈ 1,2201368258939 × 101134 (10 знаков; точное значение 1,220136825991110… E1134)
1000! ≈ 4,0238725995403 × 102567 (10 знаков; точное значение 4,0238726007709377… E2567)
10000! ≈ 2,8462596692423 × 1035659 (8 знаков; точное значение 2,8462596809170545189… E35659)
99000! ≈ 4,2409642352665 × 10451575 (7 знаков; точное значение 4,2409644555330858657… E451575; вам не приходится ждать 19 минут)
1000000! ≈ 8,2639294326541 × 105565708 (6 знаков; результат тоже получается мгновенно)
ну и так далее...

Программа вдохновлена программой 3.35 из третьего издания справочника проф. Дьяконова и способна её заменить для калькуляторов, совместимых с МК-152, т.к. точнее.

;
; Программа «Факториал-2»
; Автор: Васильев И.В., 21 сентября 2011 г., Москва

; Вычисляет факториал F = 1*2*..*n = n! целого числа n методом перемножения (n<70).
; При n≥70 использует уточнённую формулу Стирлинга (с членами до n5)

; Инструкция: n В/0 С/П "порядок" ↔ "мантисса"
; Программа весьма вольно использует регистр R0
;
Start(00):
		ВП П0
		70 –
		Fx<0 Sterling(21)
		1
Loop(08):
		ИП0 × FL0 Loop(08)
		В↑  Flg K[x] П0
		F 10x ÷ ИП0
		БП qq(67)
Sterling(21):
		ИП0 Fx2 7 × F1/x 2 F1/x –
		ИП0 Fx2 15 × ÷
		1 +
		ИП0 12 × ÷
		ИП0 –
		1 Fex Flg ×
		ИП0 2 × Fπ × Flg 2 ÷ +
		ИП0 В↑  Flg × +

		K[x] FВx K{x} F 10x ↔
qq(67):	С/П
		БП Start(00)

Т.к. здесь недавно у новичков возникали вопросы по поводу того, как мы пишем программы для ЭКВМ, поделюсь опытом. Блоки этой программы мне было удобнее всего сочинять на бумаге. Потом я набивал их в обычном текстовом редакторе. Из-за того, что у меня сейчас нет под рукой Windows, вводил программу в МК-161 с клавиатуры, записывая адреса в скобочки после меток. Потом прошёлся по командам перехода, перебив адреса.

Если есть возможность запустить программу MK.EXE, ввод программы в ЭКВМ значительно упрощается.

Программа «Факториал» (152)

Как известно, факториалы целых чисел растут так быстро, что начиная с 70! их порядок перестаёт вмещаться в два отведённых десятичных разряда.

Программа «Факториал» позволяет вычислять факториалы больших чисел, ограниченных лишь быстродействием нашей «Электроники». Мне было забавно сравнивать её с функцией факториала, встроенной в HP 50g. Начиная с 254! зарубежный калькулятор отказался выдавать порядок числа (не вмещается в отведённый диапазон), 9999! вычислялся полтора часа, а начиная с 10000! буржуй просто отказывается брать факториалы.

Код программы снабжён комментариями и тестовыми примерами. Здесь отмечу, что в стеке постоянно весит «сверхчисло» F, представляющее из себя порядок и мантиссу вычисляемого факториала, поэтому все вычисления приходится укладывать в два оставшихся стековых регистра.

В процессе вычислений мантисса «сверхчисла» может расти и претендовать на выход из допустимого диапазона, поэтому в ключевых точках для нормализации «сверхчисла» вызывается подпрограмма Normalize.

Самым «узким» местом программы «Факториал» является вычисление степени 16-ти (между метками Result и Just16exp), на которую умножается результат перед выводом. Ведь операция Fxy обладает ограниченной точностью, а при достаточно больших y вызывает переполнение. В приведённом коде дилемма бескомпромиссно решена в пользу надёжности — специально подобранный x (мантисса 1649) позволяет использовать значения y вплоть до 53215 (R3<2607584). Но при этом небольшой быстрый линейный фрагмент с тремя операциями Fxy несколько губит точность, тщательно поддерживаемую в основном цикле, выполнение которого могло занимать минуты и даже часы.

Если вы готовы пожертвовать входным диапазоном n (всё равно большие n требуют невероятно долгих вычислений), то можете улучшить точность вычисления факториалов больших чисел. Для этого увеличим x и заранее занесём его точное значение в регистровую пару. Например, для регистровой пары 1,4615016 и 3,7330903E-08 (за x взята мантисса 1640) получим:

500! ≈ 1,2201368259918 ВП 1134 (точное значение 1,220136825991110… E1134)
1000! ≈ 4,0238726007708 ВП 2567 (точное значение 4,0238726007709377… E2567)
10000! ≈ 2,8462596809098 ВП 35659 (точное значение 2,8462596809170545189… E35659)
99000! ≈ 4,2409644556999 ВП 451575 (точное значение 4,2409644555330858657… E451575)

Время работы программы зависит от n практически линейно. Если вам нужно посчитать факториалы приближённо, но быстро, можно посоветовать воспользоваться другой моей программой — «Факториал-2».

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

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


; Программа "Факториал"
; Автор: Васильев И.В., 24-25 июня 2009 г., Москва

; Вычисляет факториал F = 1*2*..*n = n! целого числа n методом перемножения.

; Отличается тем, что считает отдельно мантиссу и порядок факториала,
; при этом степени двойки и пятёрки накапливаются отдельно.
; Промежуточное произведение хранится в стеке, что позволяет повысить
; точность вычислений до 12-13 десятичных знаков.

; 25.VI.09: вынес подсчёт степеней пятёрки из цикла и др. мелкая оптимизация

; Инструкция: n В/0 С/П "мантисса" <-> "порядок"
; Программа весьма вольно использует регистры R0=s, R1=n, R2=p и R3

; Пример: 24 В/0 С/П "6,204484" <-> "23"
; При вычислении 24! переменные n=24; p=2; s=4; k=1, 0
;	сомножители:	  1  *1		11 *11		21 *21
;			  2  (1)	12 (6)		22 *22
;			  3  *3		13 *13		23 *23
;			  4  (2)	14 (7)		24 *24
;			  5  *1		15 *3
;			  6  (3)	16 (8)
;			  7  *7		17 *17
;			  8  (4)	18 (9)
;			  9  *9		19 *19
;			 10  (5)	20 (10) *10! *10^2 *16^2
;
; Примеры (МК-152 версия 1.13):
; 69! = 1,7112245242811 ВП 98 (13 точных знаков; 0,82 с.)
; 100! = 9,3326215443955 ВП 157 (12 точных знаков; 1,22 с.)
; 220! = 2,283860335914 ВП 421 (13 точных знаков; 2,61 с.)
; 254! = 1,3140590921303 ВП 502 (13 точных знаков; 2,99 с.)
; 500! = 1,220136825992 ВП 1134 (12 точных знаков; 5,91 с.)
; 1000! = 4,023872600773 ВП 2567 (12 точных знаков; 11,65 с.)
; 10000! = 2,8462596809271 ВП 35659 (11 точных знаков; 1 мин. 55,56 с.)
; 99000! = 4,2409644533822 ВП 451575 (9 точных знаков; 19 мин. 5 с.)

		.CHARSET	1251
		.ORG		0
NewFactorial:
		M1				; Сохраним n в R1
		Cx				; Порядок результата F = 0
		M3				; Степени 160-ти будем накапливать в R3
		1				; Мантисса F = 1
Recurse:
		RM1 10 / KINT M2		; R2 = p, число полных десятков
		FANS <-> - 10 *			; Вычислим s, число единиц
		Fx!=0 ExtraDone			; Если все десятки полные, переходим к следующему этапу
		M0 FR				; R0 = s, восстановим стек
ExtraNext:
		RM1 *				; Бесхитростно перемножаем неполный десяток
		FL1 DecR1			; R1--, причём нуля не будет
DecR1:	FL0 ExtraNext			; Учитываем все s последних чисел
		GSB Normalize			; Нормализуем результат
		.DB 59h				; Код команды Fx>=0, чтобы пропустить следующий шаг
ExtraDone:	FR				; Очистим стек от нуля

; Теперь наше дело -- обработать все десятки вида (10k+1)*(10k+2)*..*(10k+10)
; Их количество p хранится в R2
;
		RM2 Fx!=0 Result		; Всё сделано, если число десятков p = 0

; Каждый десяток даст по множителю 160, сохраним их количество
;
		RM3 + M3			; Накопим кол-во десятков в R3

; Чётные числа (включая 10, 20 и т.д.) после деления на 2 образуют (n/2)!
; Этот факториал вычислим с помощью хвостовой рекурсии
;
		Cx 5 RM2 * M1 FR		; R1 = 5p, следующий вычисляемый факториал

; Пока что перемножим нечётные числа всех десятков
; Пятёрка особый случай, мы её отдельно перемножим с двойкой, получив десятку
;
Decade:	RM2				; R2 = k+1, счётчик k = p-1,..,0
		ENT + 1 - *			; * (2k+1), т.к. пятёрка умножается отдельно
		FANS 5 *			; X = 10k+5, восстановим для вычисления соседей
		4 - *				; * (10k+1)
		FANS 2 + *			; * (10k+3)
		FANS 4 + *			; * (10k+7)
		FANS 2 + *			; * (10k+9)
		GSB Normalize			; Нормализуем произведение
		FL2 Decade			; Перемножим нечётные числа всех десятков
		GOTO Recurse			; Затем рекурсивно займёмся чётными числами

; Нормализует сверхчисло, записанное в регистрах стека X (мантисса) и Y (порядок).
; Изменяет регистр 0.
;
Normalize:	ENT Flg KINT M0			; В R0 сохраним "лишний" порядок мантиссы
		F10^x /				; Убираем "нолики" у мантиссы
		<-> RM0 + <->			; Прибавляем их число к порядку
		RTN				; Возвращаемся в основную программу

; Наконец, домножим произведение на посчитанные двойки и пятёрки, т.е. 160 на десяток
; Во избежании переполнения каждые 16^49 посчитаем отдельно
;
Result:
		FR				; Очистим стек от нуля
		<-> RM3 + <->			; Нолики от пятёрок
		RM3 49 / KINT Px!=0 Just16exp	; Если множителей меньше 49, применим Fx^y
		M1				; Сохраним в R1 количество множителей по 16^49
		FANS <-> - 49 * M3		; Оставшиеся множители посчитаем, как обычно
		FANS <-> Cx 16 Fx^y		; Вычислим один раз 16^49
		EE 59 +/- <-> FR		; и возьмём его мантиссу x
		RM1 <-> Fx^y			; Возведём x в необходимую степень R1
		<-> FR *			; И умножим x^R1 на мантиссу F
		<-> RM1 59 * + <->		; К порядку F прибавим 59 на каждый сомножитель
		PGSB Normalize			; Нормализуем промежуточный результат
		.DB 59h				; Код команды Fx>=0, чтобы пропустить следующий шаг
Just16exp:
		FR				; Очищаем стек от нуля
		RM3 16 Fx^y <-> FR *		; Каждый десяток дал четыре "бесхозные" двойки
		PGSB Normalize			; Нормализуем окончательный результат
		R/S				; Выводим ответ
		PGOTO NewFactorial		; Считаем следующий факториал

		.END

→ Матрицы

Предлагаю выкладывать здесь программы, оперирующие матрицами.

Вычисление определителя матрицы 3х3 (34, 52, 152)

Текст программы:

    0    1    2    3    4    5    6    7    8    9
0   ИП7  ИП5  x    ИП3  х    ИП1  ИП8  x    ИП6  x
1   +    ИП4  ИП9  x    ИП2  x    +    ИП1  ИП5  x
2   ИП9  x    -    ИП8  ИП3  x    ИП4  x    -    ИП6
3   ИП7  x    ИП2  x    -    С/П  БП   00

Указания:

Перед выполнением программы внести элементы матрицы в память в соответствии со схемой:

a11 a12 a13 -> П7  П8  П9
a21 a22 a23 -> П4  П5  П6
a31 a32 a33 -> П1  П2  П3

Результат - в регистре Х, т.е. на индикаторе.

Вычисление определителя матриц 1,2,3,...,25 порядка (МК-90)

Алгоритмы взяты из книги В.П. Дьяконова "Справочник по алгоритмам и программам на языке Бэйсик для персональных ЭВМ" и представляют собой программы 3.49-3.53. Исполняемый код может быть загружен непосредственно из главного меню, путем выбора соответствующего СМП. По умолчанию массив заполняется случайными целыми числами в диапазоне от -3 до 3, для ручного ввода нужно после загрузки программы, до ее запуска набрать следующее: 40 INPUT A(I,J). Также в первой строке программы можно изменить размер двумерного массива, использующегося для хранения элементов матрицы, тем самым снизив (увеличив) максимально допустимый вводимый порядок.

Вычисление определителя матриц 2х2, 3х3, 4х4 (МК-152)

Пользование программой
После загрузки нажимаем С/П, вводим порядок матрицы - от 2 до 4. Если ввести некорректное число, программа будет вовзращаться к вводу порядка.
Далее появляется подсказка "a(i,j) -> Пij". Ну, тут понятно, ввод элемента i строки и j столбца производить в ячейку памяти номер ij. Например, а12 -> П12 и т.п. После ввода всех элементов снова нажимаем С/П. Выводится детерминант. Повторно нажав С/П, переходим на начало и можно мучить новую матрицу.

Особенности программы
1. Программа пользует регистры П0, П1, П4 (промежуточные данные, цикл и пр.), П7-ПА (вспомогательные, также элементы 2х2-минора), П11-П94 (элементы матриц и их миноров).
2. Значения элементов матрицы можно вводить, конечно, на любом шаге программы, где она останавливается, а не только на экране с подсказкой.
3. После выполнения программы на матрице 4х4 адреса, куда вы ввели матрицу, теперь не содержат ее (кроме П41-П44). Копия исходной матрицы находится по адресам П61-П64, П71-П74, П81-П84, П91-П94.

Алгоритм программы
До 100 адреса идут надписи, выбор адреса для дальнейшего перехода в зависимости от введенного порядка матрицы, все связанное с вводом начальных данных. Но на адресе 50 - подпрограммка определителя матрички
|П7 П8|
|П9 ПA|
После ввода всех данных идет ветвление:
1. Если вычисляется детерминант 2х2, идем на адрес 150, где идет вычисление этого детерминанта с ссылкой на подпрограмму 50.
2. Если вычисляется детерминант 3х3, идем на адрес 200, с которого запускается подпрограмма 220, где идет вычисление этого детерминанта с помощью трехкратного использования подпрограммы 50 (с помощью миноров).
3. Если вычисляется детерминант 4х4, идем на адрес 300, с которого четырехкратно с разными 3х3 минорами по адресам 11-33 используется подпрограмма 220. Подпрограмма 220, конечно, не забывает каждый раз по 3 раза использовать подпрограмму 50.
Вот какие дружные и любящие ссылаться друг на друга подпрограммы.

Вычисления определителя матрицы 2х2 (34, 61, 152)

00.ИП4  01.ИП2 02.x  03.ИП5  04.ИП1  05.x  06.-  07.С/П

Инструкция.
Перед запуском программы ввести а11, а12, а21, а22 в ячейки памяти П4, П5, П1, П2, соответственно.

После вычисления определитель будет виден в регистре Х - на индикаторе.

Программа просмотра матриц на IO экране (TI-89)

Написал программу для просмотра матриц на IO экране.

Используются следующие не локальные переменные (можно локализовать или удалить после использования):

col, dsmax, i, j, k, nlist,
nmat, nspace, q, redraw,
row1, row2, slist, smat,
space, sstr, tcol, trow.

Примечание: Вместо значка объединения строк используется значок *. Текст программы:

matmvr(mat)
Prgm

Define nspace(n)=Prgm
""->space
For q, 1, n, 1
space*" "->space
EndFor
EndPrgm

Define redraw()=Prgm
ClrIO
For q, row1, row2, 1
Disp right(slist[q], tcol - col + 1)
EndFor
EndPrgm

If getType(mat)="MAT" Then

newMat(dim(mat)[1], dim(mat)[2]) -> smat
newMat(dim(mat)[1], dim(mat)[2]) -> nmat
newList(dim(mat)[2]) -> nlist

For j, 1, dim(mat)[2], 1
0 -> dsmax
For i, 1, dim(mat)[1], 1
string(mat[i, j]) -> smat[i, j]
dim(smat[i, j]) -> nmat[i, j]
If nmat[i, j]>dsmax Then
nmat[i, j] -> dsmax
EndIf
EndFor
dsmax -> nlist[j]
EndFor

newList(dim(mat)[1]) -> slist

For i, 1, dim(mat)[1], 1
"" -> sstr
For j, 1, dim(mat)[2], 1
nspace(nlist[j] - nmat[i, j])
smat[i, j]*space -> smat[i, j]
sstr*smat[i, j]*" " -> sstr
EndFor
sstr -> slist[i]
EndFor

dim(slist) -> trow
dim(slist[1]) -> tcol
1 -> row1
1 -> col
6 -> row2
If trow < 6 Then
trow -> row2
EndIf

redraw()

Loop

Loop
getKey() -> k
If k=338 or k=344 or k=340 or k=337 or k=13
Goto a
EndIf
EndLoop

Lbl a
If k=338 Then 
If row1 > 1 Then
row1 - 1 -> row1
row2 - 1 -> row2
redraw()
EndIf
ElseIf k=344 Then
If row1 + 6 <= trow Then
row1 + 1 -> row1
row2 + 1 -> row2
redraw()
EndIf
ElseIf k=340 Then 
If tcol - col + 1 > 26 Then
col + 1 -> col 
redraw()
EndIf
ElseIf k=337 Then
If col > 1 Then
col - 1 -> col
redraw()
EndIf
EndIf
If k=13 Then
Goto b
EndIf
EndLoop 

Lbl b
EndIf
EndPrgm

Прокручивает с достаточной скоростью, но для больших матриц долго осуществляется подготовка к просмотру. Например, случайную матрицу randMat(10, 10) готовит к просмотру около 40 секунд.

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

Обновление от 19/12/2010

Сделал другую программу прокрутки больших матриц на TI-89T полностью на локальных переменных (см.прикрепленный файл main_mudrl2.rar). Время загрузки тестовой случайной матрицы 20 на 20 [randMat(20,20)] около 2-3 секунд. Прокрутка по строкам и столбцам, а не по символам как в старой версии.

Добавил отображение номеров строк и столбцов прокручиваемой матрицы (см.прикрепленный файл main_mudrl2.1.rar). Немного "тормознутее" по сравнению с main_mudrl2.rar.

Умножение матриц 2х2 (34, 61, 152)

Текст программы:

	0	1	2	3	4	5	6	7	8	9
0	ИП1	ИП7	x	ИП2	ИП4	x	+	ПВ	ИП1	ИП8
1	х	ИП2	ИП5	х	+	ПС	ИП0	ИП7	х	ИПА
2	ИП4	х	+	ПD	ИП8	ИП0	х	ИПА	ИП5	х
3	+	ПА	ИПВ	П1	ИПС	П2	ИПD	П0	С/П	

Инструкция:
а11, а12, а21, а22 содержатся соотв. в П1, П2, П0, ПА
в11, в12, в21, в22 содержатся соотв. в П7, П8, П4, П5

с11, с12, с21, с22 содержатся соотв. в П1, П2, П0, ПА
[после выполнения программы, где С=АхВ].

→ Численное интегрирование

Здесь можно найти программы для ПМК, позволяющие вычислять определённые интегралы по формулам численного интегрирования.

Использование этих программ обычно требует понимания азов интегрального исчисления и умения составить подпрограмму, вычисляющую подынтегральную функцию.

В страничках подшивки рекомендуется использовать следующие обозначения:

Оценка точности численного интегрирования требует аналитического исследования f(x), т.к. всегда можно подобрать "функцию", скажем, равную нулю ровно в тех точках, которые выберет используемая программа и положительную во всех остальных точках. На практике же инженеры просто выполняют интегрирование дважды, с разными m (или даже по разным программам), считая совпавшие знаки верными.

При некотором навыке по приведённым программам можно вычислять и несобственные интегралы на участках [a;+∞] (или [-∞;b]), даже без аналитических преобразований. Для этого достаточно взять достаточно большое b — такое, чтобы f(x) было настолько близко к нулю, чтобы не сильно влиять на результат интегрирования. Вместе с тем неоправданно больше b приведёт к погрешностям в результате. Разобранный пример такого вычисления можно найти на стр. 91-92 третьего издания справочника Дьяконова.

Часть опубликованных здесь программ заимствована из указанного справочника и предназначена для всех ПМК. Другие представляют собой их улучшенные версии, с учётом новых возможностей «Электроники МК-152».

Программа «Котес-точность» использует метод Ньютона-Котеса для n=6 и позволяет вычислять интеграл с заранее заданной точностью, автоматически выбрав достаточное число участков разбиения (m).

Из программ с фиксированным m лучшей точностью обладает программа «Гаусс» для n=7. Она не вычисляет значения f(a) и f(b), поэтому может использоваться, если f(x) имеет особенности на границах интервала.

Программа «Котес» для n=6 разбивает интервал интегрирования на равные части и вычисляет значение функции в легко предсказуемых точках. Её рекомендуется использовать, если f(x) имеет особенности внутри интервала.

См. также монографию Ш.Е.Цимринга «Специальные функции и определенные интегралы.» с программами численного интегрирования для советских ПМК.

Интегрирование методами Ньютона-Котеса и Вэддля (152)

Довёл до ума оптимизированную версию Ньютона-Котеса (n=6) для «Электроники МК-152».

Основное отличие от программы Дьяконова в том, что умножение на коэффициенты и окончательное суммирование вынесены за пределы цикла. Также значения f(x) на границах участков вычисляются только один раз. Всё это позволило увеличить скорость и точность расчётов.

Управление программой такое же, вот только регистры 20…24 (в добавлении к R0, RA, RB) теперь заняты основной программой и не могут использоваться функцией. Учитывая тысячу регистров МК-152, считаю это ограничение несущественным. :-)

Т.к. метод Вэддля отличается от метода Ньютона-Котеса лишь весом слагаемых, его также удалось включить в программу. После получения интеграла по Котесу можно нажать С/П и получить интеграл по Вэддлю. Если же вес слагаемых одинаков, получится метод трапеций. Нажав ещё раз С/П, можно увидеть интеграл, рассчитанный по этому простому методу и наглядно понять, зачем нужны более точные методы.

Эти два дополнительных расчёта выполняются мгновенно, т.к. новых вычислений f(x) не производится. Используются промежуточные данные, полученные на шаге вычисления интеграла по методу Ньютона-Котеса.

		.CHARSET	1251

; Пакет численного интегрирования:
; * методом Ньютона-Котеса при n=6.
; * методом Вэддля
; * методом трапеций
; Оптимизированная версия для МК-152.

; Инструкция:	В/O m С/П b С/П a С/П
;		"метод Н-К" С/П "м. Вэддля" С/П "м. трапеций"
; Пример: 16 П8 В/О 4 С/П 5 С/П 1 С/П
;		"9,074542  -01" С/П "9,0745408 -01" С/П "9,0699605 -01"
; Точное значение: 0,90745402821611

		.ORG		0
		M0				; Запомним число интервалов
		0 PM 20 PM 21 PM 22 PM 23	; Обнуление счётчиков
		R/S ENT
		R/S MA - RM0 6 * / MB		; Расчёт шага в RB

		RMA PGSB Function PM 24		; Запоминаем f(a)
		PGSB Inside			; Вычисляем суммы
		PRM 24 + PM 24 41 *		; Учитываем f(a) и f(b)
		27 PRM 22 * + 82 PRM 20 * + 272 PRM 23 * + 216 PRM 21 * +
		RMB * 140 /			; Интеграл по Котесу
		R/S
		PRM 24
		PRM 20 + FANS + PRM 22 + 6 PRM 23 * + 5 PRM 21 * +
		RMB ,3 * *			; Интеграл по Вэддлю
		R/S
		PRM 24 2 /
		PRM 20 + PRM 23 + PRM 21 + PRM 22 +
		RMB *				; Метод трапеций :-)
		R/S

Interval:	PRM 20 + PM 20			; y0=y6, граница
Inside:
		GSB Next PRM 21 + PM 21		; y1
		GSB Next PRM 22 + PM 22		; y2
		GSB Next PRM 23 + PM 23		; y3
		GSB Next PRM 22 + PM 22		; y4
		GSB Next PRM 21 + PM 21		; y5
		GSB Next
		FL0 Interval
		RTN

Next:		RMA RMB + MA			; Следующая точка

; Подынтегральная функция f(x) при x -> RA
; В тестовом примере R8=16

Function:	RMA ENT FX^2 * FANS FX^2 RM8 + /
		RTN

		.END 

Пример 1. Вычислим интеграл функции f(x)=x³/(x4+16) на интервале [1;5]

Функция (в регистр 8 заносится число 16):

RMA ENT FX^2 * FANS FX^2 RM8 + / RTN

При m=16:
"0,9074540282161134899…" (ln(641/17)/4 на Gcalctool 5.7.32)
"0,907454028206" (метод Ньютона-Котеса)
"0,90745402821139" (метод Вэддля)
"0,90742541938977" (метод трапеций)

Пример 2. Вычислим интеграл функции f(x)=√(1+2x) на интервале [0;1]

Функция:

RMA 2 * 1 + FSQRT RTN

При m=8:
"1,39871747423554396…" (√3-⅓, точное значение)
"1,3987174742237" (метод Ньютона-Котеса)
"1,3987174742141" (метод Вэддля)
"1,398702188149" (метод трапеций)

При m=16:
"1,3987174742469" (метод Ньютона-Котеса)
"1,3987174742469" (метод Вэддля)
"1,398713652592" (метод трапеций)

Т.к. величина x передаётся через регистр (там же запоминается шаг и измеренные значения f(x)), она округляется до 12 разрядов и большей точности ожидать от программы не приходится. Но, как мы видим, свои 11-12 значащих цифр предлагаемая программа даёт. Для большей точности используйте программу «Котес», в которой аргумент передаётся через стек.

Метод Гаусса при n=3 (34, 61, 152)

Метод Гаусса и его модификации широко применяются для интегрирования в современных математических пакетах. В работах советского математика В.И. Крылова этот метод называется «имеющим наивысшую степень точности».

Высокой точности удаётся добиться за счёт комбинации двух приёмов. Во-первых, как и в методе Ньютона-Котеса, значения f(x), полученные в разных точках, суммируются с разными коэффициентами (Ai). Во-вторых, как и в методе Чебышева, значение f(x) вычисляется в специально подобранных точках (ti), неравномерно расположенных на отрезке интегрирования.

Коэффициенты Ai и точки ti выбраны таким образом, что в общем случае при равном количестве вычисленных значений функции f(x) метод Гаусса даёт более точные результаты, чем остальные методы. Ниже без изменений приводится программа 5.74 из третьего издания справочника Дьяконова, вычисляющая значение определённого интеграла по методу Гаусса для n=3.


		.CHARSET	1251

; Программа 5-74. Численное интегрирование методом Гаусса при n=3.
; Дьяконов В.П. Справочник по расчётам на микрокалькуляторах -- 3-е изд -- М.: Наука, 1989
; стр.249

; Инструкция: В/O m С/П b С/П a С/П "результат"
; Пример: В/О 4 С/П 1 С/П 0 С/П "1,3987175"
; Точное значение: 1,39871747423554396..

		.ORG		0
		M0 CX MC		; R0 = n
		R/S ENT			; Ввод b
		R/S MA			; RA = a
		- RM0 / 2 / MB		; RB = h = (b-a)/(2n)
		0,6 FSQRT * MD		; RD = SQRT(3/5)*h
		RMA RMB - MA		; RA -= h
NxtInterval:
		RMA RMB + RMB + MA	; RA += 2*h
		GSB Gauss		; Вычислить по Гауссу
		FL0 NxtInterval		; на всех n интервалах
		RMC			; Излишне, т.к. x=RC
		RMB * 9 /		; Ответ: RC * h/9
		R/S

Gauss:
		RMD +/- GSB AddA	; RC += 5*f(RA-SQRT(3/5)*h)
		RMA GSB Function	; f(RA)
		8 GSB MulC		; RC += 8*f(RA)
		RMD			; RC += 5*f(RA+SQRT(3/5)*h)
AddA:
		RMA + GSB Function	; RC += 5*f(RA+x)
		5
MulC:
	 	* RMC + MC		; Добавить f(x) с учётом веса
		RTN

; Подынтегральная функция f(x) при x -> RX

Function:	2 * 1 + FSQRT
		RTN
		.END

Для ещё большей точности используйте программу «Гаусс», реализующую на «Электронике МК-152» метода Гаусса при n=7.

Пример. Вычислим интеграл функции f(x)=√(1+2x) на интервале [0;1]

2 * 1 + FSQRT RTN

Для разных m получаем:
"1,3987174847917" (m=4)
"1,3987174744167" (m=8)
"1,3987174742396" (m=16)
"1,39871747423554396…" (√3-⅓, точное значение)

Метод Ньютона-Котеса для n=6 (34, 61, 152)

Численные методы разбивают интервал интегрирования [a,b] на m равных участков, после чего на каждом из них приближают подынтегральную функцию f(x) такой, интеграл которой известен аналитически.

В общем случае для того, чтобы подобрать замену поточнее, на каждом из m участков (n+1) раз вычисляют значение функции f(x). Метод Ньютона-Котеса основан на интерполяции f(x) в n получившихся равных промежутках полиномом Лагранжа. Формулы интегрирования точны, если f(x) — многочлен n-й степени (или ниже). В этом случае полином, используемый для приближения, совпадает с самой f(x).

Метод Ньютона-Котеса обобщает следующие методы — в зависимости от степени многочлена n, которым мы приближаем функцию на рассматриваемых участках:
n=1 метод трапеций (функция приближается ломаной из m звеньев; был популярен на советских ПМК)
n=2 метод Симпсона (на каждом из m участков функция аппроксимируется параболой; реализовывался микропрограммно в первых ЭВМ)
n=4 метод Бодэ
n=6 метод Дьяконова (если округлить коэффициенты, получим популярную формулу Уэддля, слагаемые которой одного порядка, см. [1])

Ниже без изменений приводится программа 5.69 для n=6, взятая из третьего издания справочника Дьяконова. В отличии от её старшего брата, программы 4.40 из [1], программа для ПМК вычисляет дважды значение функции f(x) на границах внутренних участков. Я разработал несколько своих версий, лишённых этого недостатка и учитывающих достоинства современных МК-152, в частности повышенную разрядность стека.

Метод Дьяконова хорош тем, что является наиболее мощным методом из тех, которые равномерно разбивают интервал [a,b], вычисляя значение f(x) в легко предсказуемых точках. Более точных результатов можно добиться, используя для численного интегрирования метод Гаусса, который проф. Дьяконов рекомендует использовать в случае, если подынтегральная функция имеет особенности (например, 0/0 или ∞/∞) на границе интервала [a,b].

На ПМК вычисления занимали несколько минут даже при m=4, а применение программы 5.69 ограничивалось тем, что её телом были заняты целых 70 шагов из 98. Соответственно на реализацию исследуемой функции оставалось только 28 шагов. На МК-152 размер подынтегральной функции неограничен, а скорость вычислений тестового примера становится заметной (измеряется в секундах) лишь при m=10 и больше.

.CHARSET 1251

; Программа 5-69. Численное интегрирование методом Ньютона-Котеса при n=6.
; Дьяконов В.П. Справочник по расчётам на микрокалькуляторах -- 3-е изд -- М.: Наука, 1989
; стр.247

; Инструкция: В/O m С/П b С/П a С/П "результат"
; Пример: 16 П8 В/О 4 С/П 5 С/П 1 С/П "9,074542  -01"
; Точное значение: 0,9074540282

		.ORG	0
		M0 0 MC
		R/S ENT
		R/S MA - RM0 / 6 / MB

NextInterval:	GSB Interval  FL0 NextInterval
		RMC RMB * 140 /
		R/S

Interval:	RMA GSB Function
		41 GSB Next  216 GSB Next  27 GSB Next
		272 GSB Next  27 GSB Next  216 GSB Next
		41 * RMC + MC
		RTN

Next:		* RMC + MC
		RMA RMB + MA

; Подынтегральная функция f(x) при x -> RA
; В тестовом примере R8=16

Function:	RMA ENT FX^2 * FANS FX^2 RM8 + /
		RTN

		.END 

А вот скан из третьего издания Дьяконова программы 5.69 с формулой, по которой интеграл считается. Можете сравнить наглядность программ для МК-152 и Б3-34:

Литература

[1] Дьяконов В.П. Справочник по алгоритмам и программам на языке бейсик для персональных ЭВМ: Справочник -- М.: Наука. Гл. ред. физ.-мат. лит., 1987

Метод Симпсона с заданной точностью ε результата. (34, 61, 152)

Программа 5.67 из третьего издания справочника Дьяконова, стр.246. Приводится без изменений.

Алгоритм основан на уменьшении шага интегрирования вдвое, пока пара последовательно вычисленных по Симпсону значений интеграла не станут отличаться на величину, пропорциональную заданной погрешности. Коэффициент пропорциональности равен 15, что верно для метода Симпсона в применении к достаточно гладким функциям (четвёртая производная которых слабо меняется на участке [a;b]). Каждый последующий шаг приближения использует суммы значений f(x), вычисленные на предыдущих этапах, что существенно экономит время вычислений.

Т.к. в первых ПМК не было команды К|x|, в регистр RD записывается не 15ε, а квадрат этой величины. Также, для повторяемости результата, советую перед каждым запуском обнулять R6. Если же вычисляемый интеграл близок к нулю, наоборот, запишите в R6 какое-нибудь огромное число. В противном случае там сохранится значение интеграла, которое будет влиять на повторные вычисления.

		.CHARSET	1251

; Программа 5-67. Численное интегрирование методом Симпсона с заданной точностью e результата.
; Дьяконов В.П. Справочник по расчётам на микрокалькуляторах -- 3-е изд -- М.: Наука, 1989
; стр.246

; Инструкция: e 15 * Fx^2 ПД b ПВ a ПА - П7 Сx П6 В/O С/П "результат"
; Пример: 15 ВП 3 /-/ Fx^2 ПД 1 ПВ П7 0 ПА П6 В/О С/П "1,3986677"
; Точное значение: 1,3987174742..

		.ORG		0
		RMB GSB Function M9
		RMA GSB Function RM9 + M9		; R9 = f(a)+f(b)

Tochnost:
		RM7 2 / M7				; R7 = h = h/2
		RMA + M8				; R8 = x = a+h
		0 MC					; RC = 0

Tochka:
		RM8 GSB Function			; f(x)
		2 * RMC + MC				; RC += 2*f(x)
		RM7 2 * RM8 + M8			; R8 = x = x+2*h
		RMB - FX>=0 Tochka			; повторить если x<b

		RMC ENT RM9 + M9			; R9 += RC
		+ 3 / RM7 *				; R7*(RC+R9)/3
		RM6 <->
		M6 - FX^2				; R6' = R7*(RC+R9)/3
		RMD - FX<0 Tochnost			; повторить, если (R6-R6')^2 >=RD

		RM6 R/S					; Вывести ответ
;
; Подынтегральная функция f(x) при x -> RX
;
Function:
		2 * 1 + FSQRT
		RTN

		.END 

Инструкция
Ввод: подпрограмма с адреса 0058 вычисляет f(x), беря x из RX; (15ε)²=RD, b=RB, a=RA, (b-a)=R7.
Запуск: В/О С/П
Вывод: значение интеграла I находится на экране, оно же в R6

Пример. Вычислим интеграл функции f(x)=√(1+2x) на интервале [0;1]

2 * 1 + FSQRT RTN

При ε=1*10-3 (и R6=0) получаем I=1,39866772819

При ε=1*10-5 (и R6=0) получаем I=1,39871389555

Точное значение I = √3-⅓ = 1,39871747423554396…

Программа «Гаусс», n=7 (152)

Богатые возможности МК-152 позволяют с лёгкостью использовать методы интегрирования, применяющиеся в профессиональных математических пакетах, а трюк «двойная точность» позволил задействовать в вычислениях все имеющиеся 14 разрядов мантиссы.

Программа «Гаусс» реализует на ЭКВМ «Электроника МК-152» высокоточное численное интегрирование по методу Гаусса с n=7. На сегодняшний день это лучшая программа численного интегрирования для МК-152. Не только скорость работы программы, но и точность выдаваемого результата недостижимы для советских ПМК, имевших лишь 8 разрядов мантиссы.

Подынтегральная функция получает аргумент через регистр X, и там же оставляет свой результат. При этом регистры R0, R1, R5, RA, RB, RD и R20…R43 используются программой и не должны изменяться подынтегральной функцией. Интерфейс программы взят из справочника Дьяконова — он такой же, как и у остальных программ численного интегрирования для советских ПМК и МК-152.


		.CHARSET	1251

; Программа "Гаусс".
; Численное интегрирование методом Гаусса при n=7.
; Трюк "двойная точность" позволяет на МК-152 получить до 14 знаков.

; Инструкция: В/О m С/П b С/П a С/П "интеграл"
; Пример: В/О 2 С/П 1 С/П 0 С/П "1,3987175"
; Точное значение: 1,39871747423554396..

; R0: j, номер интервала (m..1)
; R1: i, номер точки t1, t2, t3 (3..1)
; R5: индекс, считывание констант из R30..R43
; RA, RB: границы интегрирования  a, b
; RD: m, число участков
;
; R20, R21: I, здесь накапливается интеграл
; R22, R23: Si, очередная сумма для ti
; R24, R25: ti, для которого сейчас считается сумма
;
; Следующие константы должны быть загружены
; через MKD-файл в регистры R30..R43:
;
; R30, R31: w0, константы 4,17959183673E-1, 4,6938776E-13
; R32, R33: t1, константы 4,05845151377E-1, 3,9716691E-13
; R34, R35: w1, константы 3,81830050505E-1, 1,1894495E-13
; R36, R37: t2, константы 7,41531185599E-1, 3,9443986E-13
; R38, R39: w2, константы 2,79705391489E-1, 2,766679E-13
; R40, R41: t3, константы 9,49107912342E-1, 7,5852453E-13
; R42, R43: w3, константы 1,29484966168E-1, 8,6969327E-13

		.ORG		0
		MD			; RD = m
		R/S MB			; RB = b
		R/S MA			; RA = a
		3 M1  29 M5

; Вычислим сумму для t0=0

		CX PM24 PM25		; Сумма для t0=0
		GSB Gauss0
		PRM22 PRM23 +		; S
		KRM5 KRM5 +		; w0
		* PM20 PRM20 - PM21	; I=S*w0

; Вычислим суммы ещё для шести точек: (+/-) t1, t2 и t3

NextT:
		KRM5 PM24 KRM5 PM25	; Считываем из таблицы ti
		GSB Gauss0		; Сумма для ti
		PRM24 +/- PM24
		PRM25 +/- PM25		; Меняем знак у ti
		GSB Gauss1		; Сумма для -ti
		PRM22 PRM23 +		; S, вычисленные суммы
		KRM5 KRM5 +		; wi, вес этих двух сумм
		* PRM21 + PRM20 +	; I+wi*S
		PM20 PRM20 - PM21	; Запишем в I
		FL1 NextT

		PRM20 PRM21 +		; I
		GSB MulH		; h*I
		R/S			; Вывести результат

MulH:		RMB RMA -		; * (b-a)/(2m)
		RMD ENT + /
		*
		RTN
Gauss0:
		CX PM22 PM23		; S=0
;
; Вычисление суммы S (R22, R23) для всех ti (R24, R25) на [a;b]
;
Gauss1:
		RMD M0			; Всего m ординат
NextFn:
		RM0 ENT + 1 -		; 2*j-1
		PRM24 PRM25 + +		; 2*j-1+ ti
		PGSB MulH		; h*(2*j-1 + ti)
		RMA +			; x = a + h*(2*j-1 + ti)
		GSB Function		; Получить f(x)
		PRM23 + PRM22 +		; Прибавить к S
		PM22 PRM22 - PM23	; Записать в S
		FL0 NextFn
		RTN

;
; Подынтегральная функция f(x) при x -> RX
;
Function:
		2 * 1 + FSQRT
		RTN

		.END

Также для правильной работы программы не забудьте ввести в регистры R30…R43 следующие числовые константы, взятые из таблиц «Справочной книги по численному интегрированию» (В.И. Крылов, Л.Т. Шульгина, М.: изд-во «Наука», гл. ред. физ.-мат. лит., 1966):

030 	 4,17959183673E-1
031 	 4,6938776E-13
032 	 4,05845151377E-1
033 	 3,9716691E-13
034 	 3,81830050505E-1
035 	 1,1894495E-13
036 	 7,41531185599E-1
037 	 3,9443986E-13
038 	 2,79705391489E-1
039 	 2,766679E-13
040 	 9,49107912342E-1
041 	 7,5852453E-13
042 	 1,29484966168E-1
043 	 8,6969327E-13

Проще всего это сделать, загрузив в МК-152 пакет «Гаусс», состоящий из программы gauss.mkp и файла десятичных данных gauss.mkd .

Пример 1. Вычислим интеграл функции f(x)=x³/(x4+16) на интервале [1;5]

Функция (в регистр 8 заносится число 16):

ENT FX^2 * FANS FX^2 RM8 + / RTN

При разных m:
"0,90745397790992" (m=2)
"0,90745402822345" (m=4)
"0,90745402821615" (m=8)
"0,9074540282161134899…" (ln(641/17)/4 на Gcalctool 5.7.32)

Кстати, мощнейший зарубежный калькулятор HP 50g считает этот интеграл за 10,5 секунд (вводим с помощью EQW, считаем по →NUM и замеряем по TEVAL) и выдаёт результат ".907454028216" — калькулятор «Электроника МК-152» выдаёт несколько более точный результат меньше, чем за 1,4 секунды (m=8, используем программу-секундомер). Возможно, что основное время HP 50g тратит на отсутствующие в «Электронике» символьные преобразования, однако конечный численный результат всё же на МК-152 точнее. Да и получается в 7,5 раза быстрее!

Пример 2. Вычислим интеграл функции f(x)=√(1+2x) на интервале [0;1]

2 * 1 + FSQRT RTN

Для разных m получаем:
"1,398717474338" (m=1; 0,36 секунды)
"1,3987174742356" (m=2; 0,66 секунды)
"1,3987174742355" (m=3; 1,06 секунды)
"1,39871747423554396…" (√3-⅓, точное значение)

HP 50g выдаёт результат "1.39871747424" за 2,94 секунды. Как и в прошлом примере, МК-152 позволяет узнать на один-два знака больше. Разница по скорости хотя и не столь впечатляющая, но тоже в разы.

Программа «Котес-точность». (152)

Программа «Котес-точность» (версия 1) позволяет вычислять определённые интегралы с заданной точностью ε. Для этого отрезок интегрирования разбивается на всё возрастающее число интервалов (m=1, 2, 4, 8,…), на каждом из которых для вычисления интеграла используется метод Ньютона-Котеса при n=6.

Погрешность вычисленного интеграла оценивается в 1/255 от его разницы с предыдущим вычисленным значением. После окончания вычислений окончательный ответ экстраполируется по Ричардсону на основе двух последних значений.

В программе применён трюк «двойная точность», позволяющий производить на МК-152 вычисления с 14 значащими цифрами. Программа разработана независимо от аналогичной программы проф. Дьяконова для метода Симпсона.


		.CHARSET	1251

; Программа "Котес-точность" (версия 1).
; Численное интегрирование методом Ньютона-Котеса при n=6,
; с заданной точностью e результата.

; Программа разбивает отрезок интегрирования [a;b] на 1, 2, 4, 8,..
; интервалов до получения заданной точности, после чего
; экстраполирует результат по Ричардсону I=I2+(I2-I1)/255.
; На каждом следующем шаге повторно используются суммы,
; вычисленные на предыдущих шагах.
;
; Программа использует трюк "двойная точность" для вычислений
; с 14 значащими десятичными цифрами.

; Инструкция: a ПA b ПB e В/О С/П "результат"
; Пример: 0 ПA 1 ПB 1 ВП 3 /-/ В/О С/П "1,3987175"
; Точное значение: 1,39871747423554396..

; R0: k, номер интервала (m..1)
; Ra, Rb: границы интегрирования a, b
; R20,21: I, полученный интеграл
; R22,23: Jнов, полная сумма, расчитанная для m интервалов
; R24,25: Jст, предыдущее значение полной суммы
; R26: e*255*6*140/(b-a), заданная точность полной суммы
; R27: m, число интервалов (1, 2, 4, 8,..)
; R30,31: S0, сумма всех y0+y6
; R32,33: S1, сумма всех y1+y5
; R34,35: S2, сумма всех y2+y4
; R36,37: S3, сумма всех y3

		.ORG		0
		ENT 214200 * RMb RMa - / PM26		; Delta *= 255*6*140/(b-a)
		1 PM27 M0				; k = m = 1

; Вычисляем S0, S2 для первого разбиения (m=1)

		RMa PGSB Fx PM30 PRM30 - PM31		; S0 = f(a)
		2 PGSB Fn PM34 PRM34 - PM35		; S2 = y2

		4 PGSB Fn PRM35 + PRM34 +
		PM34 PRM34 - PM35			; S2 = y2+y4

		RMb PGSB Fx PRM31 + PRM30 +
		PM30 PRM30 - PM31			; S0 = f(a)+f(b)

		PGSB Calc1				; Считаем интеграл первый раз
NextIntegral:
		PRM27 ENT + PM27 M0			; k = m = 2*m
		PGSB Calc				; Считаем интеграл очередной раз
		ENT					; Jнов
		PRM24 PRM25 + - ENT			; Jнов - Jст
		KABS PRM26 - Px<0 NextIntegral		; Точность достигнута?

		FR 255 / +				; Jнов + (Jнов-Jст)/255
		RMb RMa - * 840 /			; I = J * (b-a)/840
		ENT PM20 PRM20 - PM21 FR		; R20,21 = I
		R/S

; Вычисление суммы J для очередного разбиения отрезка [a;b]
; R0=R27 содержат количество интервалов, на которые разбит отрезок.
; Результат записывается в R22,23 и возвращается в RX
Calc:
		PRM22 PM24 PRM23 PM25			; Jст = Jнов
;
; Для S0 и S2 расчёт прост, т.к. все Yi с чётным i уже были вычислены.
;
		PRM30 PRM31 + PRM36 PRM37 + ENT + +
		PM30 PRM30 - PM31			; S0 += 2*S3
		PRM35 PRM33 + PRM34 PRM32 + +
		PM34 PRM34 - PM35			; S2 += S1
Calc1:
		CX PM32 PM33 PM36 PM37			; S1=S3=0
NextInterval:
		1 PGSB Fn				; y1
		PRM33 + PRM32 + PM32 PRM32 - PM33	; S1 += y1
		3 GSB Fn				; y3
		PRM37 + PRM36 + PM36 PRM36 - PM37	; S3 += y3
		5 GSB Fn				; y5
		PRM33 + PRM32 + PM32 PRM32 - PM33	; S1 += y5
		PFL0 NextInterval

		PRM34 PRM35 + 27 *			; 27*S2 +
		PRM30 PRM31 + 41 * +			; 41*S0 +
		PRM32 PRM33 + 216 * +			; 216*S1 +
		PRM36 PRM37 + 272 * +			; 272*S3
		PRM27 /					; S/m
		ENT PM22 PRM22 - PM23 FR		; R22,23 = J
		RTN

; Вычислить Yi=f(Xi) на интервале k=R0 при i -> RX
Fn:
		RM0 6 * -				; -(6*k-i)
		RMb RMa - *				; -(6*k-i)*(b-a)
		PRM27 6 * /				; -(6*k-i)*(b-a)/6m
		RMb +					; Xi = b - (6k-i)(b-a)/6m

; Подынтегральная функция f(x) при x -> RX
Fx:
		2 * 1 + FSQRT
		RTN

		.END

Программа работает несколько медленнее программы «Гаусс» и может давать бỏльшую ошибку в 14-ом или даже 13-ом знаке. Для оценки точности вычислений необходимо вычислить интеграл по меньшей мере дважды. Поэтому даже если задать небольшую точность, ответ будет не грубее, чем при m=2.

При каждом удваивании m метод Ньютона-Котеса при n=6 даёт две-три значащие цифры. Это означает, что для большинства ε вычисленное значение будет на одну-две цифры точнее, чем требуется. Но также существуют "пограничные" значения ε, при которых переход на следующее значение m ещё не производится и погрешность результата может составлять несколько ε. Другими словами, ε задаёт лишь желаемый порядок погрешности, а не её абсолютное значение.

Пример 1. Вычислим интеграл функции f(x)=x³/(x4+16) на интервале [1;5]

Функция (в регистр 8 заносится число 16):

ENT FX^2 * FANS FX^2 RM8 + / RTN

Ответ:
"0,9074540282161134899…" (ln(641/17)/4 на Gcalctool 5.7.32)
"0,90745402821624" (ε=10-12)
"0,90745402718181" (ε=10-9)
"0,90745415140152" (ε=10-6)
"0,90747289733481" (ε≥10-5)

Пример 2. Вычислим интеграл функции f(x)=√(1+2x) на интервале [0;1]

Функция:

2 * 1 + FSQRT RTN

Ответ:
"1,39871747423554396…" (√3-⅓, точное значение)
"1,3987174742355" (ε=10-12)
"1,3987174742023" (ε=10-9)
"1,3987174672033" (ε≥10-8)

Программа «Котес», n=6, повышенная точность (152)

Программа «Котес» является развитием программы интегрирования, нацеленным на максимальную точность вычислений для используемого метода интегрирования.

Повышенная точность основана на том, что значения границ интервала, а также количество участков (величины a, b и m) обычно вводятся вручную, поэтому не содержат много значащих цифр и их размещение в регистрах не приводит к потере точности. Между тем, как размер участка и очередную абсциссу можно легко вычислить с точностью 14 знаков, исходя из этих значений.

Чем пришлось жертвовать? Во-первых, незначительно уменьшилось быстродействие, т.к. теперь каждый раз при обращении к f(x) приходится заново вычислять её аргумент, без накопления ошибки округления. Во-вторых, значение аргумента (переменной x) теперь передаётся в функцию только через регистр X, а десятичный регистр RA используется для других целей. Если подпрограмме вычисления функции не хватает регистров стека и потребуется записать аргумент (или промежуточный результат) в регистр, точность несколько понизится.

В-третьих, программой занято чуть больше десятичных регистров — R0, RA, RB и R20…R26, да и смысл регистров A и B изменился. Теперь в них хранятся границы интервала интегрирования. Если функция несложная, все эти ограничения несущественны.

		.CHARSET	1251

; Пакет численного интегрирования "Котес":
; * методом Ньютона-Котеса при n=6
; * методом Вэддля
; * методом трапеций
; Вторая оптимизированная версия для МК-152.

; Инструкция:	В/O m С/П b С/П a С/П
;		"метод Н-К" С/П "м. Вэддля" С/П "м. трапеций"
; Пример: В/О 2 С/П 1 С/П 0 С/П
;		"1,3987175" С/П "1,3987174" С/П "1,3984731"
; Точное значение: 1,39871747423554396..

; R0: счётчик интервалов m..1
; RA, RB: границы интегрирования a, b
; R20, R21, R22, R23: суммы y0 (y6), y1+y5, y2+y4, y3
; R24: f(a)+f(b)
; R25: 6*m
; R26: номер точки 0..R25


		.ORG		0
		M0 6 * PM 25			; Число интервалов
		0 PM 20 PM 21 PM 22 PM 23 PM 26
		R/S MB				; Вводим b
		R/S MA				; Вводим a

		PGSB GetFn PM 24		; Запоминаем f(a) в R24
		PGSB Inside			; Вычисляем суммы
		PRM 24 + PM 24 41 *		; Учитываем f(a) и f(b)
		27 PRM 22 * + 82 PRM 20 * + 272 PRM 23 * + 216 PRM 21 * +
		PGSB MulH 140 /			; Интеграл по Котесу
		R/S
		PRM 24
		PRM 20 + FANS + PRM 22 + 6 PRM 23 * + 5 PRM 21 * +
		,3 PGSB MulH *			; Интеграл по Вэддлю
		R/S
		PRM 24 2 /			; f(a)/2 + f(b)/2
		PRM 20 + PRM 23 + PRM 21 + PRM 22 +
		GSB MulH			; Метод трапеций :-)
		R/S

MulH:		RMB RMA - PRM 25 / * RTN	; Умножить на (b-a)/(6m)

Interval:	PRM 20 + PM 20			; y0=y6, граница
Inside:
		GSB GetFn PRM 21 + PM 21	; y1
		GSB GetFn PRM 22 + PM 22	; y2
		GSB GetFn PRM 23 + PM 23	; y3
		GSB GetFn PRM 22 + PM 22	; y4
		GSB GetFn PRM 21 + PM 21	; y5
		GSB GetFn			; y6
		FL0 Interval
		RTN
GetFn:
		1 PRM 26 + PM 26 FANS RMB RMA - * PRM 25 / RMA +

; Подынтегральная функция f(x) при x -> RX
		2 * 1 + FSQRT
		RTN

		.END 

Пример. Вычислим интеграл функции f(x)=√(1+2x) на интервале [0;1]

2 * 1 + FSQRT RTN

При m=8:
"1,39871747423554396…" (√3-⅓, точное значение)
"1,3987174742303" (метод Ньютона-Котеса)
"1,398717474221" (метод Вэддля)
"1,398702188158" (метод трапеций)