
- •12 Информатика и системология. 1 сем. Модуль 2: ска Maple. Тема 2 Типы данных, переменные, макроопределения Тема 2Типы данных, переменные, макроопределения
- •2.1Алфавит, лексемы
- •2.1.1Зарезервированные ключевые слова
- •2.1.2Строки и символьные имена
- •2.1.3Натуральные и целые числа
- •2.1.4Разделители (знаки пунктуации)
- •2.2Выражения и предложения языка
- •2.2.1Предложение присвоения
- •2.2.2Комментарии
- •2.2.3Функции op и nops.
- •2.3Типы выражений
- •2.3.1Простые типы
- •2.3.2Базовые структурированные типы
- •2.4Решение уравнений и неравенств
- •2.4.1Функция solve
- •2.4.2Функция fsolve
2.4Решение уравнений и неравенств
Для символьного решения уравнений или неравенств может быть использована функции solv, а для численного — fsolve.
2.4.1Функция solve
Для решения (одного) уравнения синтаксис имеет вид
solve(equ, varname);
Здесь equ — уравнение, varname — имя неизвестной (необязательный параметр). Если уравнение не содержит параметры, то имя неизвестной может быть опущено. Если в уравнении не указаны знак равенства и правая часть, то подразумевается уравнение f(x) = 0, где f(x) значение equ.
Функция возвращает последовательность корней (в частности, состоящую из одного элемента). Если функция не смогла найти корни, то возвращается пустая последовательность.
Примеры решения одного уравнения
1. Уравнение не содержит параметр. Можно не указывать имя переменной
> solve(2^x-2*4^x=0);
-1
2. В предыдущем примере в правой части уравнения ноль. В этом случае знак равенства можно опустить.
> solve(2^x-2*4^x);
-1
3. Примеры случаев, когда последовательность корней содержит больше одного элемента
> solve(x^2+2*x+1);
-1, -1
> solve(x^3+x^2+x+1);
-1, I, -I
Для решения системы уравнений синтаксис имеет вид
solve(equs, varnames);
Здесь equs – это список или множество уравнений, varnames — список или множество неизвестных. Функция возвращает список или множество решений.
Примеры решения систем уравнений
1. Использование списка и множества
> solve({x+y =1, x-y=-1}, {x,y});
{x = 0, y = 1}
> solve([x+y =1, x-y=-1], [x,y]);
[[x = 0, y = 1]]
2. Как и в случае одного уравнения, если система не содержит параметры, то список неизвестных можно не указывать
> solve({x+y =1, x-y=-1});
{x = 0, y = 1}
> solve({x+y, x-y});
{x = 0, y = 0}
В общем случае только для решения алгебраических уравнений степени четвертой и ниже могут быть получены решения в радикалах. Форма ответа определяется значением переменная среды _EnvExplicit:
unasingned — возвращать точное решение для алгебраического уравнения степени третьей и ниже;
true — возвращать точное решение алгебраического уравнения четвертой степени или ниже;
false — возвращать точное решение алгебраического уравнения, ели оно рациональное.
Примеры решений для различных значений переменной _EnvExplicit
1. Переменной _EnvExplicit не присвоено значение
> solve(x^4+1); #
> solve(x^4+x+1);
2. Переменной _EnvExplicit присваивается значения для вывода всех решений в радикалах
> _EnvExplicit := true;
> solve(x^4+1);
> solve(x^4+x+1);#Результат громоздкий, ниже приведено только первое решение
3. Переменной _EnvExplicit присвоено значение для вывода только рациональных значений
> _EnvExplicit:= false;
> solve(x^4-2*x^2+1);
> solve(x^4+1); #По сравнению с предыдущими случаями решение в радикалах не выводится
> solve(x^4+x+1); #
Упражнение 1. Используя solve и evalf, получить в формате с плавающей запятой все комплексные решения уравнения: a) x^4+1=0; б) x^4+x+1=0.
2.4.2Функция fsolve
Поскольку синтаксис функции fsolve подобен синтаксису функции solve, синтаксис будет приведен сразу как для одного уравнения, так и для системы уравнений
fsolve(eqs, vars, complex, fulldigits, interval, starting_values, options);
eqs — уравнение, список уравнений или множество уравнений, а также список процедур;
vars — неизвестное, список неизвестных или множество неизвестных;
complex — искать комплексные решения;
fulldigits — для всех вычислений использовать количество десятичных знаков присвоенных Digits.
interval — диапазон, список диапазонов, неравенство или множество неравенств, для области поиска решения.
starting_values — начальное значение, используемое итерационными алгоритмами для поиска решения;
options — настройки в формате name = value. Поддерживается две опции avoid и maxsol.
avoid указывает точку (или список точек), которую следует исключить из поиска списка корней. Формат:
avoid = множество равенств | множество, содержащее множества равенств.
Формат второй опции: maxsol = posint, где posint — количество решений, эта опция применима только для одного алгебраического уравнения. Для списка процедур формат avoid это множество, содержащее список значений.
В случае алгебраического уравнения fsolve находит все (комплексные) решения, если указан параметр complex. Если этот параметр не указан, то fsolve возвращает все действительные решения. Если действительных решений нет, то возвращается пустая строка.
Если уравнение не алгебраическое, то fsolve находит один корень. В случае одного уравнения полезно построить график и найти промежутки, на которых имеется ровно один корень уравнения (промежутки изоляции). После этого вызвать функцию fsolve на каждом из этих промежутков.
Примеры
1. Случай одного алгебраического уравнения.
> fsolve(x^4+1); # В данном случае действительных решений нет. Возвращена пустая строка.
2.
Пример указания интервала поиска
решений. Уравнение
имеет три действительных корня. Если
построить график левой части этого
уравнения, то видно, что это уравнение
имеет один отрицательный и два
положительных корня. Если не задавать
ограничений на область поиска корня,
то fsolve,
как и должно быть, возвращает три корня.
> fsolve(x^3-2*x+1=0, x=-infinity..0);
-1.618033989
> fsolve(x^3-2*x+1=0, x=0..+infinity);
.6180339887, 1.
3.
Если
построить график, то видно, что уравнение
имеет пять корней. Они расположены на
промежутках:
(-5.1..-4.8),
(-4.6..4.1), (-0.5, 0.5), (4.1..4.5), (4.6..5.1). Вызов
fsolve(sin(x)+x/5
=
0), возвращает
только один корень:
0. Вызвав
функцию по очереди на промежутках
изоляции, получим все корни уравнения.
> f:= sin(x) +x/5:
> fsolve(f=0, x=-5.1..-4.8);
-4.906295151
> fsolve(f=0, x=-4.5..-4.1);
-4.104619851
> fsolve(f=0, x=4.1..4.5);
4.104619851
> fsolve(f=0, x=4.6..5.1);
4.906295151
4. Пример исключения точки. Исключив точку 0, получим следующее решение
> fsolve(f=0, x, avoid={x=0}); #
-4.104619851
> fsolve(f=0, x, avoid = {x=0,x=-4.104619851});
4.906295151
> fsolve(f=0, x, avoid = {x=0,x=-4.104619851, x=4.906295151});
-4.906295151
Несмотря на то что, avoid позволил найти почти столько же корней, как и при вызовах на промежутках изоляции, последний корень в 12-ой версии найден не был. Поскольку не была вызвана функция с большим множеством исключений.
Упражнение 2. Используя fsolve получить в формате чисел с плавающей запятой все (комплексные) решения уравнения: a) x^4+1=0; б) x^4+x+1=0.
2.5alias и macro
alias — «альтернативное имя» или псевдоним. Названия многих функций СКА Maple являются достаточно длинными. Если в некотором фрагменте рабочего листа необходимо вставить большое число вызовов функции, то для избежания «разрастания» текста, для его большей читаемости используется введение сокращенных имён. Для этой цели служит функция
alias(e1, e2, …, en),
где e1, e2, …, en — равенства, в которых в левых частях стоят «альтернативные имена», а в правых частях — исходные (длинные имена).
Пример
(из справки Maple)
введения
короткого имени.
В Maple
функция,
вычисляющая биномиальные коэффициенты,
т.е. число сочетаний из n
по m:
,
называется binomial(n,
m).
> alias(C=binomial) # Определяем альтернативное имя.
> С(4, 2);
6
macro — макоопределение. В Maple макроопределения во многом похожи на псевдонимы, однако, при помощи macro можно задать ещё и «символьные константы», т.е. присвоить числам или строкам имена, и в процессе написания программы (вместо вставки числовых значений или строк) вставлять их имена. Этим достигается две цели:
Во-первых, улучшается читаемость программы. Если спустя длительное время перечитывать рабочий лист, то трудно вспомнить смысл конкретных чисел.
Во-вторых — и это главное — улучшается модифицируемость программы. Определённое число может встречаться в программе несколько раз. При внесении в программу изменений, затрагивающих, помимо прочего, изменение этого числа, необходимо одинаковым образом изменить все вхождения в программу этого числа. Всегда есть шанс внести изменения не во всех местах. Использование макроопределений позволяет вносить изменение только в одном месте: в макроопределении.
Макоопределения задаются функцией
macro(e1, e2, …, en);
где, как и в случае alias, e1, e2, …, en — равенства, в которых в левых частях стоят имена, а в правых длинные имена или постоянные (числовые или строковые).
Пример определения символьной постоянной.
> macro(x = 1.312):
> x+2;
3.312
> x:= 1; # иллюстрация того, что символьная постоянная не может быть изменена
Error, invalid left hand side of assignment
1 Возможны другие варианты присвоения (в частности, множественное присвоение), о которых можно прочесть в книге Аладьев В.З., Бойко В.К. Ровба Е.А. Программирование и разработка приложение в Maple. Гродно: ГрГУ – 2007.
1 Разность множеств множества A и B — A minus B — это множество элементов А не входящих в множество B. Объединение множеств A и B — A union B — это множество, состоящее из элементов, входящих в A или B.
Пересечение множеств A и B — A intersect B — это множество, состоящее из элементов, входящих и в A, и в B, т.е. это множество общих элементов двух множенств.
1 Вместо op(A) для списка или множества можно использовать A[], т.е. использовать «пустой выбор» (empty selection).