Решение квадратного уравнения (hp-35s)
Поскольку в этом калькуляторе нет автоматического "решателя" квадратных и кубических уравнений, а то что есть - позволяет решать их только численными методами по одному корню за раз, то я решил немного восполнить этот пробел. Может кому-либо пригодится.
Входные данные - уравнение вида
ax2 + bx + c = 0
Коэффициенты вводятся по запросу калькулятора c нажатием клавиши R/S
Выходные данные - корни (вещественные или комплексные) находятся в двух нижних регистрах стека x2 -> Y, x1 -> X
B001 LBL B
B002 RPN
B003 SF 10
B004 AX2+BX+C=0
B005 PSE
B006 INPUT A
B007 INPUT B
B008 INPUT C
B009 RCL B // дискриминант
B010 x2
B011 4
B012 RCL A
B013 *
B014 RCL C
B015 *
B016 –
B017 STO D
B018 X<0?
B019 GTO B040
B020 RCL B // вещественные корни
B021 +/-
B022 RCL D
B023 SQRT x
B024 +
B025 2
B026 /
B027 RCL A
B028 /
B029 RCL B
B030 +/-
B031 RCL D
B032 SQRT x
B033 –
B034 2
B035 /
B036 RCL A
B037 /
B038 STOP
B039 GTO B001
B040 +/- // комплексные корни
B041 2
B042 /
B043 RCL A
B044 /
B045 STO X
B046 RCL D
B047 +/-
B048 SQRT x
B049 2
B050 /
B051 RCL A
B052 /
B053 i
B054 *
B055 STO Y
B056 +
B057 RCL X
B058 RCL Y
B059 –
B060 STOP
B061 GTO B001
Символы отличные от изображённых на клавиатуре калькулятора
- / - деление
-
-
- умножение
-
- SQRT x - квадратный корень
Оптимизированный вариант этой-же программы, созданный под влиянием бесед в теме о КВУР:
B001 LBL B
B002 RPN
B003 SF 10
B004 AX^2+BX+C=0
B005 PSE
B006 INPUT A
B007 INPUT B
B008 INPUT C
B009 RCL B // расчёт -b/(2a)->e
B010 RCL A
B011 /
B012 2
B013 /
B014 +/-
B015 STO E
B016 x2 // расчёт D/4
B017 RCL C
B018 RCL A
B019 /
B020 –
B021 x<0?
B022 GTO B025
B023 SQRT x // извлечение вещественного корня из D/4
B024 GTO B029
B025 +/- // извлечение мнимого корня из D/4
B026 SQRT x
B027 i
B028 *
B029 STO D // вычисление 1-го корня уравнения
B030 RCL E
B031 +
B032 RCL E // вычисление 2-го корня уравнения
B033 RCL D
B034 –
B035 STOP
B036 GTO B001
Благодаря способности калькулятора работать с комплексными числами окончательное вычисление корней происходит в одном и том же участке кода.
При желании, слегка урезав функциональность можно ещё сократить длину этой программы, а именно можно удалить 2 (если всегда стартовать из RPN), 3, 4, 5 команды (чтобы удалить сообщение, напоминающее, что программа решает), а команды 35 и 36 можно заменить одной RTN (чтобы программа не возвращалась на начало, а завершалась), тем самым сократив программу до 31 команды. Но мне так нравится больше.
blog comments powered by Disqus