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-подобный синтаксис.

Простые арифметические выражения поддерживают инфиксную запись:

  • 7+1 (Сложение)
  • 17*31 (Умножение)
  • 1-5 (Вычитание)
  • 2^15 (Возведение в степени)
  • 1703 / 13 (Деление)
  • 1+2*3^4/5

Системные функции озаглавлены и имеют свои аргументы под круглыми скобками, разделёнными запятой.

  • Sin(3*Pi/2) (Синус)
  • Max(1/3, 0, −42, 17, 8^6) (Максимум)
  • Sqrt(4) (Квадратный корень из 4)
  • N(8^(1/3)) (Преобразует символы в число)

Функции могут быть составными, то есть аргумент следует за телом.

Например, 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

текущая сессия с памятью о предыдущих вызовах и определениях уходит в забвение.

Примеры символьных вычислений из документации:

  • 1/14+5/21*(30-(1+1/2)*5²); (Вычисление дробей, в этом случае выведет (-12)/7)
  • 0+x (Вывод: x)
  • x+1*y (Вывод: x+y)
  • Sin(ArcSin(alpha))+Tan(ArcTan(beta)) (Вывод: alpha+beta)

Каждый предыдущий результат можно получить через оператор %.

Для упрощения выражений используется команда 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) } упрощает его.

Примечания[править]