Yacas/Быстрый старт
Установка
правитьYacas доступен для скачивания с официального сайта[1].
Для Ubuntu можно скачать последнюю версию из репозитория с помощью таких команд:
- Открыть терминал
- Добавить репозиторий:
sudo add-apt-repository ppa:teoretyk/yacas
sudo apt-get update
- Скачать консольную версию:
sudo apt-get install yacas-console
- Скачать GUI:
sudo apt-get install yacas-gui
- Скачать ядро для Jupyter:
sudo apt-get install yacas-kernel
- Скачать дополнение для VS Code:
sudo apt-get install yacas-dev
Для других дистрибутивов GNU/Linux или можно скачать исходный код из архивов и собрать. В некоторых дистрибутивах Yacas можно найти в магазине приложений. Собрать программу на Linux можно так:
- Перейти в папку с программой
- Написать в терминале:
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release [-Dcommon_option=value ...] ..
make
- Выполнить команду
make install
Существует онлайн демо программы на сайте.
Есть версия на Android.
Синтаксис
правитьYacas имеет C-подобный синтаксис.
Простые арифметические выражения поддерживают инфиксную запись:
|
Системные функции озаглавлены и имеют свои аргументы под круглыми скобками, разделёнными запятой.
|
Функции могут быть составными, то есть аргумент следует за телом.
Например, ForEach(item, 1 .. 10) Echo(item);
. Общий вид такой функции: ForEach(x, список) тело
.
К слову, другая итеративная функция тоже имеет место в следующей форме: While(предикат) тело
.
Списка элементов заключается в фигурные скобки. Для вызова элемента нужно к нему обратиться по индексу. Нумерация с 1.
Запись {-1,0,1}[3]
вернёт последний элемент из списка. Выражение uu[2 .. 4];
к объявленному списку uu:={a,b,c,d,e,f};
вернёт его срез {b,c,d}
. Length(uu)
вернёт длину списка.
Каждое утверждение в команде следует заканчивать знаком ;
Несколько утверждений можно объединить скобками [
и ]
. C их помощью можно делать локальные области.
In> [a; Echo("a is: "); 1+2;];
a is:
Out> 3
Булевские значения True
и False
предобъявлены. В Yacas есть предикаты, системные функции возвращающие булевские значения. Например, IsNumber()
In> IsNumber(2+x)
Out> False
In> IsNumber(3)
Out> True
In> IsNumber(2/3)
Out> False
Поддерживаются инфиксные операторы And
, Or
и префиксный Not
.
Строки заключаются в двойные кавычки, если в строке они есть, то их необходимо экранировать. Выглядит это так: "this is a string with \"quotes\" in it"
. Для объединения двух строчек нужно использовать команду ConcatStrings(a, b)
.
Можно делать условные утверждения по следующей форме: If(предикат, описание положительной части, описание отрицательной части)
.
Символьные вычисления
правитьYacas можно использовать как калькулятор, но и для вычисления символьных выражений. После команды
restart
текущая сессия с памятью о предыдущих вызовах и определениях уходит в забвение.
Примеры символьных вычислений из документации:
|
Каждый предыдущий результат можно получить через оператор %
.
Для упрощения выражений используется команда Simplify()
. Например, Simplify(%) вернёт упрощённый вид
In> (x-1)*(x^2+x+1)
Out> (x-1)*(x^2+x+1)
In> Simplify(%)
Out> x^3-1
Часть простых уравнений можно решить через команду Solve:
In> Solve(x/(1+x) == a, x);
Out> {x==a/(1-a)}
In> Solve(x^2+x == 0, x);
Out> {x==0,x==(-1)}
In> Solve(a+x*y==z,x);
Out> {x== -(a-z)/y}
Можно раскладывать функции в ряд Тейлора
In> Taylor(x,0,5) ArcSin(x)
Out> x+x^3/6+(3*x^5)/40
В общем манипуляция с символами — главная составляющая Yacas. Несколько примеров:
Expand((1+x)^7);
разворачивает выражение в многочленLimit(x,0) Sin(x)/x;
Находит предел функции в точке.Newton(Sin(x),x,3,0.0001);
Находит ближайший корень к точке с заданной погрешностью.DiagonalMatrix({a,b,c});
Создаёт диагональную матрицу.Integrate(x,a,b) x*Sin(x);
Определённый интеграл на промежутке.Factor(x^2-1);
Разложение многочленов на множители.CanProve( (a And b) Or (a And Not b) );
Упрощает логические выражения.TrigSimpCombine(Cos(a)*Sin(b));
Упрощает тригонометрические выражения.D(x) Sin(x);
Производная синуса.
Длинная арифметика
правитьYacas справляется с числами произвольной точности:
In> 35!
Out> 10333147966386144929666651337523200000000
Обычно символьные выражения не приводятся к вещественному числу. N()
форсирует поиск приближения числа к данному выражению.
Объявления
правитьНовые переменные вводятся через инфиксный оператор :=
. Например, t:=1;
.
Раздекларировать имя можно через команду Clear()
. Объявленное выше имя t освобождается как Clear(t);
.
Тем же способом определяются функции. Например, f(x):=3*x*x*x
.
Правила
правитьДля математический вычислений бывает нужно преобразовывать символьные величины. Предусмотреть все возможные преобразования кажется непростой задачей, поэтому вместо этого в Yacas существует способ сопоставления с образцом для управления выражениями в соответствии с определяемыми пользователем правилами.
Например, хотим самостоятельно написать правило вычисления факториала для неотрицательных чисел. Сначала напишем правило, что для нулевых величин факториал равен 1.
In> f(0) <-- 1;
Out> True
In> f(0)
Out> 1
После этого необходимо ввести правило f(n)=n*f(n-1)
, но нужно понимать когда n
больше нуля и целое. Поэтому введём следующий вспомогательный предикат:
In> InIntegerGreaterThanZero(_n) <-- (IsInteger(n) And n > 0);
Out> True
In> InIntegerGreaterThanZero(3)
Out> True
Теперь можно определить правило вычисления произведения:
In> f(n_InIntegerGreaterThanZero) <-- n*f(n-1);
Out> True
In> f(3)
Out> 6
Для введения правил используется оператор <--
. _n
в правиле InIntegerGreaterThanZero(_n)
означает, что любые объекты, которые попадут в аргумент, обозначаются локальной переменной n
.
Общая форма правил следующая: [приоритет #] паттерн [_ постпредикат] <-- замена;
Местное упрощение
правитьИногда для некоторых выражений удобно использовать определённые правила упрощения, которые не должны применяться повсеместно. Для этого есть операторы /:
и /::
. Пусть, например, есть выражение Ln(a*b)
и хочется изменить его на Ln(a)+Ln(b)
, то проще всего это сделать так:
- Имеется выражение
Sin(x)*Ln(a*b)
. Sin(x)*Ln(a*b) /: {Ln(_x*_y) <- Ln(x)+Ln(y) }
упрощает его.