Решение кубического уравнения (HP-35s)

| рубрика «Программы» | автор basvic
Метки: , ,

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

Входные данные - уравнение вида

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....