Изрази

CalcPad е програма за изчисления и затова всичко, което въведете в текстовия прозорец, по подразбиране се счита за аритметичен израз, освен ако не е в кавички. Тогава се счита за коментар. По правило всеки израз трябва да е разположен на нов ред:

  • 2 + 3
  • 5*(3+1)
  • 15/2

Не трябва да завършвате изразите с "=". Това е символът за присвояване и служи за задаване на стойности на променливи, например "a = 2". Когато натиснете бутона Play, в прозореца с резултати автоматично ще получите:

  • 2 + 3 = 5
  • 5∙(3 + 1) = 20
  • 15/2 = 7.5

По изключение, може да имате няколко израза на един ред, разделени с коментари:

'Дължина - ' a = 3 ' m, Ширина - ' b = 2*a ' m, Височина - ' c = 5 ' m

Изразите могат да включват константи, променливи, оператори, функции и скоби. Те трябва да са в правилната последователност за да образуват валиден израз. Използва се общоприетата математическа нотация и приоритет на операциите, които се изучават в училище. Подробно описание на отделните елементи от израза е дадено по-долу.

Може да въведете отделни независими изрази или да съставите цялостна програма за решаване на задачата. За целта, трябва последователно да дефинирате параметри, на които да зададете стойности. По-нататък може да ги използвате във формули, чрез които да изчислите други параметри и така, до получаване на отговора. Чрез подходяща комбинация от изрази, коментари, схеми и малко html, може да съставите професионална и прегледна програма-записка. Може да я запишете във файл и да я ползвате многократно. Ето една примерна задача за намиране на корените на квадратно уравнение:

Sample1

Константи

Реални

Константите могат да бъдат положителни или отрицателни цели числа, или десетични дроби. Те трябва да включват цифрите "0" - "9" и "." за десетична точка. Може да въведете и обикновена дроб като "3/4", но програмата на практика ще я третира като израз от две константи и оператор "/". Не може да въвеждате числа с плаваща запетая във формат "3.4e+6". Вместо това, може да използвате израза: "3.4*10^6".

Всички константи и променливи се съхраняват в поле тип double-precision floating point. Те могат да имат стойности от -1.7976931348623157E+308 до 1.7976931348623157E+308. Най-малкото положително число може да бъде 4.94065645841247E-324. По-малки стойности от тази се считат за точно 0. Ако получените резултати излизат извън посочените граници, програмата връща съответно "-∞" и "+∞". Същото се получава и при делене на нула, а "0/0" = "Недефинирано".

Комплексни (Само за уеб и про версии)

В режим "Complex", може да използвате и комплексни числа. Комплексното число представлява наредена двойка (a; bi) , където "a" е реално число, а "bi" се нарича имагинерно. Може да се запише в алгебрична форма като ±a ± bi, например "2 + 3i". Може да използвате и тригонометрична и експоненциална форма като въведете съответните изрази. Имагинерната единица се записва като "1i", а не като "i". Така може да имате и отделна променлива с име "i". Имагинерната единица се дефинира чрез израза (1i)2 = -1.

Променливи

Променливите се дефинират чрез име и стойност, посредством израз от вида "a = 4". Символът "=" е оператор за присвояване. От лявата му страна трябва да има единствено име на променлива, а от дясната може да стои всякакъв валиден аритметичен израз, например "b = a + 4". След като веднъж е дефинирана, променливата може да участва в други изрази по-нататък. При всяко срещане на името на променливата в процеса на изчисляване, тя се замества с нейната стойност. Не може да използвате променлива, преди да е дефинирана. Това ще доведе до грешка. Всяка променлива е валидна от момента на нейното създаване до края на задачата. Ако я дефинирате повторно, новата стойност ще замени старата.

