Решение кубического уравнения (HP-35s)
Решение невырожденного кубического уравнения с вещественными коэффициентами методом Кардано. Поскольку этот калькулятор не умеет решать такие уравнения из коробки, я посочинял немного. Возможно пригодится кому-либо.
Входные данные - уравнение вида
ax3 + bx2 + cx + d = 0
Коэффициенты вводятся по запросу калькулятора c нажатием клавиши R/S
Выходные данные - корни (вещественные или комплексные) находятся в трёх нижних регистрах стека x3 -> Z, x2 -> Y, x1 -> X
Окинув взором полученное в начальной версии, мне удалось сократить код на 23 команды выделив 2 подпрограммы...
C001 LBL C
C002 RPN
C003 RAD
C004 SF 10
C005 AX^3+BX^2+CX+D=0
C006 PSE
C007 INPUT A
C008 INPUT B
C009 INPUT C
C010 INPUT D
C011 RCL B //поправка B/(3A)
C012 RCL A
C013 /
C014 3
C015 /
C016 STO E
C017 3 //Вычисление P
C018 RCL C
C019 *
C020 RCL A
C021 *
C022 RCL B
C023 x2
C024 -
C025 RCL A
C026 x2
C027 3
C028 *
C029 /
C030 STO P
C031 RCL D //Вычисление Q
C032 RCL A
C033 /
C034 RCL B
C035 RCL C
C036 *
C037 3
C038 /
C039 RCL A
C040 x2
C041 /
C042 -
C043 RCL B
C044 3
C045 yX
C046 2
C047 *
C048 27
C049 /
C050 RCL A
C051 3
C052 yX
C053 /
C054 +
C055 STO Q
C056 x2 //Дискриминант
C057 4
C058 /
C059 RCL P
C060 3
C061 yX
C062 27
C063 /
C064 +
C065 STO S
C066 x>0? //Выбор ветви решения
C067 GTO C096
C068 x<0?
C069 GTO C148
C070 RCL Q // Дискриминант = 0 Корни вещественные кратные
C071 +/-
C072 2
C073 /
C074 3
C075 x SQR y
C076 STO U
C077 RCL B
C078 RCL A
C079 /
C080 3
C081 /
C082 STO V
C083 2
C084 RCL U
C085 *
C086 RCL V
C087 -
C088 STO X
C089 RCL U
C090 +/-
C091 RCL V
C092 -
C093 STO Y
C094 STO Z
C095 GTO C193
C096 RCL S // Дискриминант > 0. Один вещественный корень и два комплексных
C097 SQRT x
C098 STO T
C099 RCL Q
C100 2
C101 /
C102 +/-
C103 STO W
C104 RCL T
C105 +
C106 3
C107 x SQR y
C108 STO U
C109 RCL W
C110 RCL T
C111 -
C112 3
C113 x SQR y
C114 STO V
C115 RCL U
C116 +
C117 STO R
C118 RCL U
C119 RCL V
C120 -
C121 STO I
C122 RCL R
C123 RCL E
C124 -
C125 STO X
C126 XEQ C133
C127 -
C128 STO Y
C129 XEQ C133
C130 +
C131 STO Z
C132 GTO C193
C133 RCL R // подпрограмма 1
C134 2
C135 /
C136 +/-
C137 RCL E
C138 -
C139 RCL I
C140 3
C141 SQRT x
C142 *
C143 2
C144 /
C145 i
C146 *
C147 RTN
C148 RCL Q // Дискриминант < 0 - три разных вещественных корня
C149 2
C150 /
C151 +/-
C152 RCL P
C153 +/-
C154 3
C155 yX
C156 27
C157 /
C158 SQRT x
C159 /
C160 ACOS
C161 STO F
C162 2
C163 RCL P
C164 +/-
C165 3
C166 /
C167 SQRT x
C168 *
C169 STO U
C170 0
C171 XEQ C180
C172 STO X
C173 2
C174 XEQ C180
C175 STO Y
C176 -2
C177 XEQ C180
C178 STO Z
C179 GTO C193
C180 RCL F // Подпрограмма 2
C181 x<->y
C182 pi
C183 *
C184 +
C185 3
C186 /
C187 COS
C188 RCL U
C189 *
C190 RCL E
C191 -
C192 RTN
C193 VIEW X // Вывод результатов
C194 VIEW Y
C195 VIEW Z
C196 STOP
C197 GTO C001
Символы отличные от изображённых на клавиатуре калькулятора
-
-
- умножение
-
- / - деление
- SQRT x - квадратный корень
- x SQR y - корень степени X из содержимого Y регистров стека
- x<->y - обмен данными между регистрами стека X и Y
- pi - 3,1415927....
blog comments powered by Disqus