Решение квадратного уравнения (hp-35s)

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

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

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

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 команды. Но мне так нравится больше.