Имената на променливите могат да съдържат малки и главни букви на латиница "a" - "z", "A" - "Z", гръцки букви "α" - "ω", "Α" - "Ω" и цифри. Прави се разлика между главни и малки букви. Например "a" и "A" са различни променливи. Името не може да започва с цифра. Може да използвате и символа "_" (долна черта). Първото му срещане се счита за начало на долен индекс. Например "a_1_1" ще бъде форматирано като "a1_1". Променливите могат да съдържат и комплексни стойности.

Оператори

Програмата поддържа следните оператори:

  • Аритметични:
    • "^" - повдигане в степен;
    • "/" - деление;
    • "\" - целочислено делене;
    • "%" - остатък от делене;
    • "*" - умножение;
    • "-" - изваждане;
    • "+" - събиране;
  • Релационни (сравнение):
    • "" - равно на;
    • "" - различно от;
    • "<" - по-малко;
    • ">" - по-голямо;
    • "" - по-малко или равно;
    • "" - по-голямо или равно;
  • "=" - присвояване.

Последният оператор не трябва да се бърка с този за сравнение или със символа "=" за получаване на резултата при стандартните калкулатори. Операторите по-горе са дадени в реда на техните приоритети. В този ред се изпълняват и съответните операции. Първо се извършва повдигане в степен, деление и умножение, изваждане и събиране и накрая: сравняване. Всички релационни оператори са с равен приоритет. За да промените последователността на операциите, трябва да използвате скоби. Например, "5 + 2∙3" прави "11". Ако искате да извършите първо събирането, напишете "(5 + 2)∙3" и ще получите "7∙3 = 21". Когато имате оператори с равен приоритет в един израз, тогава операциите се извършват отляво надясно. Например, "3 - 2 + 1" прави "(3 - 2) + 1 = 2", а не "3 - (2 + 1) = 0". Друг добър пример е "2∙3 / 2∙3", което прави "9", а не "1". Всички оператори в CalcPad са ляво асоциативни (операциите се извършват отляво надясно). Тук има известен проблем с повдигането в степен. Официално то се счита за дясно асоциативно. Извършва се в реда отдясно наляво, т.е. x^a^b се чете като xab. Много от ръчните калкулатори обаче не смятат така, включително и някои широко разпространени програми като Excel. Там x^a^b се чете като xa·b. Ако искате да получите xab трябва да поставите скоби: x^(a^b). Така е прието и в CalcPad по две причини:

  1. Многократното повдигане в степен е по-рядко срещана последователност.
  2. Excel е доста популярен и това ще улесни потребителите, които искат да преминат на CalcPad.

И така, ако напишете 4^3^2 в CalcPad, ще получите 43·2 = 4096, а 4^(3^2) ще даде 432 = 262144.

Релационните оператори могат да връщат само две стойности: "1" - истина и "0" - неистина. Те могат да участват и в по-сложни изрази. Например, може да получите по-голямото от a и b от израза "a*(ab) + b*(a < b)". Трябва обаче да бъдете много внимателни. Например, ако вместо "<" използвате "", при a точно равно на b, ще получите 2∙a. По-добре е вместо това да използвате вградената функция max(a; b) или условно компилиране (виж по-нататък). Може да имитирате и прости логически изрази, замествайки ги с алгебрични. В този случай, за логическо "И" трябва да използвате "*", а за "ИЛИ" - "+". Например "(2 < 3) + (2 < 1) = 1 + 0 = 1" (истина), а (2 < 3)∙(2 < 1) = 1∙0 = 0 (неистина). Тук отново трябва да внимавате. Това не е булева алгебра, а по скоро трик за нейното заместване. Не забравяйте и скобите, тъй като алгебричните операции са с по-висок приоритет от релационните.

Аритметични операции с комплексни числа (Само за уеб и про версии)

Всички оператори поддържат и комплексни числа, с изключение на тези за целочислено деление "\", остатък "%" и сравняване: "<", "", ">", "". Изчисляването на изрази с комплексни числа се извършва малко по-сложно отколкото се реални. Ето правилата за основните аритметични операции:

  • Събиране: (a + bi) + (c + di) = (a + c) + (b + d)i;
  • Изваждане: (a + bi) − (c + di) = (a − c) + (b − d)i;
  • Умножение: (a + bi)·(c + di) = (ac − bd) + (bc + ad)i;
  • Деление: (a + bi)/(c + di) = (ac + bd)/(c2 + d2) + (bc − ad)/(c2 + d2)i;

Скоби

Скобите служат за две цели: едната е промяна на последователността на операциите, а другата е да заграждат аргументите на функциите. Трябва да използвате означенията "(", ")". Програмата следи за спазването на следните правила:

  • Първата срещната скоба в израза трябва да е лява;
  • Броят на левите и десните скоби трябва да е равен;
  • Преди лява скоба трябва да има оператор или име на функция;
  • Не може да има дясна скоба след оператор или име на функция;
  • След име на функция винаги трябва да следва лява скоба.

При форматиране на изходните резултати, програмата поставя скобите "интелигентно". Това означава, че скоби, които се дублират или по никакъв начин не променят реда на операциите, се премахват. От друга страна, на определени места се налага да се добавят скоби, въпреки че липсват във входния скрипт. Това се получава най-често при заместване на стойностите на променливи, които съдържат в себе си отрицателни или комплексни числа. Например:

  • Ако a = -2, то a2 = (-2)2 = 4, а не a2 = -22. Във втория случай, обикновено се счита, че минусът е след повдигането в степен и резултатът би трябвало да е -4. Скоби се добавят и при степенуване на комплексно число;
  • Ако a = -2, то b = -a = -(-2) = 2, а не b = -a = --2 = 2;
  • Скоба се поставя и когато умножаваме или делим на отрицателно число: a·b = -2·(-3) = 6;
  • Ако имаме променливи с комплексни стойности, след заместването им се поставят скоби: a·b = (2 + 3i)·(3 - 2i) = 12 + 5i.

Функции

Стандартни

CalcPad разполага с набор от стандартни библиотечни функции, които може да ползвате направо:

  • abs(x) - абсолютна стойност (модул) |x|;
  • sin(x) - синус;
  • cos(x) - косинус;
  • tan(x) - тангенс = sin(x)/cos(x), за всяко x ≠ kπ, k=1, 2, 3...;
  • cot(x) - котангенс = cos(x)/sin(x), за всяко x ≠ π/2 + kπ, k=1, 2, 3...;
  • sinh(x) - синус хиперболичен = (ex - e-x)/2;
  • cosh(x) - косинус хиперболичен = (ex + e-x)/2;
  • tanh (x)- тангенс хиперболичен = (ex - e-x)/(ex + e-x);
  • coth(x) - котангенс хиперболичен = (ex + e-x)/(ex - e-x), за x ≠ 0;
  • asin (x)- аркуссинус, дефинирана за -1 ≤ x ≤ 1;
  • acos(x) - аркускосинус, дефинирана за -1 ≤ x ≤ 1;
  • atan(x) - аркустангенс;
  • acot(x) - аркускотангенс;
  • asinh (x)- аркуссинус хиперболичен = ln(x + √x2 + 1), дефинирана за -∞ ≤ x ≤ +∞;
  • acosh(x) - аркускосинус хиперболичен = ln(x + √x + 1·√x - 1), дефинирана за x ≥ 1;
  • atanh(x) - аркустангенс хиперболичен = 1/2·ln[(1 + x) / (1 - x)], за -1 < x < 1;
  • acoth(x) - аркускотангенс хиперболичен = 1/2·ln[(x + 1) / (x - 1)], за |x| > 1;
  • log(x) - десетичен логаритъм (при основа 10), за всяко x > 0;
  • ln(x) - натурален логаритъм (при основа e ≈ 2.7183), за всяко x > 0;
  • sqr(x) или sqrt(x) - корен квадратен (√x), дефинирана за всяко x ≥ 0;
  • min(x; y) - по-малката стойност от x и y;
  • max(x; y) - по-голямата стойност от x и y;
  • round(x) - закръглява на по-близкото цяло число;
  • floor(x) - закръглява на по-малкото цяло число;
  • ceiling(x) - закръглява на по-голямото цяло число;

Аргументите на функциите трябва да за заградени със скоби. Те могат да бъдат константа, променлива или израз. Ако имаме функция с два аргумента, като min и max, аргументите трябва да са разделени с ";". Когато аргументите на функцията излизат извън дефиниционната област, получения резултат е "Недефинирано". Изключение от това правят "cot(0)" и "coth(0)", които връщат "+∞". Аргументите на тригонометричните функции могат да бъдат в градуси или радиани. Това се избира от съответните радио бутони над прозореца с резултати. Може да се настройва и от самата записка. Трябва да вмъкнете един ред със съдържание, съответно #deg за градуси и #rad за радиани.

Всички функции са дефинирани и в комплексната си форма и могат да се ползват с комплексни числа, с изключение на функциите min(x; y) и max(x; y). Функциите за закръгляване, закръгляват едновременно реалната и имагинерната част на комплексното число. Може да използвате и няколко специални функции, само за комплексни числа:

  • re(a + bi) - реална част от числото, re(a + bi) = a;
  • im(a + bi) - имагинерна част от числото, като реално число, im(a + bi) = b;
  • abs(a + bi) - модул на комплексното число = sqrt(a2 + b2);
  • phase(x) - фаза на комплексното число (аргумент) = atan2(a; b).

Всяка функция връща като резултат една единствена стойност. Това важи дори и за многозначните функции. Останалите значения, могат да бъдат добавени в хода на решението чрез допълнителен код, съобразно познанията ни по алгебра.

Потребителски (Само за уеб и про версии)

Може да дефинирате и нови функции, различни от библиотечните, които да ползвате по-нататък в изчисленията. Допускат се само функции на един аргумент. Дефинирането става, като напишете името на функцията, в скоби името на аргумента, " = израз". Това може да бъде всякакъв валиден израз, който може да съдържа, константи, оператори, променливи или други функции, например:

  • f(x) = x^2 + 2*x*sin(x)
  • g(x) = f(x)/(x - 4)

След като функцията веднъж е дефинирана, може да я използвате многократно, вместо да пишете същия израз на всяко място. Достатъчно е само да напишете името на функцията и стойност на агрумента в скоби, например f(2). За имената на функциите важат същите правила, както за имената на променливите. Като стойност на аргумента, може да напишете всякакъв валиден израз. Самата функция може също да е част от израз, например c = 4*f(a^2 + 2) - 2*b. Цикълът на живот на функцията е от мястото на нейното дефиниране, до края на записката. Ако използвате същото име по нататък, за дефиниране на нова функция, старата ще бъде презаписана и ще престане да съществува. Не може да предефинирате библиотечни функции, например sin(x) = x^2. Програмата ще върне съобщение за грешка.

Не е необходимо да дефинирате предварително променливата, която се използва за аргумент. Ако обаче в дефиницията на функцията участват и други променливи, те трябва да се дефинират преди първото извикване на функцията. Променливата на аргумента е локална за функцията. Това означава, че ако зададете предварително стойност, например x = 4 и извикате функцията, променливата ще запази тази стойност и след това. Потребителските функции могат да работят и с комплексни числа.

Графики (Само за уеб и про версии)

CalcPad включва и някои специални команди, например за построяване на графики или за изполване на числени методи. Имената на специалните команди започват с "$" за да се различават от обикновените функции. Параметрите им задължително се заграждат във фигурни скоби "{" и "}". Такава е и командата за построяване на графика. Тя има следният формат:

$Plot{ f(x) @ x = a : b}

, където:

  • f(x) - Функцията, на която ще се изчертае графиката. На мястото на f(x) може да поставите всякакакъв валиден израз. От него ще се получат стойностите на ординатата. Не е задължително целият израз да бъде една функция или да включва такава;
  • x - име на променливата, съответстваща на абсцисата. Тук трябва да стои само име на променлива и нищо друго. Не е задължително да бъде декларирана предварително;
  • a и b - начало и край на интервала, в който ще се изменя променливата. На мястото на a и b може да поставите числа, променливи или каквито и да е валидни изрази.

Например, ако въведе израза $Plot{ x^2 - 5*x + 3 @ x = -1 : 6}, ще получите следната графика:

Plot.png

Изразът $Plot{...} трябва да е първи и единствен на реда. Преди него не може да има нищо освен празни интервали. Не се допускат дори и коментари. В противен случай програмата ще върне грешка. Ако след затварящата скоба "}" има въведен каквто и да било текст, той ще бъде игнориран. Графиките поддържат само реални числа. Могат да се ползват и в режим "Complex", стига променливата x да е реална и f(x) да връща винаги реален резултат.

Числени методи (Само за уеб и про версии)

CalcPad има вграден модул "Solver", който може да решава и по-сложни задачи, с помощта на числени методи. Той може да работи само с реални числа, но не и с комплексни. Включени са следните команди:

Корени на уравнение

$Root{ f(x) @ x = a : b}

Намира корен на уравнението f(x) = 0. Като резултат връща намерената стойност. Ако не намери решение, функцията връща грешка, която се изписва на екрана. Командата използва комбинация от итерационни методи, които постепенно стесняват интервала около търсената стойност. Ако функцията има няколко корена в интервала, програмата ще намери един от тях. В такива случаи е най-добре първо да се построи графиката на функцията, след което интервалът да се раздели на няколко по-малки, всеки от които да съдържа по един корен. Командата трябва да се приложи по веднъж за всеки под-интервал за да се намерят всички корени. В някои случаи, това може да се разработи като автоматична процедура, като се комбинира с командите за търсене на екстремуми.

Минимум на функция

$Inf{ f(x) @ x = a : b}

Намира минималната стойност на функцията f(x) в зададения интервал [a, b]. За целта се изполва метода на златното сечение. Ако функцията има един локален екстремум, командата ще намери неговата стойност. В противен случай, ще върне по-малката стойност от двете за краищата на интервала. Ако в разглеждания интервал има няколко локални минимума, командата ще намери един от тях, но не задължително най-малкия. Това е защото командата следва винаги точно определен итерационен процес. В такива случаи е добре отново интервалът да се раздели на под-интервали.

Максимум на функция

$Sup{ f(x) @ x = a : b}

Работи по аналогичен начин на предишната команда само, че намира максималната стойност на функцията.

Числено интегриране

$Area{ f(x) @ x = a : b}

Изчислява стойността на определения интеграл от функцията f(x) в зададения интервал [a, b]. Използва се адаптивен метод на Симпсън.

Числено диференциране

$Slope{ f(x) @ x = a}

Намира стойността на първата производна на функцията f(x) в точка x = a. Тя представлява същевременно и наклона на допирателната към графиката на функцията в съответната точка.

Общи препоръки и особености

За всички описани по-горе команди, функцията f(x) трябва да бъде гладка и непрекъсната в интервала. Изключение прави намирането на корен на уравнение. Там е достатъчно функцията да е непрекъсната и да има различни знаци в краищата. При това положение, програмата задължително ще намери корен, съгласно теоремата на Болцано.

За разлика от командата за отпечатване, командите за числени методи могат да участват в изрази. Те връщат стойност, която може да участва по-нататък в изчисленията. Например, може да запишете резултата в променлива:

ymin = $Inf{ f(x) @ x = a : b}

За разлика обаче от стандартните функции, стойността на локалната променлива x се запазва след изпълнението и тя остава като валидна глобална променлива. Това е полезно в много случаи. Така за горния пример, ще получим стойността на x, при която е намерен минимума на функцията. Може да я запазите за по-нататък като да добавите следният ред:

xmin = x

Това е добре да стане веднага, за да не загубите стойността на x при използването му в други команди.