1 Министерство образования Российской Федерации Алтайский государственный технический университет Бийский технологический институт Ф.Ф. Спиридонов, В.В. Смирнов, Е.Ю. Баранов РЕШЕНИЕ ЗАДАЧ С ПОМОЩЬЮ Maple V Учебное пособие Барнаул 2001 2 УДК 519.7/.95 Спиридонов Ф.Ф., Смирнов В.В., Баранов Е.Ю. Решение задач с помощью Maple V: Учебное пособие. Алт. гос. техн. ун-т, БТИ. – Бийск. Изд-во Алт. гос. техн. ун-та, 2001. – 118 с. Учебное пособие содержит необходимые сведения для первичного знакомства с системой Maple и самостоятельных упражнений начинающего пользователя в применении предоставляемых ею средств. Данное учебное пособие сопровождается интерактивным документом того же названия. Предназначено для студентов специальности 120100 – «Технология машиностроения». Рекомендовано Сибирским региональным учебно-методическим центром высшего профессионального образования (СибРУМЦ) в качестве учебного пособия для студентов, обучающихся по направлениям «Техника и технология» и специальности «Прикладная математика». Рецензенты: заведующий кафедрой математики БПГУ к.ф.-м.н. Толстобров Ю.В., начальник лаборатории ФНПЦ «Алтай» с.н.с, к.т.н. Попок Н.И. Спиридонов Ф.Ф., Смирнов В.В., Баранов Е.Ю., 2001 БТИ АлтГТУ, 2001 3 ВВЕДЕНИЕ Система Maple является интерактивной системой компьютерной математики и предназначена для выполнения инженерных и научных расчетов. Кроме того, что систему можно использовать в качестве «суперкалькулятора», в ней имеется собственный встроенный язык программирования, по простоте аналогичный Бейсику. Открытость Maple дает возможность пользователю расширять по своему усмотрению имеющиеся библиотеки процедур и легко приспосабливать систему к решению нужных задач. Материал, содержащийся в настоящем учебном пособии, относится в первую очередь к версии Maple V, Release 5, работающей под управлением Windows 95. Однако при работе могут быть использованы как более ранние, так и более поздние версии Maple, поскольку большая часть содержимого этого документа к ним вполне применима. 1 КОНЦЕПЦИИ Maple В этом разделе мы постараемся снабдить вас необходимой информацией о языке пакета Maple для того, чтобы в дальнейшем вы смогли решать различные задачи самостоятельно. 1.1 Четыре свойства Maple Maple имеет, по крайней мере, четыре свойства, которые делают этот пакет полезным при решении целого ряда задач. Во-первых: Maple - интерпретатор. Это означает, что вы можете ввести команду и тут же ее исполнить, точно так же, как в обычных алгоритмических языках. Команда Maple это просто строка символов, оканчивающаяся точкой с запятой «;» или двоеточием «:». Например, команда > 2+5, factor(x^2+5*x +6), expand((x+y)^2); 7, ( x3 ) ( x2 ), x22 x yy2 предлагает Maple проделать последовательность операций: сложить 2 и 5, представить квадратичное выражение в виде произведения более простых (линейных) сомножителей и раскрыть выражение для полного квадрата. Команды factor и expand называются в Maple «словами». Вообще это имена процедур, которые определены для выполнения действий над выражениями, заключенными за этими «словами» в круглые скобки. Такие выражения обычно называются словом «input» - ввод. Результат выполнения процедуры над «вводом» естественно назвать «output» - вывод. Если команда заканчивается точкой с запятой (двоеточием), вывод появляется (не появляется) на экране дисплея. Во-вторых: Maple - символический и графический манипулятор. Это означает, что он предназначен для работы с алгебраическими выражениями и графическими объектами. В словаре Maple довольно большой запас слов, таких как factor, simplify, expand и др., используемых в символьных вычислениях, которые, обычно, мы привыкли делать с помощью карандаша и бумаги. Имеется также обширный запас слов, которые используются для построения графиков функций одной и двух переменных (кривых и поверхностей). Эти рисунки могут быть анимированы (оживлены), т.е. показаны последовательно наподобие кадров мультфильма, что часто бывает полезно при изучении протекающих во времени процессов. Два наиболее часто встречающихся слова plot и plot3d являются лишь частью обширного «графического словаря» Maple. Остальные, а их довольно много, могут быть найдены в пакете plots - как бы дополнительном специализированном словаре, который загружается отдельно, по мере необходимости. 4 В-третьих: Maple - расширяемый язык. Это означает, что вы можете определить дополнительные слова и добавить их в словарь Maple. Вначале, видимо, в этом не будет необходимости, кроме, разве что, определения функций. Существующий словарь достаточно велик для того, чтобы решать множество задач. Тем не менее, спустя какое-то время, может возникнуть потребность внести в него новые слова. В том случае, когда вы будете использовать некоторую совокупность слов при решении какой-то специальной задачи, будет полезно оформить их в виде пакета с целью более эффективного использования в различных рабочих листах. Maple уже снабжен многими подобными пакетами, включая уже упоминавшийся пакет plots, очень полезный пакет для выполнения векторных и матричных операций linalg, пакет комбинаторики combinat, пакет теории графов network и др. В-четвертых: Maple снабжен удобным интерфейсом. Итак, вы хотите научиться использовать Maple для решения задач. Для того чтобы добиться этого наилучшим образом, вам потребуется: познакомиться поближе с интерфейсом (оформлением рабочего листа), изучить язык, а затем поэкспериментировать. 1.2 Рабочий лист Рабочий лист (worksheet) - удобное место для решения задач. Когда вы щелкнете мышкой на иконке Maple в Windows, безымянный рабочий лист предстанет перед вами. Можно представить себе, что это чистый лист бумаги. Как обычно, спустя некоторое время, этот лист будет содержать запись работы, проделанной при решении каких-то задач. Чтобы отличить конкретный рабочий лист от многих других ему нужно присвоить имя для хранения в виде файла на диске, к тому же, в этом случае его можно будет использовать в дальнейшем. Рабочий лист состоит из ячеек трех различных типов: ячеек ввода - input cells, ячеек вывода - output cells и текстовых ячеек - text cells. Ячейки ввода начинаются со скобки вида '>'. Вот две таких ячейки: > > Ячейка ввода - это место, где находятся команды или операторы, которые должны быть выполнены Maple. Одна ячейка может содержать один или больше операторов, каждый из которых оканчивается двоеточием или точкой с запятой. Интересно, что содержимое любой из этих ячеек может быть снова и снова изменено и после этого исполнено. Команда позволяет легко исправлять свои собственные ошибки. Например, предположим, мы хотим, чтобы Maple нашел значение выражения 3*(4+5*3)*(7+6); но при этом забыли закрыть скобки: > 3*(4+5*3)*(7+6 ; `;` unexpected В результате запроса на вычисление возникло сообщение об ошибке, которое может помочь нам найти допущенную неточность. Теперь можно внести необходимые исправления и вновь исполнить эту же ячейку, нажав клавишу [Enter]. Такой прием удобно использовать при работе с изменяемыми значениями числовых параметров, входящих в операторы, для наблюдения за изменением получаемых результатов. Почти каждая ячейка ввода при исполнении порождает ячейку вывода, содержащую результаты вычислений. Эта ячейка как бы связана с породившей ее ячейкой ввода. Например, давайте сложим 3 в 23-ей степени с 4 в 12-ой степени, а затем представим результат в виде произведения простых чисел: 5 > > s := 3^23 + 4^12; ifactor(s); s := 94159956043 ( 727 ) ( 129518509 ) Проверим содержимое ячейки вывода для того, чтобы убедиться в правильности ответа на наш вопрос. Если ответ не тот, которого мы ждем, тогда вернемся обратно в ячейку ввода, внесем изменения и вновь исполним ее. Определенные слова Maple, такие как plot, генерируют отдельное окно, содержащее рисунок или страницу текста. Вы можете копировать и вставлять эти объекты в ячейки вывода вашего документа, если в этом возникает необходимость. Упражнение 1. Выполните следующую команду plot. Затем скопируйте полученный рисунок из графического окна в буфер памяти (для этого используйте меню Edit>Copy или иконку Copy) и вставьте его в свой рабочий лист. > plot(x^3-x+4,x=-2..2); Текстовая ячейка - это просто запись замечаний и пояснений к решению задачи, над которой вы работаете. Обычно все комментарии помещаются в текстовые ячейки. Это хорошая идея. Ведь вычисления без комментариев по большей части оказываются бесполезными для любого человека, кроме того, кто эти вычисления выполнял. Хотя замечено, что даже для самого исполнителя, ценность документа без пояснений быстро убывает с течением времени. Вы можете хорошо «управляться» с различными ячейками посредством команд меню (и иконок) в верхней части рабочего листа. В зависимости от платформы, которую вы используете (Windows, X, или Mac), эти команды и иконки могут слегка разниться, но при этом эффекты от их использования разнятся весьма незначительно. Вот что можно сделать с ячейками: заменить ячейку ввода на текстовую и обратно; разделить ячейку (ввода или текстовую) или объединить ячейки; создать новые ячейки (ввода или текстовые) между существующими ячейками; убрать ячейки (ввода, текстовые или вывода) по вашему желанию; копировать ячейки (ввода или текстовые) и поместить их в другое место. Эти приемы выполняются достаточно легко как непосредственно при вычислениях, так и в дальнейшем, для придания готовому рабочему листу облика документа. Необходимо помнить о следующем. Рабочий лист не подменяет собой бумагу и карандаш (мел и доску) в решении задач различного рода. Когда вы заняты какой-то задачей и соображаете, как ее решить, эти предметы вам крайне необходимы и полезны. Легче нарисовать грубую диаграмму от руки, чем с помощью Maple. Но после того как вы разработали план решения, возникает нужда в вычислениях, символических преобразованиях или графических построениях для выполнения этого плана. Именно тогда знание языка Maple становится весьма полезным. 6 1.3 Познакомимся с языком Maple имеет обширный встроенный словарь команд для выполнения специфических операций и построения алгоритмов расчетов, основанных на ваших знаниях математики. Есть такие слова-команды как factor, expand, simplify и т.д. С ними можно познакомиться непосредственно через систему помощи - Online Help. При этом желательно знание английского языка. Система помощи представляет собой браузер (Browser), в котором содержатся сведения в виде ответов на возможные вопросы, относящиеся к определенным категориям. Помощь можно запросить непосредственно из ячейки ввода. Например, для того, чтобы узнать о команде factor наберите следующее: > ?factor Кроме знания самого слова, вам, наверняка, потребуется и знание его синтаксиса. Что такое синтаксис? Любой алгоритм требует ввода определенной информации, которая будет использована при его выполнении – «ввода». После выполнения алгоритма получается некоторая результирующая информация – «вывод». Знание синтаксиса определенного слова Maple означает знание того, какая информация присуща «вводу», а какая – «выводу». Система помощи Help предоставляет такую информацию пользователю. В нижней части страницы Help находится очень полезная вещь - примеры использования слов. Эти примеры могут быть скопированы в рабочий лист и опробованы, что дает возможность поэкспериментировать при употреблении нужного слова. К тому же, есть такое слово Maple как example, которое, в большинстве случаев, сразу открывает страницу примеров применения заданного слова. Упражнение 2. Найдите разницу между factor и ifactor, используя команду ?ifactor. Упражнение 3. Примените слово ifactor для числа - своего года рождения. Упражнение 4. Примените nextprime для нахождения первых тридцати простых чисел после 5000. Упражнение 5. Как работают слова collect, coeff и expand? Используйте их для раскрытия выражения (x+2y)4 (expand), представления результата в виде полинома от x (collect), а также нахождения коэффициента при члене x3 в последнем результате (coeff). 1.4 Эксперимент Эксперимент - основа обучения. Мы постоянно экспериментируем, учимся благодаря этому, а затем используем приобретенные знания в жизни. Такая стратегия полезна и при изучении Maple, и при работе над решением какой-нибудь математической задачи. Возможность обращения за советом к системе Help значительно облегчает эксперименты такого рода. Допустим, вы работаете над какой-то проблемой, и нужно составить некий алгоритм, например, для решения уравнения, которое вы получили. Вы знаете, что слово Maple solve составляет основу нужного вам алгоритма, но вы забыли синтаксис. Тогда вы можете использовать слово example, для того, чтобы увидеть перечень примеров для команды solve, не просматривя всю страницу, посвященную этому слову. > example(solve); Помните, что страницы системы Help написаны для показа всей информации как пользователю-новичку, так и эксперту, поэтому не огорчайтесь, столкнувшись с незнакомой терминологией. Очень часто примеры в конце страниц Help в сущности расскажут вам то, что вы хотите знать. Почаще используйте такую помощь! 7 Упражнение 6. Поработайте несколько минут с системой Help и выясните, что означают термины Maple - list и set. В частности, в чем основное различие между этими словами? > example(list); > example(set); Упражнение 7. Если вы еще не успели, выясните, для чего могут использоваться термины seq, NULL, subsop, тем же способом, что вы только что проделали. В начале процесса решения задачи эксперимент помогает построить рабочий алгоритм. К концу этого процесса эксперимент поможет проверить само решение. Система Maple существенно облегчает такое экспериментирование вследствие возможности модификации алгоритмов. Рабочий лист Maple делает работу легкой, позволят посвятить ей несколько сеансов, а также оформить полученные результаты в виде документов (пояснительных записок, отчетов, статей) для публичного обозрения и использования. 2 ОСНОВЫ Maple Этот раздел содержит введение в язык команд Maple, используемый при решении задач. Он не претендует на полноту, содержит лишь основы. Советуем быстро ознакомиться с этим материалом для получения общего представления об особенностях языка Maple. Затем вы можете снова вернуться к началу и прочитать все более внимательно. 2.1 Арифметика Итак, сначала арифметика: сложение, вычитание, умножение, деление и возведение в степень. Эти операции можно объединять точно так же, как на калькуляторе. Порядок старшинства обычный: сначала - возведение в степень, затем умножение и деление, затем сложение и вычитание. Итак, скажем (т.е. наберем на клавиатуре и нажмем клавишу [Enter]): > 2-3+4/5*6^7; 1119739 5 это то же самое, что и > (2-3)+(4/5)*(6^7); 1119739 5 Вы заметили, что Maple предпочитает работать с простыми дробями (разумеется, где это возможно), обращаясь к десятичным числам только по требованию пользователя. Наберем и введем (нажимая клавишу [Enter]): > 1/3 + 1/2; 5 6 Получен ответ 5/6. Если же мы поставим десятичную точку в одном из чисел, то это заставит Maple выдать десятичный ответ: > 1/3. + 1/2; .8333333333 Другой путь получить десятичные числа - это использование слова evalf: > evalf(1/2+1/3); .8333333333 8 Для числа (площади круга с радиусом 1) в Maple есть слово Pi. Поэтому для вычисления площади круга с радиусом 3 мы должны сказать: > Pi*3^2; 9 Maple оставит в его символической форме до тех пор пока не получит указание превратить его в число с плавающей точкой – десятичное число. Например, если вы хотите вычислить площадь этого круга с точностью 100 цифр после запятой, то нужно сказать: evalf(Pi*3^2, 100);. По умолчанию константа Maple Digits равна 10. Если мы хотим увеличить или уменьшить точность расчета, то используем слово evalf со вторым аргументом, например: > evalf(Pi*3^2, 30); 28.2743338823081391461637904495 Эта команда вычислила значение 9, округленное до тридцати цифр после запятой. Если вы желаете, чтобы все ваши десятичные расчеты проводились с такой точностью, то вам нужно присвоить константе Digits значение 30, например: > Digits:= 30; Digits := 30 > sqrt(2)+sqrt(3)=sqrt(2.)+sqrt(13.); 2 3 5.01976483783708434192090999168 Однако без особой надобности до такой степени увеличивать точность расчетов не стоит. Поэтому мы вернемся к стандартному значению: > Digits:= 10; Digits := 10 Maple умеет оперировать и с комплексными числами. Для обозначения корня из минус единицы ( -1 ) в Maple имеется встроенная константа I. Например: > (3+2*I)*(2-I)/(3-I); 23 11 I 10 10 Для получения главного значения квадратного корня из 2+I, скажем Maple: > sqrt(2+I); 2I Для того, чтобы получить форму записи комплексного числа вида ab I , используем слово evalc : > sqrt(2+I)=evalc(sqrt(2+I)); 1 1 2I 42 5 I 42 5 2 2 Чаще всего комплексные числа встречаются при решении квадратных уравнений: > solve(3*x^2+2*x+1,x); 1 1 1 1 I 2 , I 2 3 3 3 3 2.2 Выражения, имена, операторы присвоения Величины, вычисляемые, например, как 1/2+1/3, называются выражениями (expressions). Имя (name) - это строка символов, которые используются для того, чтобы сохранить результат вычислений. 9 Оператор (statement) в Maple - это последовательность имен и выражений, оканчивающаяся точкой с запятой или двоеточием; в последнем случае вы не увидите результат вычислений, хотя сами вычисления и будут проведены. Оператор присвоения (assignment) является одним из самых распространенных. Он имеет форму: Имя := выражение. Например, оператор присвоения > area := Pi*3^2; area := 9 направляет 9 на хранение в область с именем area. Более полезным присвоением для площади круга может быть > area := Pi*r^2; area := r 2 В этом случае выражение r2 сохраняется с именем area и, благодаря этому присвоению, площадь круга любого заданного радиуса может быть вычислена посредством команды subs. Так, чтобы вычислить площадь круга радиусом r = 3, скажем: > subs(r=3, area); 9 В последнем случае удобно полагать, что присвоение area:=Pi*r^2 равносильно заданию функции (function) с именем area от радиуса r. 2.3 Функции Функция - это правило f (возможно, очень сложное), в соответствии с которым, каждому значению аргумента x соответствует единственное значение f(x). Обычно в вычислениях значения аргумента и функции являются действительными (реальными) числами, но, вообще говоря, определение функции может быть гораздо более гибким, чем приведенное выше. Функции в Maple могут быть определены различными способами. Во- первых, может быть задана как выражение. То есть присвоение > area:=Pi*r^2; area := r 2 определяет площадь круга как функцию его радиуса. В этом случае, как уже было показано в п.2.2, конкретное значение площади может быть получено с помощью команды subs. Поскольку эта функция описывает взаимно однозначное соответствие между парой действительных переменных, их значения могут быть нанесены на график с помощью слова plot. Поэтому оператор > plot(area, r=0..4); строит в графическом окне график этой функции на интервале от r = 0 до r = 4. 10 Во-вторых, если вы имеете дело с простой функцией, то можно воспользоваться оператором-стрелкой (arrow operator), понимая функцию как отображение множества на множество. Например: > area := r -> Pi*r^2; area := r r 2 определяет ту же самую функцию, что была определена выше. Но теперь для того, чтобы вычислить конкретное значение площади круга, например, с радиусом 3, мы пишем оператор > area(3); 9 Для построения графика на интервале r = 0..4, скажем: > plot(area, 0..4); Заметьте, что переменная r здесь отсутствует. В-третьих, задавать функцию можно с использованием слова unapply. Это короткое слово превращает выражения с одной или большим числом переменных в функции, определяемые как отображения. Например, если мы имеем полином, определяемый присвоением > pol := x^2 + 4*x -1; pol := x24 x1 тогда присвоение > pol := unapply(pol, x); pol := xx24 x1 превращает переменную pol в функцию-отображение. В-четвертых, функция может быть задана как процедура. В этом случае для определения функции может быть использовано слово proc из словаря Maple. Например: > area := proc(r) Pi*r^2 end; area := proc (r) r^2 end proc также определяет нашу функцию. И она точно также вычислится и изобразится на графике. Но одно из преимуществ такого определения функции состоит в том, что область ее определения теперь указывать не нужно. Например, в рассматриваемом случае радиус окружности всегда должен быть положительным и действительным числом. Это ограничение может быть вставлено в процедуру с помощью слова ERROR. Сообщение, которое процедура выдаст пользователю при срабатывании этого ограничения должно быть заключено в обратные кавычки «`» или в двойные кавычки «"», первые из которых расположены на той же клавише, что и ~ (тильда - tilde). Например, запишем: > area := proc(r) if r <= 0 then ERROR("radius must be positive") else Pi*r^2 fi: end; 11 area := proc (r) if r0 then ERROR( "radius must be positive") else r^2 end if end proc Теперь оценим: > area(3); 9 > area(-3); Error, (in area) radius must be positive В последнем случае мы получили сообщение процедуры об ошибке. Вы заметили оператор if..then..fi? О нем вы можете узнать, обратившись к Help с запросом ?if; в ячейке ввода. Функции двух переменных могут быть определены и представлены в виде графиков в Maple столь же просто, как и функции одной переменной. Например, объем V цилиндра с высотой h и радиусом r определяется как > V := (r,h) -> Pi*r^2*h; V := ( r, h ) r 2 h Для того, чтобы увидеть график этой функции, используйте слово plot3d: > plot3d(V, 0..4, 0..4, axes=boxed); Заметьте, что при построении графика использована опция axes=boxed. Попробуйте построить график, убрав эту опцию. Какой же из перечисленных способов определения функции является более предпочтительным? Это зависит от конкретной ситуации. Метод определения через выражение хорошо работает для функций с простым правилом задания, но при решении достаточно сложных задач вам не избежать использования -> или proc. И со временем вы оцените эту необходимость. 2.3.1 Кусочно определенные (piecewise defined) функции Многие функции могут быть определены только тогда, когда задана совокупность правил, каждое из которых соответствует отдельной части области определения. Слово Maple piecewise помогает в определении таких функций. Вот пример: > f :=unapply(piecewise(x <= -1, x^3+8, x <= 2, 7+ 2*x, x <= 4, 11 - cos(x),3*x), x); f := xpiecewise( x-1, x38, x2, 72 x, x4, 11cos( x ), 3 x ) > f(2); 11 При построении графиков таких функций иногда является предпочтительным использование опции style = point: > plot(f, -3..6, style= point); 12 Изобразить разрывную функцию также помогает опция discont=true: > plot(f, -3..6, discont=true, color=blue); Заметьте, что в последнем примере использована опция задания цвета графика. 2.3.2 Композиция функций Одно из важных качеств, характеризующее вычислителя - это умение видеть функцию как конструкцию, построенную из более простых функций посредством четырех арифметических операций, а также операции, называемой композиция, или суперпозиция. В Maple x21 эти операции обозначаются как +, *, -, / и @. Так, например, функция f( x ) есть x31 2 3 частное от деления g (x) = x 1 на h(x) = x 1 . Запишем: > g := x-> x^2 +1; h := x->sqrt(x^3-1); g := xx21 h := x x31 > f := g/h; f := g h > f(x); x21 x31 Этот способ представления функции f(x) через более простые не единственен. Например, функция-знаменатель h может быть представлена как композиция функции извлече3 ния квадратного корня x с полиномиальной кубической функцией k( x )x 1 : 13 > k := x-> x^3 -1; k := x x 3 1 > f := g/(sqrt @ k); f := g sqrt@k > f(x); x21 x31 Упражнение 8. Определите три функции g, h и k так, чтобы функция 4 f( x )( sin( x )x ) ( x21 ) определялась как g ( h@k ) . 2.3.3 Встроеные функции Maple и операции с функциями В Maple встроены все известные «стандартные» функции. Например, sqrt - это функция извлечения квадратного корня, abs - это функция вычисления абсолютного значения, тригонометрические и обратные им функции это sin, arcsin, cos и т.д., натуральный логарифм и показательная функция (экспонента) это ln и exp. Для ознакомления с перечнем встроенных функций наберите: > ?inifcns; Новые функции могут быть получены из «старых» или известных посредством арифметических операций и композиции, обозначаемой как @. Так функция, задаваемая присвоением > y := sin(cos(x^2+3)); y := sin( cos( x23 ) ) и оцениваемая при x =3 посредством команды > subs(x=3., y); sin( cos( 12. ) ) могла быть также определена присвоением вида > y := sin@cos@(x->x^2+3); y := sin@cos@( xx23 ) и оценена при x =3 как > y(3.); .7472099577 2.4 Maple как графический калькулятор Maple удобно представлять себе как занятный калькулятор с обширными графическими возможностями. Например, предположим, что мы хотим найти действительные 5 решения уравнения x 30 x20 на интервале –3..3. Тогда мы можем построить график левой части уравнения и посмотреть, где кривая пересекает ось x. Проделаем это: > f := x -> 10*x^5 - 30*x +10 ; f := x10 x530 x10 > plot(f, -3..3); 14 Наблюдение показывает, что пересечение находится около точки x=0. Уменьшим интервал, чтобы рассмотреть кривую f более детально: > plot(f, -1.5..1.5); Теперь видно, что имеется три точки пересечения и наибольший из корней этого уравнения находится между 1 и 1.5. Если требуется более высокая точность решения, следует воспользоваться словом fsolve. Обратите внимание на его синтаксис. Имеется три аргумента: уравнение; переменная, относительно которой решается задача; интервал, на котором отыскивается решение: > fsolve(f(x)=0, x, 1..1.5); 1.214648043 2.5 Типы данных Maple работает с множеством типов данных. Такова, например, классификация арифметических выражений по типу операций: сумма (тип - type '+' ), произведение (тип type '*' ), и т.д. Использование слова Maple whattype поможет ответить на вопрос, к какому типу принадлежит конкретное выражение? Например: > whattype(1/2); fraction > whattype(a + b); + > whattype(x^2 + x = 2*x - 1); = > whattype(a, b, 3); exprseq 15 2.5.1 Последовательность выражений Сокращение exprseq (expression sequence) расшифровывается в Maple как последовательность, состоящая из выражений, разделенных между собой запятыми. Например, > viola := 1, 2, w*r+m, a=b+c, 1/2, (x+y)/z, `hello`; 1 x( sin@cos@( xx23 ) ) viola := 1, 2, w rm, abc, , , hello 2 z это присвоение переменной с именем viola значения последовательности, состоящей из семи выражений. Для обращения к шестому выражению в этой последовательности надо набрать: > viola[6]; x( sin@cos@( xx23 ) ) z 2.5.2 Множество типа list Списком (list) в Maple называется последовательность выражений, заключенная в квадратные скобки. Так, команда > explist:= [viola]; 1 x( sin@cos@( xx23 ) ) explist := 1, 2, w rm, abc, , , hello 2 z создает множество типа список с именем explist, элементы которого те же самые, что и у множества viola (см.п.2.5.1). Так же, как и для последовательности выражений, мы можем обращаться к отдельному члену списка, добавляя вслед за именем его номер, заключенный в квадратные скобки. Так, чтобы получить третий член множества explist, запишем: > explist[3]; w rm Можно также обратиться к этому члену множества, используя слово op из словаря Maple следующим образом: > op(3, explist); w rm Итак, команда op(n,explist); возвращает n-ый член списка с именем explist. Для того, чтобы подсчитать количество членов в списке, используется слово nops. Так, например, > nops(explist); 7 говорит нам, что в списке explist имеется семь членов. Слово nops становится незаменимым, когда вы не хотите или не можете проделать соответствующую операцию вручную. Слово nops нельзя использовать для того, чтобы подсчитать число членов в последовательности выражений. Однако, заключив эту последовательность в квадратные скобки легко подсчитать число членов в получившемся списке: > nops(3, 4, a); Error, wrong number (or type) of parameters in function nops > nops([3, 4, a]); 3 Рассмотрим точку на плоскости (point in the plane) как пример списка из двух чисел. Такие точки можно суммировать, вычитать и умножать на число. Определим две точки, например: > p := [1, 2]; q := [-3, 1]; 16 p := [ 1, 2 ] q := [ -3, 1 ] Тогда новая точка может быть найдена как > w := 3*p + 2*q - p; w := [ -4, 6 ] Одна из важных возможностей операций со списками заключается в задании списков точек для построения графика. Например, для того, чтобы изобразить квадрат с вершинами в точках (1,1), (3,1), (3,3), (1,3), создадим соответствующий список точек, а затем применим к нему слово plot: > ab := [[1,1], [3,1], [3,3], [1,3], [1,1]]; ab := [ [ 1, 1 ], [ 3, 1 ], [ 3, 3 ], [ 1, 3 ], [ 1, 1 ] ] > plot(ab); Заметьте, что две границы квадрата почти совпадают с осями координат. Можно исправить эту ситуацию, введя нужные нам интервалы изменения координат x и y: > plot(ab, x=0..4, y=0..4); Кроме этого, списки можно использовать при построении параметрических графиков (parametric plots). Допустим, что мы имеем плоскую кривую, заданную параметрически, например, в виде xf( t ) , y g( t ) , причем параметр t изменяется от а до b, тогда можно нарисовать ее, создав список с тремя элементами, а затем изобразить его. Пусть нужно нарисовать верхнюю половину окружности с радиусом 4 и с центром в точке (1,5). Тогда соответствующий список будет состоять из выражений для координат x(t) и y(t), а также указания об интервале изменения параметра t: > plot([1+4*cos(t), 5+4*sin(t), t=0..Pi], scaling=constrained); 17 Если нужно нарисовать несколько дуг разных окружностей, удобно задать некоторую функцию для того, чтобы упростить задачу. Мы назовем эту функцию circ: > circ := (h, k, r, f, l) -> [h+r*cos(t), k+r*sin(t), t=f..l]; circ := ( h, k, r, f, l )[ hr cos( t ), kr sin( t ), tf .. l ] Итак, если вам нужны окружности с радиусами 1/2 и с центрами в углах квадрата ab, то вы можете построить последовательность списков. Вот где очень пригодится слово seq из словаря Maple. Напишем: > circs := seq(circ(op(ab[i]), 1/2, 0, 2*Pi), i=1..4); 1 1 1 1 circs := 1 cos( t ), 1 sin( t ), t0 .. 2 , 3 cos( t ), 1 sin( t ), t0 .. 2 , 2 2 2 2 1 1 1 1 3 cos( t ), 3 sin( t ), t0 .. 2 , 1 cos( t ), 3 sin( t ), t0 .. 2 2 2 2 2 Для того чтобы нарисовать эти окружности, вам нужно заключить их в фигурные скобки, создав тем самым множество типа set из последовательностей (см. п.2.5.3). > plot({circs, ab}, scaling=constrained); Возможно, что вам понадобится разделить один список точек на два: список x-координат и список y-координат. Слово seq из словаря Maple очень подходит для этой операции. Так, для того, чтобы разделить список ab на четные и нечетные элементы, достаточно написать: > xdat := [ seq(ab[i][1], i=1..nops(ab) )]; xdat := [ 1, 3, 3, 1, 1 ] > ydat := [seq(ab[i][2], i=1..nops(ab) )]; ydat := [ 1, 1, 3, 3, 1 ] А обратная задача? Компоновка списка точек, предназначенных для нанесения на график из двух списков также несложна. Хотя первая мысль, которая придет вам в голову может оказаться неверной: > seq([xdat[i], ydat[i]], i=1..nops(xdat)); [ 1, 1 ], [ 3, 1 ], [ 3, 3 ], [ 1, 3 ], [ 1, 1 ] Здесь слово seq не совсем правильно работает с последовательностью выражений для ввода. Тем не менее, немного подумав, мы заставим его работать так, как мы хотим: > newab :=[seq([xdat[i], ydat[i]], i=1..nops(xdat))]; newab := [ [ 1, 1 ], [ 3, 1 ], [ 3, 3 ], [ 1, 3 ], [ 1, 1 ] ] Что же мы сделали для того, чтобы изменить ввод так, как это нужно слову seq? Мы заключили ввод в квадратные скобки. Если теперь предложить этот список точек слову plot, т.е. попытаться построить график, то у нас все получится. Если же вы захотите отбросить внутренние скобки, это также возможно, но тогда команда plot воспримет это как последовательность постоянных функций: > newab := [seq(op([xdat[i], ydat[i]]), i=1..nops(xdat))]; newab := [ 1, 1, 3, 1, 3, 3, 1, 3, 1, 1 ] > plot(newab, color=black); 18 2.5.3 Множество типа set Множество типа set - это последовательность выражений, заключенная в фигурные скобки. Оно сильно отличается от множества типа list. Во-первых, порядок, в котором вы определяете элементы этого множества, может и не совпадать с порядком, в котором они расположены в памяти. Во-вторых, каждый элемент этого множества хранится лишь в одном экземпляре, вне зависимости от того, сколько раз вы перечислили его. Например: > Aset := {y+x+1, 1, 2, 1, 4, `bill`, x+y+1, `bill`}; Aset := { 1, 2, 4, ( sin@cos@( xx23 ) )x1, bill } С элементами такого множества можно проводить операции объединения (union), пересечения (intersection) и вычитания (minus). Например: > Anotherset := Aset union {4, 3, a, 7} ; Anotherset := { 1, 2, 3, 4, 7, a, ( sin@cos@( xx23 ) )x1, bill } > Anotherset minus Aset, Anotherset intersect Aset; { 3, 7, a }, { 1, 2, 4, ( sin@cos@( xx23 ) )x1, bill } Множества типа set пригодятся, когда требуется нанести на график более чем одну 2 функцию одновременно. Например, для рисования квадратичной функции x 2 и линейной функции 2 x 5 в одних и тех же осях, запишем: > plot({x^2-2, 2*x+5}, x=-5..5); yx22 Итак, мы нарисовали параболу и прямую y 2 x 5 в интервале x 5 .. 5 на одном графике. Если вам нужно нарисовать очень сложный рисунок, то вы можете воспользоваться операцией plots[display] из пакета plots. Для этого сначала дайте имена графическим объектам, которые вы хотите изобразить на одном рисунке, а затем используйте слово display для показа списка этих объектов: 19 > pl1 := plot({x^2-2, 2*x+5}, x=-5..5): > pl2 := plot([[2,1], [3,20], [0,0], [2,1]]): > plots[display]([pl1, pl2]); 2.5.4 Множества типов table и array Множество типа table - это специальный тип структурированных данных, который очень гибок. О нем можно много говорить, но это не входит в наши планы. Здесь мы остановимся лишь на множествах типа array. Это специальный тип множеств, индексы элементов которых являются числами. Такие множества иногда называют массивами, примерами их служат матрицы (двумерные массивы) и векторы (одномерные массивы). Например, результат матричной операции умножения можно увидеть, используя слово evalm вместе с символом матричного умножения &*. Запишем: > a := array(1..2, 1..2); a := array( 1 .. 2, 1 .. 2, [ ] ) Тем самым мы создали матрицу размерами 2 х 2, элементы которой нумеруются, начиная с первого как a[1,1] и т.д. Давайте повернем наш квадрат из п.5.2.2 ( ab := [ [ 1, 1 ], [ 3, 1 ], [ 3, 3 ], [ 1, 3 ], [ 1, 1 ] ] ) на угол равный 31-му градусу против часовой стрелки относительно начала координат и покажем это на графике: > rot := array([[cos, -sin], [sin, cos]]); cos sin rot := sin cos > ang := evalf(Pi/180*31); ang := .5410520681 > ab := [[1,1], [3,1], [3,3], [1,3], [1,1]]; ab := [ [ 1, 1 ], [ 3, 1 ], [ 3, 3 ], [ 1, 3 ], [ 1, 1 ] ] > rotab := [seq(convert( evalm(rot(ang)&*ab[i]), list), i=1..nops(ab) )]; rotab := [ [ .3421292258, 1.372205376 ], [ 2.056463827, 2.402281526 ], [ 1.026387677, 4.116616127 ], [ -.6879469243, 3.086539977 ], [ .3421292258, 1.372205376 ] ] > plot( { [[0,0]], ab, rotab} ); 20 2.6 Операторы Maple для управления вычислениями В Maple имеется два особенно важных оператора управления вычислениями. Один из них - оператор цикла (repetition loop), а другой - условный оператор (conditional execution statement). Оператор цикла выглядит так: for .. from .. by .. to .. while .. do .. od а условный оператор: if ... then ... elif ... else ... fi Эти операторы могут использоваться как интерактивно, так и при оформлении процедур. Например, сложим первые десять тысяч целых чисел. > s := 0: for i from 1 to 10000 do s := s+i od: s; 50005000 То же самое можно сделать, используя слово sum из словаря Maple: > i := 'i': sum(i, i=1..10000); 50005000 > i; i Это можно также проделать, используя уже знакомые слова convert и sec: > convert([seq(i, i=1..10000)], `+`); 50005000 Теперь сложим нечетные числа между 1 и 973. > s := 0: for i from 1 by 2 to 973 do s := s + i od: s; 237169 Сложим простые числа между 1 и 10000. > s:=0: for i from 1 to 10000 do if isprime(i) then s := s+i fi od: s; 5736396 Сложим первые 1000 простых чисел. > s := 0: j := 0: for i from 1 by 2 while j <1000 do if isprime(i) then s := s+i; j:= j+1 fi od: s; 3690838 Вычислим кубы первых пяти положительных целых чисел и сохраним их в виде списка. 21 > locube := NULL: # пустая последовательность "locube" for i from 1 to 5 do locube := locube, i^3 od: locube := [locube]; # последовательность "locube" -> "locube" locube := [ 1, 8, 27, 64, 125 ] > locube[3]:=15; locube3 := 15 список > locube; [ 1, 8, 15, 64, 125 ] Заметьте, как список получается из пустой последовательности выражений NULL: вначале на каждом шаге цикла в конец последовательности добавляется дополнительный элемент, затем последовательность заключается в квадратные скобки, превращаясь в список. Теперь проделаем это же упражнение снова, сохранив результат в массив (array): > aocube := array(1..5): # initialisation of array > for i from 1 to 5 do aocube[i]:= i^3 od; aocube1 := 1 aocube2 := 8 aocube3 := 27 aocube4 := 64 aocube5 := 125 > op(aocube); # what's in array? [ 1, 8, 27, 64, 125 ] Теперь массив aocube содержит нужные числа. Для того чтобы обратиться к третьему элементу этого массива, мы должны просто написать aocube[3], словно это список, а не массив. > aocube[3]:=0; aocube3 := 0 > print(aocube); [ 1, 8, 0, 64, 125 ] > locube := [locube[1], locube[2], 0, locube[4], locube[5]]; locube := [ 1, 8, 0, 64, 125 ] Теперь немного поговорим об условном операторе. Во множестве жизненных ситуаций возникают различные альтернативы, которые реализуются при некоторых условиях типа "если ... то ... иначе, если ... иначе ...". В Maple этому соответствует оператор if .. then .. elif .. else .. fi;. Например, многие функции определяются как кусочно заданные. Функция abs служит тому примером. Зададим «по-своему» функцию абсолютного значения – abs: > myabs := proc(x) if x > 0 then x else -x fi end; myabs := proc (x) if 0x then x else x end if end proc > myabs(-23); 23 > plot(myabs, -2..2, scaling=constrained, title=`My absolute value function`); # plot 22 2.7 Краткий словарь Maple Вот некоторые полезные слова из словаря Maple с примерами их использования. Для получения большей информации обратитесь к справочной системе Help. > y := (x+3)/tan(x^2-1); # присвоение x3 y := tan( x21 ) > collect(x*2 + 4*x, x); # собрать (привести подобные) 6x > diff(cos(x), x); # производная - d(cos(x))/dx sin( x ) > D(cos); # производная - cos' sin > y := denom((a+b)/(e+f)); # y:=e+f y := ef > y := 'y'; # «очистка» имени y -> y y := y > evalc((2+3*I)^3); # комплексное число 469 I > evalf(1/2^9); # вычислить 1/2^9 .001953125000 > expand((x+b)^7); # раскрыть (скобки) x77 x6 b21 x5 b235 x4 b335 x3 b421 x2 b57 x b6b7 > p := x^2+5*x+6; # p:=полином p := x25 x6 > factor(p); # разложить (на множители) ( x3 ) ( x2 ) > fsolve(x^5-3*x=1, x, 0..2); # решить уравнение (численно) 1.388791984 > int(x*exp(x), x); # неопределенный интеграл x e xe x > Int(x*exp(x), x=0..1); # определенный интеграл (инертная форма) 23 1 x e x dx 0 > map(x->x^2, [1, 3, 2, 5]); # список [ 1, 9, 4, 25 ] > nops([3, 4, x, 1]); # число членов в списке 4 > numer((a+b)/c); # числитель ab > op([3, 4, 1, x]); # извлечь из [] 3, 4, 1, x > plot(x^2+x, x=-3..3); # график 2D > plot3d(x^2+y, x=-2..2, y=0..2); > f := x -> x^2; > f(3); # -> - функция f := xx2 # f(3) вычислить f(3) 9 > quo((x^4-4), (x^2-2), x); > iquo(23, 2) ; # график 3D # (x^4-4)/(x^2-2) x22 # 23/2 11 > rem((x^4-4*x+3),(x^2-2),x); > irem(23, 2); # остаток деления 74 x # остаток(23/2) 1 > restart; # отмена всех присвоений: BEGIN > eq1 := x^2 + 3*x -1 = a; # уравнение eq1 2 eq1 := x 3 x1a 24 > rhs(eq1); > lhs(eq1); > simplify(a/x+b/y); > solve(a*x+4*y=0, x); > subs(x=5, x^2+x); > i := 'i'; > sum((i^2, i=2..9)); # правая часть уравнения eq1 a # левая часть уравнения eq1 x23 x1 # упростить (выражение) a yb x xy # решить (уравнение относительно x) y 4 a # подстановка x=5 в x^2+x 30 # «очистка» имени i -> i i := i # суммирование от 2^2 до 9^2 284 2.8 Задание ваших собственных слов Математический словарь Maple очень обширен, но он никогда не станет абсолютно полным. Это потому, что всегда будут возникать новые задачи и вестись поиск методов их решения. Новые методы могут быть реализованы в виде Maple-процедур. Одна из возможностей по созданию новых слов реализуется через последовательность ячеек ввода. Например, предположим, что мы хотим определить слово для решения квад2 ратного уравнения a x b xc0 . Нам нужно, чтобы в процедуру вводились коэффициенты a, b, c этого уравнения, а на выходе процедуры были его корни и пояснения о природе этих корней. Итак, поместим нужные нам значения в первую ячейку ввода. Затем в следующих ячейках создадим тело процедуры. Поскольку природа корней определяется 2 значением дискриминанта b 4 a c , используем в процедуре условный оператор. > a := 3 : b:= 0: c := 5: > if b^2 - 4*a*c < 0 then print("discriminant < 0, no real roots") elif b^2 - 4*a*c = 0 then print("discriminant = 0, 1 real root"); (-b +sqrt(b^2-4*a*c))/(2*a) else print("discriminant > 0, 2 real roots"); (-b +sqrt(b^2-4*a*c))/(2*a),(-b -sqrt(b^2-4*a*c))/(2*a) fi; "discriminant < 0, no real roots" После изменения значений a, b и c в ячейке ввода и проверки правильности выполнения команд можно оформить и саму процедуру. (Воспользуйтесь для этого средствами редактирования Copy и Paste из меню Edit, сделав первой строкой заголовок процедуры, а последней - ее конец.) > quadroots := proc(a,b,c) # заголовок процедуры if b^2 - 4*a*c < 0 then print("discriminant < 0, no real roots") elif b^2 - 4*a*c = 0 then print("discriminant = 0, 1 real root"); (-b +sqrt(b^2-4*a*c))/(2*a) else print("discriminant > 0, 2 real roots"); (-b +sqrt(b^2-4*a*c))/(2*a),(-b -sqrt(b^2-4*a*c))/(2*a) fi; end; # конец 25 quadroots := proc (a, b, c) if b^24ac0 then print( "discriminant < 0, no real roots") elif b^24ac0 then print( "discriminant = 0, 1 real root") ; 1/2( bsqrt( b^24ac ) )/a else print( "discriminant > 0, 2 real roots") ; 1/2( bsqrt( b^24ac ) )/a, 1/2( bsqrt( b^24ac ) )/a end if end proc Теперь проверим процедуру: > quadroots(2, 3, 4); "discriminant < 0, no real roots" > quadroots(2, sqrt(32), 4); "discriminant = 0, 1 real root" 2 > quadroots(2, 10, 4); "discriminant > 0, 2 real roots" 5 1 5 1 17 , 17 2 2 2 2 Вот мы и добавили новое слово к языку Maple. Теперь оно может использоваться так же, как и всякое другое. Но, тем не менее, оно еще не добавлено в словарь. В следующем сеансе работы с Maple оно не будет доступно, если не прилагать для этого дополнительных усилий. Один из способов собрать ваши процедуры вместе - это поместить их в пакет (package). Пакет в Maple - это таблица, в которой имена процедур являются индексами (элементами поиска), а входы - телами процедур. Например, в данном рабочем листе мы определили две процедуры, которые можно поместить в пакет, назвав их соответственно quadroots и myabs. Назовем наш пакет «mystuff». Напишем: > mystuff := table([]); mystuff := table([]) > mystuff[quadroots]:=proc(a,b,c) # начало if b^2-4*a*c<0 then print("negative discriminant, no real roots.") elif b^2-4*a*c=0 then print("discriminant is 0. 1 real root."); (-b +sqrt(b^2-4*a*c))/(2*a) else print("discriminant is positive, two real roots."); (-b +sqrt(b^2-4*a*c))/(2*a),(-b -sqrt(b^2-4*a*c))/(2*a) fi; end: # конец mystuff[myabs]:= proc(x) if x > 0 then x else -x fi end: with(mystuff); Warning, new definition for quadroots [ myabs, quadroots ] Теперь для того, чтобы использовать процедуры из пакета mystuff, надо загрузить рабочий лист, содержащий этот пакет, и исполнить содержимое ячеек, где определены нужные процедуры (разумеется, включая строку with(mystuff);). 26 2.9 Использование Пакетов Maple Имеется целый ряд пакетов, поставляемых с Maple. Например, plots и plottools - пакеты слов для изображения графиков, student - пакет слов для нужд студентов, numtheory - пакет слов для расчетов, связанных с теорией чисел, linalg - пакет линейной алгебры, geometry - пакет аналитической геометрии и т.д. Для того чтобы увидеть слова какого-либо пакета и в то же время сделать их доступными, используйте слово with; > with(plots); [ animate, animate3d, animatecurve, changecoords, complexplot, complexplot3d, conformal, contourplot, contourplot3d , coordplot , coordplot3d , cylinderplot, densityplot , display , display3d , fieldplot , fieldplot3d , gradplot , gradplot3d , implicitplot, implicitplot3d , inequal, listcontplot , listcontplot3d , listdensityplot , listplot , listplot3d , loglogplot, logplot, matrixplot, odeplot , pareto, pointplot, pointplot3d , polarplot, polygonplot, polygonplot3d , polyhedra_supported , polyhedraplot , replot, rootlocus, semilogplot, setoptions, setoptions3d , spacecurve, sparsematrixplot, sphereplot, surfdata , textplot, textplot3d , tubeplot ] Точно так же, как и слова из основного словаря Maple, слова из пакета имеют странички пояснений в системе Help. Хорошая стратегия решения какой-нибудь задачи заключается в поиске подходящих слов, которые помогут выполнить необходимую работу. Допустим, нам нужно нарисовать голубой шарик (blue ball) и красный конус (red cone). Нужные слова могут находиться в пакете plottools. > with(plottools); [ arc, arrow, circle, cone, cuboid, curve, cutin, cutout, cylinder, disk , dodecahedron , ellipse, ellipticArc, hemisphere, hexahedron, homothety, hyperbola, icosahedron, line, octahedron, pieslice, point, polygon, project, rectangle, reflect, rotate, scale, semitorus, sphere, stellate, tetrahedron, torus, transform, translate, vrml ] Да, конус (cone) и сфера (sphere) - вот те слова, которые мы ищем. Каков же их синтаксис? Напишем: > example(cone); Это дает нам увидеть страничку помощи для слова cone, а именно, раздел примеров. Копируем пример и вставляем в свой рабочий лист: > icecream := cone([0,0,-1],0.7,color=gold), sphere([0,0,0.1],0.6,color=brown): plots[display](icecream, scaling=constrained, style=patch); Это не решает нашей проблемы, но мы можем подправить то, что скопировали для того, чтобы выполнить нашу задачу. Все что мы должны сделать - это изменить цвета: 27 > icecream := cone([0,0,-1],0.7,color=red), sphere([0,0,.1],0.6,color=blue): plots[display](icecream, scaling=constrained); Заметьте, как используется набор слов plots[display]. Он применяется для того, чтобы изобразить несколько графических образов на одной картинке. Использование plots[display] вместо with(plots), а затем display дает возможность не загружать целиком весь пакет plots в память. 2.10 Анимация (мультипликация) Кино (мультипликация, анимация) - это последовательность кадров, которые демонстрируются друг за другом. Хорошо продуманная анимация может очень помочь в понимании некоторых явлений. Кроме того, создавать анимации очень занятно. Пусть, например, голубой шарик вылетит из красного конуса. Начнем с картинки, которую мы нарисовали перед этим: > icecream:=cone([0,0,-1],0.7,color=red), sphere([0,0,.1],0.6,color=blue): plots[display](icecream, scaling=constrained); Это первый кадр нашего кино. Что же должно меняться для того, чтобы шарик вылетел из конуса? Разумеется, координата z центра шарика. Определим наш кадр так: > frame := t -> plots[display](cone([0,0,-1],0.7,color=red), sphere([0,0,t],0.6,color=blue), scaling=constrained); frame := tplotsdisplay ( cone( [ 0, 0, -1 ], .7, colorred ), sphere( [ 0, 0, t ], .6, colorblue ), scalingconstrained ) 28 > frame(2); Теперь, для того, чтобы отчетливо видеть шарик, мы должны изменить ориентацию графических объектов в пространстве и ввести оси координат: > frame := t -> plots[display](cone([0,0,-1],0.7,color=red), sphere([0,0,t],0.6,color=blue), scaling=constrained,axes=boxed,orientation=[50,70]); frame := tplotsdisplay ( cone( [ 0, 0, -1 ], .7, colorred ), sphere( [ 0, 0, t ], .6, colorblue ), scalingconstrained, axesboxed, orientation[ 50, 70 ] ) > frame(2); Теперь смонтируем кино, используя команду plots[display]с опцией (загляните в систему Help) insequence=true > plots[display](seq(frame(i/2),i=1..5),insequence=true, scaling=constrained); 29 Для запуска анимации активизируйте графическое окно щелчком мыши, а затем нажмите кнопку Play на появившейся рамке. 2.11 Как избежать ошибок Изучение Maple может оказаться очень трудным занятием, если пренебречь следующими советами. Есть некоторые типичные ошибки, которые появляются с самого начала и которые не возникают у тех, кто хорошо знаком с Maple. Поэтому, если вы знаете таких людей, то не пренебрегайте их подсказками. Вот несколько тезисов, которые могут оказаться полезными, если у вас что-то не ладится с рабочим листом, хотя, по- вашему мнению, все должно работать. ! После загрузки старого файла у вас появляются две альтернативы: выполнять последовательно команду за командой в каждой ячейке или исполнять рабочий лист целиком. Рекомендуется сначала проделать первое. ! Помните, что вы можете перевычислить каждую из ячеек в рабочем листе в любое время. Забыв про это перевычисление, сделанное вами же, вы будете изумляться, почему какая-то из ячеек не работает. Просто вы нарушили порядок вычислений. ! Помните, что для каждого слова Maple имеется страничка системы Help с примерами. Обращение к таким страничкам быстро решит ваши проблемы с синтаксисом. ! Одна из частых ошибок начинающих - отсутствие скобок при записи слов Maple. Например, написав > plot x^2; missing operator or `;` вы сделали синтаксическую ошибку, т.к. не поставили скобок. ! Приглашение Maple - это «>». Вы можете вводить команды только после этого значка, если хотите получить результат. ! Заканчивайте операторы Maple символами «;» или «:». Maple не заработает до тех пор, пока не дойдет до указанных символов. Помните, что Maple подавляет вывод, если ввод заканчивается двоеточием. Если вы не видите вывода, хотя он нужен вам, замените двоеточие точкой с запятой. Часто это приводит к успеху: > p := expand((a+b)^5): > p; 243 > q := expand((1+x)^9); q := 19 x36 x284 x3126 x4126 x584 x636 x79 x8x9 > q; 19 x36 x284 x3126 x4126 x584 x636 x79 x8x9 ! Когда вы сомневаетесь, поставьте скобки. Например, (x+3)/(x-3) очень отличается от x+3 / x-3: > (x+3)/(x-3), x+3/x-3; x3 1 , x3 3 x3 x ! Убедитесь, что ваши переменные - действительно переменные. Вы можете присвоить значение, скажем 3, некоторому x в предыдущей задаче. Для того чтобы сделать x снова переменной, напишите x:='x':. Если вы забудете об этом, могут твориться странные вещи. Один из способов избежать этого - держать исходные данные в отдельной ячейке ввода. > x := 3; 30 x := 3 > x := 'x'; x := x ! Используйте restart;. Набрав restart; в ячейке ввода и нажав клавишу [Enter], вы отмените все присвоения и начнете как бы «с чистого листа». Это решает массу проблем, но при этом вы должны перевычислить все необходимые вам ячейки ввода: > hello := yes; hello := yes > hello; yes > restart; > hello; hello ! Правильный ли тип апострофа вы используете? В Maple апостроф forward quote (') применяется для подавления расчета. Обратный апостроф (back quote - `) используется для образования надписей. Двойные кавычки (double quote - ") - для указания строковых переменных: > `this is a long name` := 12; this is a long name := 12 > `this is a long name`; 12 > check := "do not worry"; check := "do not worry" > check; "do not worry" ! Не забывайте заканчивать циклы do словом od, операторы if - словом fi, а процедуры - словом end. Если вы открываете цикл словом do, Maple не начнет работать пока не найдет слово od - конец цикла. То же относится к операторам if .. then ... fi; и proc ... end;. ! Нежелательный вывод (происходит вывод результатов, который вы не хотите видеть)? Используйте двоеточие вместо точки с запятой после оператора, который порождает ненужный вам вывод. ! Используйте printlevel:=10;, если вы хотите видеть, что делает Maple «за сценой», когда вы отдаете распоряжения. Если же вы хотите видеть еще больше, то используйте printlevel:=50 или еще больше. Однако, проверяя вывод при printlevel>1, вы можете обнаружить, что это портит ваш рабочий лист. Например: > unapply(x^2-100,x); xx2100 > printlevel:= 10; printlevel := 10 > unapply(x^2-200,x); {--> enter unapply, args = x^2-200, x x := [ x ] x := x op1 := xx2200 xx2200 <-- exit unapply (now at top level)=proc (x) options operator, arrow; x^2-200 end} xx2200 Замечание: не забудьте после этого вернуться к стандартному значению (default). 31 > printlevel:=1; printlevel := 1 ! Все ли слова, которые вы используете, определены? Выполнили ли вы ячейки ввода, содержащие нужные вам процедуры? Загрузили ли вы пакеты, содержащие нужные вам слова? Слова, которые не определены, выводятся Maple просто как имена. Напомним: используя слова из пакетов при определении процедур, пишите полное имя, т.е. используйте plots[display] вместо просто display: > thisword := proc(x) x^2 + 10 end; thisword := proc (x) x^210 end proc > thisword(3); 19 > restart; > thisword(3); thisword( 3 ) ! Используйте отладку (debug). Если вы определили слово, скажем thisword, и оно не выполняет то, что должно выполнять, вы можете обнаружить ошибку, написав debug(thisword); в ячейке ввода и нажав клавишу [Enter]. Тогда при повторном использовании этого слова, будут напечатаны промежуточные вычисления, необходимые для проверки: > thisword := proc(x) x^2 + 10 end; thisword := proc (x) x^210 end proc > debug(thisword); thisword > thisword(3); {--> enter thisword, args = 3 19 <-- exit thisword (now at top level) = 19} 19 Отменим отладку: > undebug(thisword); > thisword(3); 19 ! Хотите видеть определение слова? Скажем, вы хотите видеть, как работает слово plot. Напишите: > interface(verboseproc=2); > print(plot): proc () ... end proc 3 РЕШЕНИЕ ЗАДАЧ. ВВЕДЕНИЕ 3.1 Что такое задача? В нашем понимании задача - это то, что может быть сформулировано как вопрос, требующий при ответе на него применения математики. Основная польза от математики проявляется при решении задач, что одновременно является наилучшим путем изучения математики. Этой идеей объясняется присутствие контрольных вопросов и задач в конце каждого параграфа книг по математике. Например, при изучении основ алгебры авторы учебника останавливаются на решении линейных уравнений, а затем предлагают поупражняться таким образом: «решите уравнение 4 x 3 2 x 6 относительно x». 32 Задачи часто формулируются в начале раздела книги для мотивации методов, развиваемых авторами далее. Задачи обычно возникают в контексте. Если контекст вполне понятен, то задача может быть сформулирована или поставлена и может быть выработан метод ее решения. Из этого решения могут возникнуть другие задачи, требующие своего метода решения. Мы также будем придерживаться этой стратегии, рассматривая ее как часть процесса решения. 3.1.1 Этапы решения задачи Решение задач - процесс активный, но он иногда может сильно тормозиться вследствие недостатка знаний о том, что надо делать на следующем шаге после выполнения предыдущего. Поэтому полезно иметь план действий. В этом разделе такой план рассмотрен как перечень этапов, которые следует пройти, решая некоторую задачу: Постановка -Решение – Анализ. I этап - постановка задачи. Она, в свою очередь, включает в себя ряд шагов. Прежде всего, необходимо тщательно продумать задачу, обращая внимание на каждый элемент будущих операторов. Нарисовать схему расчетов. Это поможет вам правильно выбрать имена переменных и разработать структуру расчетного алгоритма. Отметить для себя все переменные и параметры задачи, среди которых различают: заданные (исходные), выходные (результирующие) и внутренние переменные и параметры. Перечислить или получить определяющие уравнения. II этап - решение уравнений. Это подразумевает превращение исходных величин в результирующие величины. Это шаг, на котором Maple особенно полезен. Очень легко погрязнуть в ручных вычислениях, после которых вы утратите всякий интерес к решению вашей задачи. Использование Maple поможет избежать этого. III этап - анализ решений. Что в полученных решениях отражает суть вашей проблемы? Что может быть отброшено? Все ли решения получены? Как же Maple поможет при реализации этого плана? В наибольшей степени, видимо, при самом решении. Постановка задачи, как математической проблемы, может быть выполнена только вами. Рассматривайте Maple как инструмент для получения и презентации решения таким, каким вы себе его представляете. 3.1.2 Задача о бассейне для плавания Очень важным в словаре Maple является слово solve, используемое для решения систем уравнений. Задача 1. Длина бассейна для плавания в три раза больше его ширины. Кроме того, его длина на 40 метров больше его ширины. Определить размеры бассейна. Решение: Пусть l и w - длина и ширина бассейна. Тогда первое условие задачи формулируется в виде уравнения l = 3w, а второе условие в виде l = w + 40. Нам нужно решить эти два уравнения одновременно относительно l и w. Сначала запишем сами уравнения: > eq1 := l = 3*w; eq1 := l3 w > eq2 := l = w + 40; eq2 := lw40 Затем решим эту систему относительно l и w. Мы можем это проделать, вычитая eq2 из eq1. Затем решим полученное уравнение относительно w (получим w = 20), затем подставим это значение в eq1 и получим l = 60 . Запишем это: > eq3 := eq1 - eq2; eq3 := 02 w40 33 > eq4 := lhs(eq3) - 2*w = rhs(eq3) - 2*w; eq4 := 2 w-40 > eq5 := -(1/2)*eq4; eq5 := w20 > eq6 := subs(eq5, eq1); eq6 := l60 > solution := {eq5,eq6}; solution := { w20, l60 } В то же время, слово solve выполняет приведенный выше алгоритм автоматически: > solve({eq1, eq2}, {l, w}); { w20, l60 } Итак, бассейн шириной 20 метров и длиной 60 метров. Знать слово solve очень полезно, но оно не является панацеей. Привлекая различные методы для решения уравнений различного типа, оно не всегда обеспечивает вам решение задачи. 3.2 Четыре метода решения уравнений Важно уметь решать задачи различными методами. Вот четыре из них. 3.2.1 Метод проб и ошибок (Guess and Сheck) Этот метод предполагает угадывание (прогноз) решения каким-либо образом и последующую проверку вашего прогноза. Например, предположим, что вы предварительно оцениваете размеры бассейна как 25 х 75 метров и хотите проверить вашу догадку (гипотезу). Используем для этого слово subs: > subs({w=25, l=75}, [eq1, eq2]); [ 7575, 7565 ] Ячейка ввода предписывает Maple подставить (substitute) 25 и 75 вместо w и l в eq1 и eq2. Внимание! Заметьте разницу в использовании круглых, квадратных и фигурных скобок. Фигурные заключают в себе элементы множества типа set, а квадратные - типа list. В первом из них порядок расположения элементов не важен и равные элементы считаются за один элемент; во втором - порядок элементов важен и все элементы учитываются. Глядя на ячейку вывода, нетрудно убедиться, что наша догадка не подтверждается. Мы удовлетворили первому уравнению, но не второму. Теперь если мы уменьшим величину w на 1, то мы должны уменьшить величину l на 3 для того, чтобы продолжать удовлетворять первому уравнению; но будем ли мы при этом точнее удовлетворять второму? Посмотрим: > subs({w=24,l=72},[eq1,eq2]); [ 7272, 7264 ] Да, немного лучше. Левая часть второго уравнения уменьшилась на 2 в пользу правой части. Мы могли бы продолжать этот процесс и дальше в надежде вполне удовлетворить обоим уравнениям, но давайте пока на этом остановимся. Вы можете выбрать этот способ решения уравнений. Тогда слово solve вам вовсе не понадобится. 3.2.2 Вручную, как бы с карандашом и бумагой Этот метод мы уже использовали при решении задачи о бассейне. С другой стороны, мы могли бы упростить уравнения, а затем использовать слово solve. Например, давайте решим уравнения eq1 и eq2 вручную. Тогда при использовании слова solve нам нужно будет решить лишь одно уравнение для одной неизвестной. Вот возможный путь действий: 34 > eq3 := subs(l=solve(eq1, l), eq2); eq3 := 3 ww40 > sol1 := w = solve(eq3, w); sol1 := w20 > sol2 := l = solve(subs(sol1, eq1), l); sol2 := l60 > sol := {sol1, sol2}; sol := { w20, l60 } 3.2.3 Графический метод решения Следующий путь решения уравнений - графический. В этом случае мы можем изобразить уравнения в виде линий, точка пересечения которых даст нам решение. Этот метод очень хорошо работает, являясь элементом графического калькулятора. Используем слово implicitplot: > with(plots): > implicitplot({eq1, eq2}, w=10..30, l=50..70); 3.2.4 Метод с использованием слова fsolve Еще один путь решения уравнений - это использование слова fsolve. Это слово привлекает методы решения уравнений в действительных числах. Если вы не укажете слову fsolve интервал, в котором следует искать решение, то вы получите лишь первое из найденных существующих решений. Это слово хорошо работает вместе со словом plot. Вы можете использовать последнее слово для определения интервала, на котором расположены корни - решения уравнений, а затем применить fsolve для получения «точного» ответа на ваш вопрос. Упражнение 9. Решите следующие системы уравнений. 2 2 1. x y 10 , y3 x 2. a 3 b c 10 , 2 a b 72 c 20 , 7 a 3 b 21 c 30 . 5 2 3. x 5 x 20 . Здесь используйте plot и fsolve . 4. x3 yza, 2 xy3 zb, 9 x3 y5 zc относительно x, y и z . Решите следующие задачи, приводя их к системам уравнений. Упражнение 10. Высота Эйфелевой Башни в Париже на 125 футов меньше, чем удвоенная высота Монумента Вашингтона. Высота последнего на 75 футов выше, чем Великая Пирамида Хеопса и на 105 футов выше, чем Собор Святого Петра в Риме. Найти высоту каждого сооружения в целых футах, если сумма их высот равняется 2510 футов. Упражнение 11. Большой стол для конференций должен быть сделан в форме прямоугольника с двумя полуокружностями на концах (см. рисунок). Найти размеры стола, зная, что площадь прямоугольной его части должна быть в два раза больше, чем сумма площадей скругленных частей, а периметр всего стола должен равняться 40 футам. 35 > > > > Вот рисунок к задаче: F:=plot([-cos(t)+1, sin(t)+1, t=Pi/2..-Pi/2]): G:=plot([cos(t)+6, sin(t)+1, t=Pi/2..-Pi/2]): H:=plot([[1,0], [6,0], [6,2],[ 1,2], [1,0]], style=LINE): plots[display]({F,G,H}, axes=none, scaling=constrained); Упражнение 12. Рабочий должен изготовить смесь из удобрений, оставшихся с лета. Имеется три типа удобрений, содержащих 30%, 20% и 15% азота соответственно. Когда он смешал все удобрения и проверил смесь на содержание азота, то обнаружил, что смесь весит 600 фунтов и содержит 25% азота. Сколько фунтов удобрений каждого типа он не использовал? Сколько решений имеет эта задача? Упражнение 13. Лестницы длиной 30 и 40 футов расположены в переулке так, что они как бы пересекаются (скрещиваются). Т.е. они наклонены к стенам противоположных домов, а опираются в основания стен на земле. Зная, что они пересекаются в точке, расположенной на высоте 10 футов от земли, определить ширину переулка. Упражнение 14. Придумайте свою собственную алгебраическую задачу, чтобы решить ее средствами Maple. Она может быть вариацией на тему одной из приведенных выше задач, но может быть и совершенно другой. 3.3 Еще немного о графиках Чтобы узнать больше о каком-нибудь пакете (в нашем случае plots), можно начать с изучения его состава: > with(plots); [ animate, animate3d, animatecurve, changecoords, complexplot, complexplot3d, conformal, contourplot, contourplot3d , coordplot , coordplot3d , cylinderplot, densityplot , display , display3d , fieldplot , fieldplot3d , gradplot , gradplot3d , implicitplot, implicitplot3d , inequal, listcontplot , listcontplot3d , listdensityplot , listplot , listplot3d , loglogplot, logplot, matrixplot, odeplot , pareto, pointplot, pointplot3d , polarplot, polygonplot, polygonplot3d , polyhedra_supported , polyhedraplot , replot, rootlocus, semilogplot, setoptions, setoptions3d , spacecurve, sparsematrixplot, sphereplot, surfdata , textplot, textplot3d , tubeplot ] Ранее мы уже использовали в задачах слова plot , implicitplot и display. Для того чтобы узнать больше об этих полезных командах, просто напишите так: > ?plot > ?implicitplot > ?display > ?textplot > ?animate или что-то другое, что может вас интересовать. Посмотрите в нижнюю часть страничек помощи, там приведены примеры (examples). Иногда лучшим учителем бываете вы сами. Учитесь, экспериментируя с этими и другими командами. 36 3.4 Введение параметра Одно из достоинств использования Maple при решении задач заключается в том, что можно вносить исправления в рабочие листы, возвращаться назад в вычислениях, менять значения параметров и анализировать соответствующее изменение решения. В самом деле, мы уже подошли к тому моменту, когда можно ввести какой-нибудь параметр (parameter) в задачу. Например, можно параметризовать задачу о бассейне, причем здесь мы имеем определенный выбор: заменить параметром число 3 или число 40. Давайте, заменим 3 на p. Задача 2. Длина плавательного бассейна в p раз больше его ширины. Она также на 40 метров больше его ширины. Каковы размеры бассейна в зависимости от p? Описать, как меняются размеры бассейна с изменением параметра p. Решение: Слово restart очистит все переменные, перезагрузив Maple. Воспроизведем уравнения из задачи 1, вводя p вместо 3 в eq1. > restart; > p := 'p'; p := p > eq1 := l = p*w; eq1 := lp w > eq2 := l = w + 40; eq2 := lw40 Решим уравнения относительно l и w, так же как ранее, но теперь решение будет зависеть от параметра p. > sol := solve({eq1,eq2},{l,w}); 1 p sol := { w40 , l40 } 1p 1p Отсюда нетрудно видеть, что с ростом p как w так и l уменьшаются. Кроме того, при приближении p к 1 справа, как l так и w возрастают. Во многих сложных ситуациях мы можем использовать графики для изучения поведения решения при изменении значений параметра. Напишем: > plots[animate]({p*w, w+40}, w=0..80, p=0..2); Употребление слова animate из пакета plots очень полезно при визуальном исследовании поведения решения рассматриваемой задачи. Запустите анимацию кнопкой play для того, чтобы убедиться в этом. Упражнение 15. Что произойдет с решением задачи о бассейне, если разница между длиной и шириной будет меняться? (Положить отношение ширины к длине постоянной.) Упражнение 16. Стол для конференций должен быть изготовлен в форме прямоугольника с двумя полуокружностями на концах (см. рисунок к упр.11). Найти размеры стола, зная, что площадь прямоугольной части должна быть в p раз больше суммы площадей закругленных концов, а периметр всего стола должен быть равен 40 футам. 37 Упражнение 17. Исследуйте решение задачи о смеси удобрений (упр.12). Измените какой-нибудь параметр и опишите, как при этом изменяется решение. Упражнение 18. Лестницы длиной 30 и 40 футов расположены в переулке так, что они как бы пересекаются. Т.е., они наклонены к стенам противоположных домов, а опираются в основания стен на земле. Зная, что они пересекаются в точке, расположенной на высоте h футов от земли, определить ширину переулка. 3.5 Ваши собственные слова в Maple 3.5.1 Создание процедур Настало время познакомиться с тем, как создавать и определять слова Maple в рабочем листе. Сама по себе идея очень проста. Начав решать задачу или разрабатывать алгоритм, присвойте заданным величинам подходящие на ваш взгляд имена. Поместите эти присвоения в одну ячейку ввода, которую мы будем называть ячейкой параметров (parameter cell). Используйте созданные имена в операторах Maple, составляющих ваш алгоритм. Старайтесь поместить все операторы в одну ячейку ввода, которую мы будем называть ячейкой определений (definition cell). Получите желаемый результат в ячейке вывода (output cell). Сделайте определение для процедуры, поместив его в верхней строке ячейки определений, вот так: name:=proc(p1,p2,...,pn). Такой строкой начинается определение посредством присвоения имени слова proc (процедура) и объявления входных параметров p1, p2, и т.д. Внизу ячейки определений располагается слово end;, которое указывает на конец определения. Теперь, когда вы выполните ячейку с процедурой, вы получите в выходном формате версию своих определений. Это не единственно возможная последовательность шагов, которой вы должны следовать, создавая свои определения, но она логична и прекрасно работает при создании небольших процедур. В качестве примера, предположим, что мы хотим определить слово swim, которое бы возвращало решение уже рассмотренной задачи о плавательном бассейне. Скопируем все ячейки ввода рассмотренного ранее алгоритма решения в одну. Тогда все, что нам остается сделать для определения слова swim - это вставить первую и последнюю строки определения процедуры. Вставляя первую строку, надо решить, что будет служить входными параметрами. Пусть у нас будет единственный параметр: отношение длины к ширине бассейна. Мы назвали его p в уравнениях, поэтому оставим это имя и в первой строке процедуры. Итак: > swim := proc(p) > eq1 := l = p*w; > eq2 := l = w + 40; > sol := solve({eq1, eq2}, {l, w}); > end; Warning, `eq1` is implicitly declared local Warning, `eq2` is implicitly declared local Warning, `sol` is implicitly declared local swim := proc(p) local eq1, eq2, sol; eq1 := lpw ; eq2 := lw40 ; sol := solve( { eq1, eq2 }, { l, w } ) end proc 38 Когда вы выполните ячейку ввода, содержащую определение, слово swim будет добавлено к словарю и может использоваться как любое другое слово Maple. Присвоения, сделанные в определении, заведомо объявляются локальными, т.е. справедливыми только внутри данной процедуры, поэтому системой генерируется предупреждение об этом до тех пор, пока вы не объявите свои переменные явно либо локальными (local) или глобальными (global). Обычно, как показывает практика, задаются локальные присвоения, чтобы избежать путаницы между внутренними (локальными) и внешними (глобальными) именами переменных. Вывод из созданного вами слова - это вывод из последней строки перед строкой содержащей слово end. Так, например, если длина бассейна в три раза больше его ширины, то p=3, и мы могли бы спросить: > swim(3); { l60, w20 } С другой стороны, что может случиться, если мы зададим глупый вопрос? Итак: > swim(-4); { w-8, l32 } Вы всегда можете переопределить слово, если это требуется. Например, только что рассмотренная задача не имеет разумного решения при p < 0, поэтому мы можем вставить предупреждение об ошибке (error trap): > swim := proc(p) > if not type(p,name) and not p > 0 then ERROR(`Oops!`) > else eq1 := l = p*w; > eq2 := l = w + 40; > sol := solve({eq1, eq2}, {l, w}); > fi: > end; Warning, `eq1` is implicitly declared local Warning, `eq2` is implicitly declared local Warning, `sol` is implicitly declared local swim := proc (p) local eq1, eq2, sol; if not ( type( p, name ) or 0p ) then ERROR( `Oops!` ) else eq1 := lpw ; eq2 := lw40 ; sol := solve( { eq1, eq2 }, { l, w } ) end if end proc Теперь проверим: > swim(-4); Error, (in swim) Oops! Обычно, разработчик алгоритма не тратит много времени на создание сообщений об ошибках. Ведь и без того есть много интересного, что можно получить с помощью математики. Например, предположим, что мы хотим изменить входные данные так, чтобы число 40, на которое периметр отличается от ширины, менялось при решении задачи. Назовем эту переменную excess. Скопируем определения процедуры в новую ячейку ввода и сделаем нужные изменения: > restart; > swim := proc (p,excess) local eq1, eq2, sol; eq1 := l = p*w; 39 eq2 := l = w+excess; sol := solve({eq1, eq2}, {l, w}) end; swim := proc (p, excess) local eq1, eq2, sol; eq1 := lpw ; eq2 := lwexcess; sol := solve( { eq1, eq2 }, { l, w } ) end proc Попробуем: > swim(3, 40); { w20, l60 } > swim(3, ex); 3 1 { l ex, w ex } 2 2 Заметьте, что теперь можно получить решение и в «словесной форме», т.е. в виде символов: если длина бассейна в 3 раза больше его ширины, то его ширина должна равняться 1/2 от величины excess, а длина - 3/2 от excess. 3.5.2 Визуальная проверка ответа Иногда бывает, что вы решили задачу неправильно, но не знаете об этом до тех пор, пока не проверите свое решение визуально, т.е. буквально - глядя на него. Рассматриваемый в этом пункте тип слов очень полезен для визуальной проверки вычислений Для того чтобы осуществить такую проверку для решения задачи о бассейне, мы можем сначала нарисовать следующую картинку. Положим, что размеры бассейна > dims := swim(3, 40); dims := { w20, l60 } Поэтому нам нужно нарисовать прямоугольник размерами 20 на 60. Положим, что левый нижний угол прямоугольника находится в начале координат, а правый верхний - в точке с координатами [l,w]. Напишем: > rect := [[0,0], [l,0], [l,w], [0,w]]; rect := [ [ 0, 0 ], [ l, 0 ], [ l, w ], [ 0, w ] ] > pool := subs(dims, rect); pool := [ [ 0, 0 ], [ 60, 0 ], [ 60, 20 ], [ 0, 20 ] ] > plots[polygonplot](pool, color=blue, style=patch, scaling = constrained); Теперь определим нужное нам слово. Для этого скопируем и объединим подходящие ячейки ввода, затем вставим заголовок процедуры с входными параметрами, а после добавим строку конца процедуры внизу: > drawpool := proc(p, excess) dims := swim(p, excess); rect := [[0,0], [l,0], [l,w], [0,w]]; pool := subs(dims, rect); 40 plots[polygonplot](pool, color=blue, style=patch, scaling = constrained); end; Warning, `dims` is implicitly declared local Warning, `rect` is implicitly declared local Warning, `pool` is implicitly declared local drawpool := proc (p, excess) local dims , rect, pool; dims := swim( p, excess ) ; rect := [ [ 0, 0 ], [ l, 0 ], [ l, w ], [ 0, w ] ] ; pool := subs( dims , rect ) ; plots[ polygonplot ]( pool, colorblue, stylepatch, scalingconstrained ) end proc Проверим: > drawpool(3, 40); Теперь можно сделать анимацию процесса изменения размеров бассейна при изменении переменной excess и/или отношения его длины к ширине. Создадим список вывода из слова drawpool (назовем его, скажем, movie, т.е. кино), а затем используем plots[display] с опцией insequence = true: > movie := [seq(drawpool(3, 10*i), i=1..8)]: > plots[display](movie, insequence=true); Это кино показывает, что размеры бассейна линейно возрастают с ростом значения excess, что, однако, о нам уже известно. Тем не менее, часто можно получить очень много сведений из такого рода кино, если оно создается опытным исследователем. Упражнение 19. Создайте анимацию изменения бассейна при изменении параметра p от 1 до 4 с шагом 1/2. Упражнение 20. Что неправильно в записи команды «swim», с целью получения результата, при записи в первой строке процедуры swim:= proc(p,w)? Упражнение 21. Измените процедуру drawpool так, что если p > 2, то цвет бассейна голубой, иначе - красный. Упражнение 22. Определите слово quadform так, что на входе задаются три числа a, 2 b, c, а на выходе получаются корни квадратного уравнения a x b xc0 , если 41 они действительные, и сообщение «no real roots», если они комплексные. Не используйте слово solve. Упражнение 23. Измените слово swim так, чтобы оно просто возвращало точку [l,w], но не решало уравнений. Упражнение 24. Определите слово, которое по некоторой функции табулировало бы ее значения на заданном интервале с заданным шагом аргумента x. 4 ЕЩЕ ЗАДАЧИ В этом разделе приведено еще несколько задач с решениями, сопутствующих упражнений и вопросов для вашей проверки. Ни одна из этих задач не потребует применения ручных вычислений. Возможно, что из этого материала вы почерпнете некоторые идеи. 4.1 Задача о биллиардном шаре Задача 3. Белый шар находится на расстоянии два фута от борта биллиардного стола. Игрок хочет попасть этим шаром, отразив его от борта, в красный шар, расположенный в трех футах от того же борта. Найти угол, под которым игрок должен послать белый шар, если расстояние между шарами вдоль борта равно пяти футам. Решение: Сначала нарисуем картинку и определим неизвестные. Ось х можно направить вдоль борта стола, полагая, что белый и красный шары расположены в точках (0,2) и (5,3) соответственно. Будем полагать, что шар отразится от борта в точке (x,0). Угол падения (0,2)(x,0)-(0,0) должен быть равен углу отражения (5,0)-(x,0)-(5,3). Можно вычертить несколько возможных траекторий, но только одна из них будет удовлетворять указанному свойству. Итак: > cue := [0,2]: red := [5,3]: > path := x -> plot([cue, [x,0], red]) ; path := xplot( [ cue, [ x, 0 ], red ] ) > plots[display]([seq(path(i), i=0..5)], scaling=constrained); Мы должны выразить тангенс некоторого угла а двумя способами, получив два уравнения. Затем решим полученную систему уравнений относительно а и x: > eq1 := tan(a)=2/x; 1 eq1 := tan( a )2 x > eq2 := tan(a)=3/(5-x); 1 eq2 := tan( a )3 5x > sol := solve({eq1, eq2}, {a, x}); 42 1 sol := { x2, a } 4 Таким образом, игрок должен послать шар под углом 45 градусов. Это решение справедливо для конкретного случая. Если мы начнем изменять расстояние от белого шара до борта стола, то можно ожидать, что и угол будет меняться. Вот где пригодится параметризация. Мы можем параметризовать задачу несколькими способами. Например, зададим расстояние от белого шара до борта параметром h и вновь решим задачу. > eq1 := tan(a)=h/x; h eq1 := tan( a ) x > eq2 := tan(a)=3/(5-x); 1 eq2 := tan( a )3 5x > sol := solve({eq1, eq2}, {a, x}); h 1 3 sol := { x5 , aarctan h } h3 5 5 Теперь поставим вопрос так: Что происходит с углом при удалении шара от борта или при его приближении к борту? Шар удаляется от борта, когда параметр h увеличивается. Из полученных выражений видно, что в этом случае угол приближается к 90 градусам. С другой стороны, когда h приближается к нулю (шар приближается к борту), тогда угол приближается к значению arctg(3/5). > evalf(180/Pi*arctan(3/5)); 30.96375653 градусов. Упражнение 25. Определить слово drawbounce:=proc(h), которое в зависимости от параметра h (расстояния белого шара от борта) строит схему расположения на биллиардном столе белого и красного шаров, а также траекторию движения белого шара при его отражении от борта стола. Оставить остальные данные теми же, что и в исходной задаче. Упражнение 26. Использовать слово drawbounce для создания кино о том, что происходит с траекторией белого шара, когда он стартует из точки, которая сама постепенно приближается к борту стола. 4.2 Вариация на предыдущую тему Задача 4. Предположим, что противоположный борт биллиардного стола отстоит от оси х на четыре фута. Игрок хочет отразить белый шар дважды, прежде чем он ударится о красный шар. Под каким углом он должен направить шар к борту? Решение: Линия второго борта описывается уравнением у=4, и вторая точка соударения шара будет иметь координаты (x2,4). Заметьте, что угол отражения при первом ударе шара о борт стола равен углу падения при втором ударе, т.к. два борта параллельны. Поэтому мы имеем три возможности, чтобы выразить угол a в терминах x и x2: > eq1 := tan(a)=2/x; 1 eq1 := tan( a )2 x > eq2 := tan(a)=1/(5-x2); 1 eq2 := tan( a ) 5x2 43 > eq3 := tan(a)=4/(x2-x); 1 x2x Теперь решим уравнения относительно x, x2 и a: > solve({eq1, eq2, eq3}, {x, x2, a}); 7 10 30 { aarctan , x , x2 } 7 7 5 > evalf(convert(arctan(7/5), degrees)); 54.46232221 degrees Итак, игрок должен направить шар к борту под углом около 54.5 градусов. Сравнив этот результат с соответствующим результатом из первой задачи, нетрудно заметить, что угол должен быть больше 45 градусов, если шар должен отскочить дважды от бортов стола. Упражнение 27. Каков должен быть рассматриваемый угол, если белый шар сначала ударится о борт, описываемый в задаче 4 уравнением у=4? eq3 := tan( a )4 4.3 Задача о баке с водой Задача 5. Предположим, что вы находитесь в точке пространства с координатами (0,0,4), т.е. на оси z, и смотрите вниз в направлении оси x. Сферический бак для воды с диаметром в две единицы длины расположен так, что его центр находится в точке (0,0,0) в начале системы координат. Вы не можете видеть точки на оси x, расположенные около точки (0,0,0), т.к. на пути луча зрения находится бак, но вы можете видеть другие точки на оси x. Так, например, прямая, соединяющая точку (10,0,0) с точкой (0,0,4), не касается бака (так ли это?), поэтому вы можете видеть эту точку. Спрашивается, какова ближайшая точка (a,0,0) на положительной полуоси x, которую вы можете видеть из точки наблюдения (0,0,4)? Решение: Пусть (c,0,d) - точка на поверхности бака, через которую проходит касательная, соединяющая точки (0,0,4) и (c,0,d). Поэтому треугольник с вершинами (0,0,0), (c,0,d) и (0,0,4) - прямоугольный. Из теоремы Пифагора следует: > eq1 := c^2 + d^2 + c^2 + (d-4)^2 = 4^2; eq1 := 2 c2d 2( d 4 )216 Кроме того, можно записать: > eq2 := c^2+d^2=1; eq2 := c2d 21 Поскольку три точки (a,0,0), (c,0,d) и (0,0,4) принадлежат одной прямой, то > eq3 := (d-0)/(c-a)=4/(-a); d 1 eq3 := 4 ca a Решим эти уравнения: > solve({eq1, eq2, eq3}, {c, d, a}); 1 15 { d , a4 RootOf( 15 _Z 21 ), c RootOf( 15 _Z 21 ) } 4 4 4 Нетрудно убедиться, что a - наименьшее положительное число, т.е. именно та 15 ближайшая точка на оси х, которую наблюдатель сможет увидеть из точки наблюдения (0,0,4). 44 Для большей ясности, мы можем нарисовать картину расположения наблюдателя, бака с водой и луча зрения от наблюдателя до оси х: >tank := plot3d(1, theta=0..2*Pi, phi=0..Pi/2, coords=spherical): >lineofsight := plots[polygonplot3d]([ [0,0,4],[4/sqrt(15),0,0]], thickness=2, color=black): > plots[display]([tank, lineofsight], scaling=constrained, axes=boxed); Упражнение 28. Предположим, что вы находитесь в точке (0,0,h) на оси z и смотрите в положительном направлении оси х. Какова ближайшая точка на оси х, которую вы сможете увидеть? Где вы находитесь, если вы можете видеть точку (10,0,0)? Вопрос: Что изменится в решении, если заменить сферический бак на бак в форме па2 раболического цилиндра, скажем z1x ? 4.4 Задача о лестнице Задача 6. Основание лестницы расположено в точке (3,0). Лестница наклонно опира2 ется на холм параболической формы y3x . В какой точке лестница пересечет ось y? Решение: Рисуем картинку, изображающую холм и лестницу. Отмечаем точку (0,a), где лестни2 ца пересекает ось y. Отмечаем точку касания лестницей холма ( b, 3b ). Мы вычислили бы а, если бы знали угол наклона лестницы. Поэтому возьмем точку, близкую к точке 2 2 ( b, 3b ) на холме. Пусть это будет ( bh, 3( bh ) ) , где h очень маленькое число, но не нуль. Приблизительный угол наклона лестницы равен углу наклону прямой, проходящей через две указанные точки. Запишем приближенное выражение для этого угла. Затем вычислим предельное значение угла, устремляя h к нулю, т.е. когда точка 2 2 ( bh, 3( bh ) ) приближается к точке ( b, 3b ) на параболе. Итак, запишем: > f := x -> 3 - x^2; f := x3x2 > approxslope := (f(b+h) - f(b)) / ((b+h) - b); ( bh )2b2 approxslope := h > approxslope := simplify(approxslope); approxslope := 2 bh > slope1 := limit(approxslope, h=0); slope1 := 2 b 45 Но искомый угол также равен углу наклона прямой, проходящей через точки (3,0) и 2 ( b, 3b ): > slope2 := (3-b^2)/(b-3); 3b2 slope2 := b3 Приравняем эти углы и решим уравнение относительно b: > sol := solve(slope1=slope2, b) ; sol := 3 6 , 3 6 Какое из решений нас устраивает? Должно быть, наименьшее (почему?). После того, как мы поймем это, найдем a, определив, где лестница пересекает ось y: > b := min(sol); b := 3 6 > ladder := x -> slope2*(x-b) + f(b); ladder := xslope2 ( xb )f( b ) > a:= ladder(0); 1 a := ( 3( 3 6 )2 ) 6 ( 3 6 )3( 3 6 )2 6 > simplify(a); 6 6 18 > evalf(a, 4); 3.303 Изобразим ситуацию: > plot({f, ladder}, 0..3, color=black); 4.5 Еще задача о лестнице Задача 7. Лестница длиной 5 футов опирается на холм, форма которого задана зави2 симостью y3x . Основание находится на положительной полуоси х, а вершина - на оси y. Описать расположение лестницы, фиксируя координаты ее концов, как указано выше. Замечание: Эта задача может иметь два различных решения. Нарисовать схему расположения лестницы в двух случаях. Решение: Сначала определимся с холмом. Лестница опирается на холм в точке ( b, f(b) ) и является касательной к холму в этой точке. Согласно нашим предыдущим вычислениям, наклон лестницы в этой точке равен –2b. Итак: > restart; > f := x->3-x^2; 46 f := x3x2 > slope := -2*b; slope := 2 b Теперь можем определить значение функции, касательной к холму в точке (b, f(b)). Это и определит положение лестницы. > tang := x -> -2*b*(x-b)+ f(b); tang := x2 b ( xb )f( b ) Затем определим координаты пересечения лестницы с осями x и y, назовем их xb и yb: > xb := solve(tang(x)=0,x); 1 b23 xb := 2 b > yb := tang(0); yb := b23 Длина лестницы 5 футов. Это условие порождает уравнение для определения b: > eq1 := xb^2+yb^2=5^2; 2 2 1 ( b23 ) 2 eq1 := ( b 3 ) 25 4 b2 Поработаем с этим уравнением: > eq2 := expand(4*b^2*simplify(eq1)); eq2 := 25 b44 b642 b29100 b2 > eq3 := lhs(eq2)-rhs(eq2); eq3 := 25 b44 b658 b29 Теперь нам нужно найти корни уравнения eq3, т.е. те точки, в которых график eq3=0 пересекает ось b. Нарисуем этот график сначала на интервале b=0..3, а затем сузим интервал до b=0..1.7. > plot(eq3, b=0..1.7); Действительно, задача имеет два решения: возможны высокое положение и низкое положение лестницы. Решим задачу аналитически: > sol := fsolve(eq3, b, 0..1.5); sol := .4093966141, 1.289029267 Настало время изобразить холм и лестницу в двух положениях: > plot({f, subs(b=sol[1], op(tang)), subs(b=sol[2], op(tang))}, 0..4, 0..5, color=black); 47 4.6 Вариация на предыдущую тему Задача 8. Предположим, что в предыдущей задаче мы уменьшаем длину лестницы. Можно представить себе, что по мере того, как длина лестницы уменьшается, ее концы, расположенные на осях х и у, сближаются до тех пор пока не совпадут. Какова минимальная длина лестницы, которая может опираться на холм так, что ее концы остаются на осях координат? Решение: 2 2 Вернемся к решенной нами задаче и посмотрим на выражение xb yb . Оно представляет собой квадрат длины лестницы. Все, что нам нужно сделать, - это нарисовать график функции представляющей собой квадратный корень из последнего выражения на интервале b=0..3 и найти самую низкую точку графика - его минимум: > plot(sqrt(xb^2+yb^2), b=0..3, y=0..20); Значение y в этой точке и определяет минимальную длину лестницы при заданных условиях (около 4.3 фута). 5 ДИФФЕРЕНЦИРОВАНИЕ И ЕГО ПРИМЕНЕНИЕ В предыдущем разделе рассматривались задачи о касательной, которые мы решали, 2 находя предел отношения. Для функции f( x )x 10 мы нашли, что угловой коэффициент касательной к графику функции f (х) в точке (b, f(b)) равен 2b. Определим функцию, f( x )2 x . Известно, что производная называемую производной функции f(х), как x функция служит мерой скорости изменения функции f(х). Именно это свойство производной имеет огромное прикладное значение во многих областях знаний. В этом разделе мы 48 начинаем использование дифференцирования (нахождения производных функций) в решении задач, связанных со скоростью изменения тех или иных величин. 5.1 Определяем производные Слово Maple limit может быть использовано для вычисления производных по 2 определению. Скажем, f( x )x x3 , и вы хотите вычислить производную этой функции, т.е. f '(х) через ее определение. Тогда введите > f := x -> x^2 + x -3; f := xx2x3 > fp := limit((f(x+h)-f(x))/h, h=0); fp := 2 x1 Вы получите то же самое, написав > fp := diff(f(x), x); fp := 2 x1 Здесь мы использовали слова diff и limit, но на практике вы будете использовать первое из них гораздо чаще. Производные функций определяются через выражения. Так, например, для функции > y := x^2 + x; y := x2x ее производная вычислится так: > yp := diff(y, x); yp := 2 x1 Теперь вычислим производную функции y в точке х=3, используя слово subs: > subs(x=3, yp); 7 Другой путь получить тот же результат - это использовать unapply, слово Maple для превращения выражения в функцию. > yp:=unapply(yp, x); yp := x2 x1 > yp(3); 7 Еще один путь - использование оператора D (D-operator), который для функции f вычисляет ее производную (df) следующим образом: > f := x -> x^2 + x; f := xx2x > df := D(f); df := x2 x1 > df(3); 7 5.2 Пакет student Maple содержит пакет слов, называемый student package - пакет для студентов, который облегчает изучение техники вычислений. Настало время опробовать некоторые из слов этого пакета. Чтобы загрузить этот пакет, введите: > with(student); Warning, new definition for slope 49 [ D, Diff, Doubleint, Int, Limit , Lineint, Product, Sum, Tripleint , changevar, combine, completesquare, distance, equate, extrema, integrand , intercept, intparts , isolate, leftbox, leftsum, makeproc, maximize, middlebox, middlesum , midpoint , minimize, powsubs, rightbox, rightsum, showtangent, simpson, slope, summand, trapezoid , value ] Одно из интересных слов, на которое мы обратим внимание - showtangent (показать касательную). Задайте этому слову функцию и точку, в которой должна быть определена касательная, и оно покажет вам картинку с графиком функции и касательной к нему в 3 заданной точке. Так, чтобы увидеть график функции yx x1 и касательную к нему при x = 4.5, введите: > showtangent(x^3+x-1, x=4.5, color=black); Упражнение 29. Использовать слова unapply и D для определения производной от f(x). Нарисовать графики f(х) и ее производной на интервале [-1..1], если: > f := x->x^4 - 2*x^3 + x -3 ; f := xx42 x3x3 > df := D(f); df := x4 x36 x21 > plot({f, df}, -2..2); Упражнение 30. а) Используйте слова for x from -1 by .25 to 2 do для табуляции значений некоторой функции f(х) и ее производной с шагом 0.25 на интервале от -1 до 2. б) Нарисуйте функцию f(х) и ее производную на этом интервале. Затем используйте слово showtangent для изображения f(х) и касательную к графику при х=-5. в) Где f(х) пересекает ось x? Найдите нули производной f '(x). Иными словами, найдите экстремумы f(х). 50 5.3 Метод Ньютона Мы уже использовали слово fsolve для решения уравнения f( x ) 0 относительно x. Как работает это слово? Возможно, что оно использует метод Ньютона (Newton's method), который работает очень быстро, если функция f (х) дифференцируема. Идея этого метода очень проста. Предварительно нарисовав функцию или просто наугад, вы даете первую оценку решению, назовем ее x0. Скорее всего, точка (x0, f(x0)) не лежит на оси x (в противном случае x0 сразу окажется решением). Поэтому мы проведем касательную в этой точке к графику функции f(х) до ее пересечения с осью x, например, в точке (x1, 0). Нетрудно видеть, что x1 можно выразить через x0, f(x0) и f '(x0). Это число x1 и является вторым приближением к решению. Итак: > restart; > eq := diff(f(x0), x0) = (f(x0)-0)/(x0-x1); eq := f( x0 ) f( x0 ) x0 x0x1 > expand(solve(eq, {x1})); x1x0 f( x0 ) f ( x0 ) x0 Это соотношение и является основой метода Ньютона. Главное его свойство заключается в том, что его можно итерировать, т.е. после вычисления x1 вы называете его x0 и применяете метод снова. Эти итерации продолжают до тех пор, пока последовательность получаемых чисел сойдется или станет ясно, что она не сойдется. Ниже приведена версия метода Ньютона, которая иллюстрирует так называемый ступенчатый процесс вычислений. Последнее вычисленное значение показано над графиком. > vnewt := proc(f, start, a, b, iterations) local i, x0, fp, p, pl1, pl2; x0 := evalf(start); fp := D(f); p := [x0,0]; for i from 1 to iterations do p := p, [x0, f(x0)]; x0 := x0 - f(x0)/fp(x0); p := p, [x0, 0]; od; pl1 := plot( [p], x=a..b, color=black); pl2 := plot(f, a..b, color=red) ; ### WARNING: semantics of type `string` have changed plots[display]([pl1, pl2], title=convert(x0, string)); end: 2 Теперь проверим слово vnewt на решении уравнения x 2 , начиная со значения x0=10 и изображая процесс итераций на интервале от 0 до 10. > vnewt(x -> x^2 - 2, 10 , 0, 10, 5); 51 Упражнение 31. Примените слово vnewt для решения уравнения cos( x )x0 относительно x для различных начальных значений x0 от 2 до 3.05. Есть ли среди этих значений такие, которые не приводят к решению? Объясните свой ответ. 2 Упражнение 32. Примените слово vnewt для решения уравнения x .010 . Попробуйте начать со значений 0.2, -0.3 и 0.3. Что происходит? Упражнение 33. Определите новую версию слова vnewt, а именно tnewt, которое имеет тот же набор входных данных, но возвращает список последовательных приближений к корню. Проверьте работу этого слова. 5.4 Производные и графики функций Имеется тесная связь между первой, второй производными дифференцируемой функции f(х) и тем, как выглядит ее график. Локальные (местные) экстремумы - максимумы и минимумы функции - лежат между критическими точками (critical point), т.е. между нулями первой производной f`(х), а точки перегиба лежат между нулями второй производной f ''(х). Кроме того, f(х) возрастает (убывает) на том интервале, где f'(х) положительна (отрицательна), и f(х) выпукла (вогнута) на интервалах, где f ''(х) положительна (отрицательна). Например, рассмотрим функцию > y := (x^5-1)/(6*x^2+1); x51 y := 6 x21 Сначала построим ее график на интервале, скажем от -2 до 2: > plot(y, x=-2..2); 52 Посмотрите внимательно на график и оцените координаты локальных экстремумов и точек перегиба (inflection points). А теперь уточним координаты этих точек, используя вычисления. Сначала вычислим производную y по x: > yp := diff(y, x); x4 ( x51 ) x yp := 5 12 2 6 x21 ( 6 x21 ) > yp := simplify(yp); yp := x ( 18 x55 x312 ) 2 ( 6 x21 ) Найдем критические точки, решая уравнение yp 0 . Мы получим разумный результат, полагая числитель yp равным 0: > cp := fsolve(numer(yp), x); cp := -.8657650194, 0 Итак, cp - это последовательность выражений для двух критических точек, cp[1] и cp[2]. Рассматривая график, мы можем видеть, что cp[1] - локальный максимум, а cp[2] - локальный минимум. Оценим величину y при xcp1 и при xcp2 : > subs(x = cp[1], y); -.2703889018 > subs(x = cp[2], y); -1 Мы узнали координаты экстремумов на графике. Теперь давайте получим координаты точек перегиба. Найдем вторую производную функции y(x): > ypp := diff(yp, x); 18 x55 x312 x ( 90 x415 x2 ) x2 ( 18 x55 x312 ) ypp := 24 2 2 3 ( 6 x21 ) ( 6 x21 ) ( 6 x21 ) > simplify(ypp); 54 x727 x55 x354 x23 4 3 ( 6 x21 ) > pip := fsolve(numer(ypp), x); pip := -.2324164053, .2392938071, .8746375912 Теперь найдем точки перегиба: > for i from 1 to 3 do print(pip[i], subs(x=pip[i], y)) od; -.2324164053, -.7557396749 .2392938071, -.7437022342 .8746375912, -.08732685718 Итак, мы видим, что имеется три точки перегиба. Упражнение 34. Всегда ли имеется точка перегиба функции между точками экстремума? Объясните свой ответ. Упражнение 35. Всегда ли точка экстремума находится между точками перегиба функции? Объясните свой ответ. 53 5.5 Неявное дифференцирование Предположим, вы имеете кривую на плоскости, которая определена заданием уравнения вида f( x, y ) 0 . Если (x0, y0) - точка на кривой, т.е. f( x0, y0 ) 0 , то можно задаться вопросом об уравнении касательной к этой кривой в данной точке. Один из способов определения углового коэффициента касательной состоит в следующем. Предположим, что y есть функция x в окрестности (x0, y0). Тогда вблизи этой точки функция f(x,y(x)) постоянна и равна нулю. Поэтому, когда мы продифференцируем f(x,y(x)) по x, то получим функцию от x, равную нулю. Но эта функция будет линейной от y'(x). Это означает, что мы можем выразить y'(x) через x и y(x). Проделав это в точке (x0, y0), получим искомый угловой коэффициент. Этот алгоритм известен как неявное дифференцирование (implicit differentiation). 2 3 Задача 9. Изобразить уравнение x sin( x y )y 50 в прямоугольнике x=0..4, y= 0..2 и нарисовать зависимость углового коэффициента касательной к графику в точке (3, y0) при изменении y0 между 0 и 0.6. Решение: Сначала нарисуем заданную кривую, используя plots[implicitplot]: > plots[implicitplot](x^2*sin(x*y)+y^3-5 = 0, x=0..4, y=0..2); Теперь необходимо найти нужное нам значение y0. Используем для этого fsolve : > y0 := fsolve(3^2*sin(3*y)+y^3-5=0, y, 0..(.6)); y0 := .1960083344 А теперь получим формулу для y'(x). Сначала подставим y(x) вместо y: > g := subs(y=y(x), x^2*sin(x*y)+y^3-5=0) ; g := x2 sin( x y( x ) )y( x )350 Затем продифференцируем полученную функцию по x: > dg := diff(g, x); dg := 2 x sin( x y( x ) )x2 cos( x y( x ) ) y( x )x y( x ) 3 y( x )2 y( x ) 0 x x Заметьте, что левая часть этого соотношения линейна относительно y'(x), как мы и предполагали. Решим это уравнение относительно y'(x): > yp := solve(dg, diff(y(x), x)); x ( 2 sin( x y( x ) )x cos( x y( x ) ) y( x ) ) yp := x3 cos( x y( x ) )3 y( x )2 Теперь обратим это в выражение относительно x и y: 54 > yp := subs(y(x)=y, yp); x ( 2 sin( x y )x cos( x y ) y ) x3 cos( x y )3 y2 Вычислим угловой коэффициент касательной в точке (3, y0): > slope :=evalf(subs({x=3, y=y0}, yp)); slope := -.2124017133 Запишем уравнение касательной в форме прямой, проходящей через заданную точку: > tangent := y - y0 = slope*(x-3); tangent := y.1960083344.2124017133 x.6372051399 Зададим отдельно кривую и касательную, отметив их разными цветами. Затем изобразим их: > curve :=plots[implicitplot]( x^2*sin(x*y)+y^3-5 = 0, x=0..4, y=0..2, thickness=2): > tanline := plots[implicitplot]( tangent, x=0..4, y=0..2, thickness = 2, color=blue): > plots[display]([curve, tanline]); yp := Упражнение 36. Найти такую точку на кривой, показанной на рисунке, где касательная является вертикальной. Указание: нужно положить x функцией y и дифференцировать по y. 5.6 Задачи на максимум и минимум Существует большое число задач подпадающих под категорию так называемых задач на максимум и минимум (max-min problems). Это задачи, в которых некоторая величина Q должна быть максимизирована или минимизирована должным образом. Величина Q полагается функцией одной или нескольких переменных, на которые наложены ограничения. Попробуем использовать эти ограничения для того, чтобы перейти при вычислении Q от нескольких к одной переменной. Если мы достигнем желаемого, то сможем применить численные методы для выделения точки максимума или минимума Q, разумеется, при условии ее существования. Рассмотрим пример. Задача 10 (о складывании листа бумаги). Лист бумаги 4 дюйма шириной и 8 дюймов длиной складывается так, что его нижний правый угол попадает на левый край. Эта точка находится не дальше, чем на расстоянии 4 дюйма от нижнего края листа. Затем, бумага обрезается по линии сгиба (см. рисунок). Найти длину L этой линии и найти, как сложить бумагу так, чтобы L была минимальной. Решение: Обозначим через h, x и y размеры, показанные на диаграмме внизу: > restart; 55 > A1:=plots[textplot]({[2.6,1.9,'L'],[3.7,2,'h'],[.1,1.1,`y`], [.5,.3,`x`],},align=RIGHT): A3:=plot({[[0,0],[0,8],[4,8],[4,4.45],[1.219,0],[0,0]],[[4,4.45], [0, 2.5],[1.219,0]]},color=blue): > A4:=plot([[4,4.45],[4,0],[1.219,0]],color=red): > A5:=plots[polygonplot]([[4,4.45],[0,4.45],[0,2.5]],style=patch, color=tan): > plots[display]([A1,A3,A4,A5],axes=boxed,scaling=constrained); Мы можем получить несколько уравнений, связывающих x, y, h и L на диаграмме. Например, маленький прямоугольный треугольник со сторонами x и y имеет гипотенузу длиной 4-x. Отсюда следует уравнение eq1: > eq1 := y^2+x^2=(4-x)^2; eq1 := y2x2( 4x )2 Уравнение eq2 следует из второго прямоугольного треугольника с гипотенузой L и сторонами h и 4-x: > eq2 := L^2 = (4-x)^2 + h^2; eq2 := L 2( 4x )2h 2 Кроме того, нетрудно видеть, что прямоугольный треугольник с гипотенузой h и сторонами 4 и h-y подобен аналогичному треугольнику с гипотенузой 4-x и соответственно сторонами y и x. Итак, имеем уравнение eq3: > eq3 := 4/(h-y)=y/x; 1 y eq3 := 4 hy x Теперь найдем: > h := solve(eq3, h); 4 xy2 h := y > x := solve(eq1, x); 1 x := y22 8 > L := unapply(sqrt(op(2, simplify(eq2))), y); 1 L := y 8 ( 16y2 ) y2 3 56 Итак, мы имеем зависимость L от единственной переменной y. Нарисуем график, чтобы увидеть как меняется L при изменении y: > plot(L, 2..4); Видим, что имеется минимум около точки L 5.2 дюйма. При этом y 2.8 (в дюймах, приблизительно). Мы можем получить и более точное значение, применив слово fsolve, располагая x между 2.6 и 3, где производная нашей функции равна нулю: > y1 := fsolve(diff(L(y), y), y, 2.6..3); y1 := 2.828427125 А теперь проверим значения x и L для этого значения y: > minL := L(y1); minL := 5.196152423 > minx := subs(y=y1, x); minx := 1.000000000 Заметьте, что minx имеет целое значение, равное 1. Отсюда становится ясно, как физически решить эту задачу: отмерить от левого края листа расстояние в 1 дюйм, а затем, удерживая в этой точке лист, совместить правый нижний угол листа с левым краем, сгибая при этом сам лист. Упражнение 37. Используйте Maple для изображения на диаграмме минимальной длины сгиба листа из предыдущей задачи. Упражнение 38. Предположим, что мы хотим минимизировать L+y, а не L. Будет ли находиться минимум в той же самой точке? Покажите это. 6 ЕЩЕ ЗАДАЧИ НА МАКСИМУМ И МИНИМУМ 6.1 Неожиданные (max-min) - задачи Иногда в процессе решения задачи, которая вовсе не является задачей на максимум или минимум, вычислитель может столкнуться с проблемой, связанной с нахождением экстремума. Стоит, например, взять задачу, в которой надо вычислить некоторую величину, зависящую от других величин. Определите одну из этих величин как переменную, получите формулу, выражающую результирующую величину как функцию выбранной переменной. И тогда вы сможете исследовать поведение этой функции в Maple с помощью слов plot и diff, выявляя ее экстремальные значения. Вот пример такой задачи. Задача 11 (о лестнице). Лестница длиной 20 футов опирается о верхний край балконной рамы таким образом, что ее вершина покоится на стене дома, а основание стоит на земле. Верхний край балконной рамы отстоит от стены дома на 3 фута и расположен на высоте 12 футов над землей. На каком расстоянии от земли находится вершина лестницы? Решение: Изобразим эту ситуацию и посмотрим на рисунок. > restart; 57 > with(plots): > A1:=plot({[[0,15],[0,-1]],[[0,12],[3,12],[3,4],[0,4]]}, color=navy): >A2:=plot({[[-1,0],[16,0]],[[0,14.937],[15.257,0]]},color=black): > A3:=textplot({[-.5,13,'h'],[8,8,'d'],[-.75,6,`12`], [1.5,11.25,`3`]}): > display({A1,A2,A3},axes=none,scaling=constrained,style=line); Параметризуем задачу, заменив длину лестницы параметром, скажем, d. Если направить ось х вдоль поверхности земли вправо, ось у вдоль стены дома вверх, а угол балконной рамы расположить в точке (3,12), то из подобия треугольников следует, что h/sqrt(h^2+3^2)=(h+12)/d, где h+12 - ордината точки, в которой лестница упирается в стену дома. Напишем уравнение и упростим его: > restart; > eq := h^2/(h^2+9) - (h+12)^2/d^2; h2 ( h12 )2 eq := 2 h 9 d2 Немного поработаем с уравнением eq: > eq := (collect(numer(normal(eq)),h)); eq := h 424 h 3( 153d 2 ) h 2216 h1296 Если мы разрешим это уравнение относительно параметра d как функции переменной h, то получим: > sol := [solve(eq, d)]; h 29 ( h12 ) h 29 ( h12 ) sol := , h h Поскольку нас интересует положительное значение d, то выберем и изобразим графически sol1 plot(sol[1], h=3..7); 58 Анализ графика показывает, что существует максимум два решения задачи. Действительно, при правильном понимании ситуации: 1) возможны два положения лестницы, если она слишком длинная; 2) нет ни одного искомого положения, если лестница слишком короткая; 3) есть только одно положение, если лестница имеет нужную длину. Эта длина чуть меньше 20 футов, как видно из графика. Мы можем легко определить эту величину. > hmin := fsolve(diff(sol[1], h), h, 4..5); hmin := 4.762203156 Она равна расстоянию от вершины лестницы до края балконной рамы. Искомая же величина d будет: > dmin := subs(h=hmin, sol[1]); dmin := 19.81098308 Именно так, как и говорилось, мы столкнулись с решением задачи на определение экстремума там, где и не ожидали этого. 6.2 Разные задачи Задача 12 (блуждающие критические точки). Для кубического полинома f( x )x3a x2x3 изобразите на одном рисунке несколько графиков при различных положительных значениях параметра a. Что происходит с локальными экстремумами и точками перегиба этой функции при увеличении a от 0 до бесконечности? Кроме того, попробуйте использовать слово animate для этой же задачи. Решение: Определим функцию и вычислим ее производные: > restart; > f:= x -> x^3 + a*x^2 - x + 3; f := xx3a x2x3 > fp := unapply(diff(f(x), x), x); fp := x3 x22 a x1 > fpp := unapply(diff(f(x), x, x), x); fpp := x6 x2 a Изобразим функцию при x = -6 .. 4 и a = 0 .. 5: plot({seq(f(x), a=0..5)}, x=-6..4); a := 'a': 59 График убеждает нас в том, что локальный максимум (крайняя левая критическая точка) движется влево и вверх. Другая критическая точка и точка перегиба кажутся неподвижными, хотя это может быть иллюзия. Вычислим координаты точек и найдем их предельные значения при a . Для этого сначала найдем x - координаты критических точек и точки перегиба: > cp := solve(fp(x), x); 1 1 1 1 cp := a a 23 , a a 23 3 3 3 3 > ip := solve(fpp(x), x); 1 ip := a 3 Видим, что при увеличении a cp1 и cp2 движутся к 0 и , соответственно: > limit(cp[1], a=infinity); 0 > limit(cp[2], a=infinity); Локальный минимум f(x) при приближении a к равен (0,3), а точки локального максимума и перегиба стремятся к ( , ), при этом точка перегиба расположена где-то посредине двух экстремумов. Наблюдать за поведением графика f(x) при возрастании а (например, от a 0 до a 10 ) используя слово animate довольно трудно. Вот пример того, как вы могли бы поступить: щелкните по графику, а затем просмотрите анимацию кадр за кадром, нажимая соответствующую кнопку на плейере: > plots[animate](x^3+a*x^2-x+3, x=-12..9, a=0..10, color=blue); x38 . Найдите все ее асимптоты. x32 x2 Кроме того, найдите точки пересечения с осями координат, локальные максимумы, локальные минимумы и точки перегиба этой функции. Упражнение 40. Свинарник должен иметь форму коробки без пола и передней стены. Крыша его должна быть квадратом, а объем - 18 кубических метров. Каковы должны быть размеры свинарника, если на его постройку надо затратить минимум материала? Задача 13 (о свинарнике). Вместо того чтобы крыша свинарника была квадратом, предположим, что ширина ее в b раз больше длины, где b - положительное число. Найти минимальное количество (A) материала, требующегося для постройки такого свинарника, как функцию переменной b. Привести заключение о наиболее экономичной форме крыши. Решение: Сначала нарисуем схему: Упражнение 39. Нарисуйте график функции y 60 > A1:=plot({[[0,0],[0,2],[2,3],[5,3],[5,1],[3,0], [3,2],[0,2]],[[0,0],[3,0],[3,2],[5,3]]},color=navy): > A2:=plots[textplot]({[1.5,-.25,'w'],[4.25,.35,'l'], [5.25,2,'h']},color=black): > A3:=plots[textplot]([2,3.25, ` Без передней стенки и пола`],color=black): > display({A1,A2,A3},axes=none,scaling=constrained); Нам дано, что длина l постройки равна произведению bw, где b – положительная константа. Нам нужно минимизировать площадь A 2 hl hw lw постройки при условии, что ее объем V=hlw равен 18 кубическим метрам: > restart; > A := 2*h*l + h*w + l*w; A := 2 h lh wl w > l := b*w; l := b w Сейчас площадь А зависит от высоты h и ширины w свинарника. Но высота h=18/(lw) в соответствии с заданным условием. Подставим это выражение для h и превратим A в функцию переменных b и w: > A := unapply(subs(h=18/(l*w), A), (b, w)); A := ( b, w )36 1 1 18 b w2 w bw Изобразим функцию А при различных значениях параметра b: > plot({A(1,w), A(1/2,w), A(1/10,w)}, w=1..15); > plot(A(1/2, w), w=1..15); 61 1 Можно подумать, что минимум минимумов Ab имеет место при b . Для проверки 2 этого предположения стоит выразить Ab в виде функции от b. Сначала найдем ширину wb свинарника с минимальным значением А, что обеспечивается условием, при котором A( b, w )0 . Затем подставим этот ресуществует действительный корень выражения w зультат вместо w в A: > Aw := normal(diff(A(b, w), w)); Aw := 2 18 b9b2 w3 b w2 > w[b] := ((9+18*b)/b^2)^(1/3); 918 b wb := b2 > A[b] := unapply(A(b,w[b]),b); ( 1/3 ) 918 b Ab := b36 18 b ( 1/3 ) ( 1/3 ) b2 918 b 918 b b 2 2 b b 1 1 ( 2/3 ) > fsolve(diff(A[b](b), b), b, 0..1); .5000000000 Действительно, наше предположение оправдалось. Упражнение 41. Башенные часы имеют стрелки следующей длины: минутная - 4 фута, часовая - 3 фута. Как быстро концы стрелок удаляются друг от друга в 12час 15мин? Задача 14. В какое время концы стрелок башенных часов из упр.41 удаляются друг от друга наиболее быстро? Решение: По теореме косинусов расстояние s между концами стрелок равно: > restart; > s:=sqrt(3^2+4^2-2*3*4*cos(theta)); s := 2524 cos( ) 62 где - угол между стрелками. Этот угол является линейной функцией времени t, измеря12 60 емого в минутах. При t0 угол равен 0 радиан, а после минут угол равен 2 ра11 диан, поэтому, вообще говоря, > theta:=(11/12)*(2*Pi/60)*t; 11 := t 360 Для того чтобы найти тот момент времени, когда расстояние между концами стрелок изменяется наиболее быстро, давайте немного подумаем. В 12час 00мин, стрелки совпадают, но минутная стрелка удаляется от часовой. Обе они движутся вправо, но минутная стрелка движется в 12 раз быстрее. Момент времени, в который расстояние между концами стрелок возрастает наиболее быстро, может наступить тогда, когда вторая производная от s по времени равна нулю. Это может случиться перед тем, как стрелки будут направле1 ны в противоположные стороны, то есть через минут после 12 часов. Итак: 12 2 ( 60 ) 11 > sp := diff(s, t); sp := 11 sin t 360 11 2524 cos t 360 11 30 > spp := normal(diff(sp, t)); 2 2 11 11 11 12 sin t 25 cos t 24 cos t 121 360 360 360 spp := ( 3/2 ) 10800 2524 cos 11 t 360 2 > ti := fsolve(spp, t, 0..30*12/11); ti := 7.529022202 > evalf(subs(t=ti, sp)); .2879793266 > evalf(subs(t=ti, s)); 2.645751311 Таким образом, приблизительно через 7.529 минут после 12 часов расстояние между концами минутной и часовой стрелок возрастает с максимальной скоростью (около 288 футов в минуту). Кроме того, концы стрелок в этот момент отстоят друг от друга на расстоянии около 2.65 фута. 63 7 ИНТЕГРИРОВАНИЕ Поскольку при решении задач интегрирование встречается столь же часто, как и дифференцирование, то следует уделить ему должное внимание. 7.1 Суммирование Интегрирование основано на суммировании, которое Maple выполняет словом sum. 7.1.1 Использование слов Sum и sum Sum - это пассивная форма слова sum. Чтобы в этом лучше разобраться, запишем соотношение для вычисления ста первых положительных целых чисел: > Sum(i, i=1..100)=sum(i, i=1..100); 100 i5050 i1 Предположим, мы хотим найти сумму арифметической последовательности: 4 + 7 + 10 + 13 + .... + 301 Первое, что надо вычислить, это число членов будущей суммы. Далее, учитывая, что разность между членами равна 3, последний член этой последовательности можно записать в виде 43 i , где > i = (301-4)/3; i99 Итак, имеем 100 членов последовательности и можем записать: > Sum(4+i*3, i=0..99)=sum(4+i*3, i=0..99); 99 ( 43 i )15250 i0 Пусть нужно найти сумму квадратных корней из i, если i изменяется от 1 до 10. Действуя так же, как и ранее, запишем: > Sum(sqrt(i), i=1..10)=sum(sqrt(i), i=1..10); 10 i 1 2 3 4 5 6 7 8 9 10 i1 Но сумма не вычисляется! Используем слово evalf для превращения ее в десятичное число: > Sum(sqrt(i), i=1..10)=evalf(sum(sqrt(i), i=1..10)); 10 i 22.46827819 i1 Вычислим значение следующей суммы, если n принимает значения 4, 8, 12 и т.д. Каково будет предельное значение этой суммы при увеличении n? > seq(Sum((1/2)^i, i=0..4*j)=sum((1/2)^i, i=0..4*j), j=1..3); i i i 4 8 12 1 31, 1 511, 1 8191 2 16 2 256 2 4096 i0 i0 i0 > Sum((1/2)^i, i=0..n)=sum((1/2)^i, i=0..n); 64 n i 1 1 2 2 2 i0 ( n 1 ) 2 n 1 стремится к нулю при увеличении n, поэтому вся сумма стремится к 2. 2 > Sum((1/2)^i, i=0..infinity) =limit(Sum((1/2)^i, i=0..n), n=infinity); i 1 2 nlim i0 n 1 2 i0 i 7.1.2 Римановы суммы и пакет student В пакете для студентов (student package) есть несколько полезных слов на тему интегрирования. Загрузим этот пакет: > with(student); [ D, Diff, Doubleint, Int, Limit , Lineint, Product, Sum, Tripleint , changevar, combine, completesquare, distance, equate, extrema, integrand , intercept, intparts, isolate, leftbox, leftsum, makeproc, maximize, middlebox, middlesum , midpoint , minimize, powsubs, rightbox, rightsum, showtangent, simpson, slope, summand, trapezoid , value ] Например, middlesum и middlebox вычисляют и показывают регулярную Риманову сумму, для которой узлы функции расположены посредине интервалов разбиения ее области определения на подынтервалы. Так, для того, чтобы получить «среднюю» (middle) регулярную Риманову сумму (Riemann sum) для x2 от 0 до 1 с десятью подынтервалами, запишем: > middlesum(x^2, x=0..1, 10) = value(middlesum(x^2, x=0..1, 10)); 2 9 1 1 i 1 133 10 i 10 20 400 0 Посмотрим, что мы считали: > middlebox(x^2, x=0..1, 10); 7.1.3 Две задачи о площадях x2 y21 в виде параметрического графика. Оце4 нить площадь эллипса, зная что она в четыре раза больше площади криволинейной трапеx2 1 ции, ограниченной графиком функции для x из интервала [0, 2]. 4 Задача 15. Нарисовать эллипс 65 Решение: Параметризацией эллипса называется его задание в виде x 2 cos ( t ), y sin ( t ) , если t изменяется от 0 до 2. Итак: > ellipse := [2*cos(t), sin(t), t=0..2*Pi]; ellipse := [ 2 cos( t ), sin( t ), t0 .. 2 ] > plot(ellipse, scaling=CONSTRAINED); Нарисованный выше эллипс - график функции: > f := x -> sqrt(1- x^2/4); 1 f := x 1 x2 4 Для оценки искомой площади можно использовать слова leftsum и rightsum: > for i from 1 to 5 do left := 4*evalf(value(leftsum(f(x), x=0..2, 25*i))); right := 4*evalf(value(rightsum(f(x), x=0..2, 25*i))); print(left, right, right-left); od: 6.424392620, 6.104392620, -.320000000 6.356537024, 6.196537028, -.159999996 6.332899036, 6.226232368, -.106666668 6.320834068, 6.240834064, -.080000004 6.313502776, 6.249502780, -.063999996 Анализируя полученную таблицу чисел, мы видим, что величина площади находится между 6.24 и 6.31. 4 2 Задача 16. Для функции 10x 10 x изобразить ее график, определить область R, где этот график расположен над осью x. Вычислить конечные точки R вдоль этой оси. Использовать student[middlesum] для нахождения площади области R с точностью до 0.1. Решение: Сначала нарисуем график функции и вычислим конечные точки для R вдоль оси Х. > y := 10 - x^4 + 10*x; y := 10x410 x > plot(y,x=-2..3); 66 > sol := fsolve(y, x); sol := -.9263593057, 2.417910164 Теперь определим площадь. Для этого запишем: > for i from 1 to 5 do value(student[middlesum](y, x=sol[1]..sol[2], 20*i)) od; 41.78810165 41.73598953 41.72632972 41.72294809 41.72138277 При разбиении интересующего нас интервала на 100 подынтервалов площадь составляет приблизительно 41.7. 7.2 Использование слов int и Int Одна из важнейших теорем математического анализа гласит: определенный интеграл от непрерывной функции, скажем f(х), может быть найден как первообразная этой функции, а затем вычислен как разность значений первообразной на концах интервала интегриb F( x )f( x ) . рования. Символически: f( x ) dxF( b )F( a ) , означает, что x a Для того чтобы находить первообразные (antiderivatives), т.е. неопределенные интегралы (indefinite integrals) в Maple можно использовать слово int. Например, чтобы x найти первообразную функции x2cos , напишем: 5 > Int(x^2 + cos(x/5), x)=int(x^2 + cos(x/5), x); 2 x cos 1 x d x1 x35 sin 1 x 5 5 3 Заметьте, что есть и пассивная форма слова int, которая пишется с большой буквы Int, просто для печати интеграла. Можно использовать слово int и для оценки определенных интегралов. Например, x нарисуем область под графиком x2cos над осью x из интервала [0, 2] и вычислим ее 5 площадь: > restart; > f := x-> x^2 + cos(x/5); 67 1 f := xx2cos x 5 > Int(f(x), x=0..2)=int(f(x), x=0..2); 2 2 x cos 1 x d x85 sin 2 5 5 3 0 > area := evalf(int(f(x), x=0..2)); area := 4.613758379 Мы используем plots[polygonplot] для закраски области: > plots[polygonplot]([[2,0], [0,0], [0,f(0)], seq([x/10, f(x/10)], x=0..20)],color=gray,title=cat(`Area = `, convert(area, string)) ); Упражнение 42. Для каждой из приведенных ниже функций нарисуйте область под графиком и вычислите ее площадь, применяя упомянутую в начале теорему о первообразной. 2 a) f( x )( 1xx ) 2 , для x -1 .. 2 2 x b) Под дугой функции f( x )cos 3 x , содержащей точку x=0. 2 2 c) f( x )piecewise ( x1, x , 1x, x ) для x = 0 .. 2. Задача 17 (о среднем значении). Предположим, что вы получили 1000 случайных чисел между 0 и 1. Каково, по-вашему, будет среднее значение суммы квадратов этих чисел (приблизительно)? Решение: Сначала посмотрим, как работает слово rand: > ?rand; Итак, для того, чтобы задать случайную функцию, которая имеет значения на интервале между 0 и 1, мы должны записать так: > f := rand(10^7)/10.^7: > f(); .9669081000 Теперь решим нашу задачу: > s := 0: for i from 1 to 1000 do s := s+f()^2 od: s/1000; .3257097987 68 Ответ похож на значение 1/3. С другой стороны, мы могли бы оценить искомое значение, осредняя величины в n равноудаленных точках интервала. Ниже написана процедура для этого. На входе: функция f, которая осредняется; a, b - точки концов интервала, на котором производится оценка; n - число равноотстоящих значений, подлежащих осреднению. > av := proc(f, a, b, n) local i, dx; dx := (b-a)/n; evalf(sum(f(a+i*dx), i=1..n)/n); end: Так, для оценки среднего значения х2, где x меняется от 0 до 1, мы могли бы получить последовательность оценок: > for i by 100 from 100 to 400 do print(i, av(x->x^2, 0, 1, i)) od; 100, .3383500000 200, .3358375000 300, .3350018519 400, .3345843750 Этот результат также близок к 1/3. Последняя оценка может быть превращена в регулярную Риманову сумму. Пусть ba x определяет длину каждого подынтервала при регулярном разбиении интерваn ла [a,b]. Тогда среднее значение и Риманова сумма суть одно и то же: n f( ai x ) f( ai x ) x i1 n ba . При увеличении n эта Риманова сумма сходится к интегралу от функции f(x) в указанных пределах, деленному на длину рассматриваемого интервала. Таким образом, мы и устанавливаем среднее значение функции как интегральную оценку. Упражнение 43. Изменение температуры в течение 24 часов (от 0 до 24) задано функt цией f( t )10 sin 100 t ( 24t ) . Найти среднее значение температуры на этом ин3 тервале. Найти тот момент времени t, когда температура достигает своего среднего значения. Кроме того, найти максимум и минимум температуры. Упражнение 44. Предположим, что f(х) непрерывная функция на интервале [a,b] со средним значением T. Показать, что существует такое значение x из [a,b], что f(x) = T. Задача 18 (моделирование заполнения легких воздухом). Скорость изменения объема воздуха в легких может быть описана приближенно (согласно некоторым данным) функцией: > f := t -> 1/2*sin(2*Pi*t/5); 1 2 f := t sin t 2 5 Причем объем измеряется в литрах, а время - в секундах. Поэтому объем воздуха в легких может быть получен интегрированием функции f(t). Предполагается, что в начальный момент времени (t=0) воздух в легких отсутствует. Вычислим: 69 > Int(f(tau), tau=0..t) = int(f(tau), tau=0..t); 2 t cos t 1 1 2 5 sin d 5 4 2 5 0 Запишем результат в виде функции: > F := unapply(int(f(tau), tau=0..t), t); 2 cos t 1 5 5 F := t 4 Построим зависимости f и F от времени для того, чтобы лучше понять процесс: > plot({f, F}, 0..10); Упражнение 45. Ответьте на вопросы к задаче 18: Какая из нарисованных функций является скоростью движения воздуха, а какая - ее интегралом, т.е. объемом легких? Каков максимальный объем воздуха в легких в этой модели? Минимальный объем? Когда легкие заполнены наполовину? Каково среднее значение скорости заполнения легких воздухом на интервалах времени [0,2.5], [2.5,5], [0, 5]? > ar := evalf(int(f(t), t=0..2.5)/2.5); ar := .3183098862 Ответ: В среднем около 0.32 литра в секунду. Каков средний объем воздуха в легких на интервалах времени [0,2.5], [0,5]? > av := evalf(int(F(t), t=0..2.5)/2.5); av := .3978873575 Ответ: В среднем около 0.4 литра воздуха. Для описания рассмотренного процесса имеются и другие, возможно, более реалистические модели. Например, давайте рассмотрим следующую: > g := t -> (3/8-1/4*cos(4*Pi*t/5))*sin(2*Pi*t/5); 3 1 4 2 g := t cos t sin t 8 4 5 5 Упражнение 46. Используя функцию g для моделирования скорости изменения объема легких, найти объем G воздуха в легких в момент времени t. Полагаем, как и ранее, что G(0)=0. Нарисовать как g так и G на интервале времени [0, 10]. Описать качественно разницу, которая наблюдается между двумя рассмотренными моделями. Вычислить максимальную скорость в последней модели. Каков максимальный объем воздуха в легких по последней модели? Каков средний объем воздуха в легких на временном интервале [0, 5]? 70 2 Задача 19. Найти перевернутую параболу yax , такую, чтобы площадь между 2 ней и параболой yx была равна 100. Нарисовать диаграмму. Решение: Определим функции, ограничивающие интересующую нас область: > restart; > f := x -> a-x^2; f := xax2 > g := x-> x^2; g := xx2 Найдем точки пересечения этих функций: > sol := solve(f(x)=g(x), x); 1 1 sol := 2 a, 2 a 2 2 Получим выражение для площади области, учитывая что перед этим мы видели, что sol[2] является левой граничной точкой пересечения функций. > area := int(a-2*x^2, x=sol[2]..sol[1]); 2 ( 3/2 ) area := a 2 3 > sol; 1 1 2 a, 2 a 2 2 Решим уравнение: > sol2 := fsolve(area=100, {a}); sol2 := { a22.40702373 } Припишем а значение: > assign(sol2): Нарисуем область: > plot({f , g }, sol[2]..sol[1]); 2 Задача 20. Парабола ya x b xc касается графика функции y2 x3 в двух точках, и площадь области, ограниченной этими графиками равна 10. Найти a, b и c. Построить график. Решение: b Осью параболы является x . Это также ось функции y2 x3 , поэтому 2a b 3 , или b 6 a . Точка, где угловой коэффициент параболы равен 1, принадлежит 2a 2 обоим графикам. Назовем ее (x0, y0). Тогда x01a x0 6 a x0c и 12 a x06 a . Запишем эти уравнения: 71 > restart; > eq1 := x0-1 = a*x0^2 -6*a*x0 + c; eq1 := x01a x026 a x0c > eq2 := 1 = 2*a*x0 - 6*a; eq2 := 12 a x06 a И найдем их решение: > ac := solve({eq1, eq2}, {a, c}); 1 1 1 x022 x06 ac := { a , c } 2 x03 2 x03 Итак, площадь между кривыми равна 100, поэтому площадь правой части этой области равна 50. Отсюда имеем: > eq3 := Int (a*x^2-6*a*x+c-(2+x-3),x=3..x0)=50; x0 2 eq3 := a x 6 a xc1x d x50 3 или > eq3 := int (a*x^2-6*a*x+c-(2+x-3), x=3..x0)=50; 1 1 eq3 := a ( x0327 ) ( 16 a ) ( x029 )c ( x03 )x0350 3 2 Решим это уравнение: > sol :=solve(subs(ac, eq3), x0); sol := 310 3 , 310 3 > assign({x0=sol[1]}): assign(ac): и нарисуем диаграмму: > plot({2+abs(x-3), a*x^2-6*a*x+c}, x=sol[2]-2..sol[1]+2, color=black); 7.3 Нахождение центра массы тела 7.3.1 Центр массы проволоки Предположим, мы имеем проволоку длиной l метров, с линейной плотностью материала ( x ) граммов на сантиметр в точке x сантиметров от левого ее конца. Какова полная масса проволоки и где расположен ее центр массы, т.е. точка относительно которой полный статический момент проволоки равен нулю? 72 Мысленно разделим проволоку на маленькие кусочки длиной xi сантиметров каждый и выберем произвольную точку ci на каждом кусочке. Приблизительно масса одного кусочка проволоки равна ( ci ) xi , поэтому масса всей проволоки составляет около n ( ci ) xi . Это выражение, являясь Римановой суммой, в пределе приведет к интегра- i 1 l лу ( x ) dx , и поэтому масса всей проволоки определяется значением этого интеграла. 0 Проводя разбиение проволоки, как и ранее, получим для статического момента i-го кусочка относительно центра массы (cm) выражение вида ( cicm ) ( ci ) xi и поэтому n приближение для всего момента: ( cicm ) ( ci ) xi . Это Риманова сумма, приближа- i 1 l ющая интеграл ( xcm ) ( x ) d x . Но центр массы определяется как точка, относительно 0 которой полный статический момент равен нулю, поэтому справедливо уравнение l ( xcm ) ( x ) dx0 . Используя свойства интегралов, мы можем решить это уравнение 0 l относительно cm, что приводит к соотношению cm x ( x ) d x 0 l . Заметьте, что верхний ( x ) d x 0 интеграл представляет собой статический момент проволоки относительно ее левого конца (x=0), а нижний интеграл - полная масса проволоки. Упражнение 47. Найти центр массы проволоки длиной в один метр, при плотности на расстоянии x сантиметров от левого конца 10 + x + sin(x) г/см. 7.3.2 Центр массы тела вращения Пусть тело S получено вращением вокруг оси х области под графиком функции 0y = f( x ) , заданной на интервале a x <= b . Известно, как выразить объем (Volume) тела S в виде интеграла. Для этого надо проинтегрировать от а дo b площадь сечения т.е. b 2 f( x ) , тогда получим: Volume f( x ) d x a 2 Как найти центр массы тела, полагая, что оно выполнено из однородного материала? Ясно, что центр массы должен находиться где-то на оси х между a и b. Пусть точка CM будет центром массы. Разбиение интервала [ a, b ] на n подынтервалов [ xi, xi1 ] и использование плоскостей, перпендикулярных отрезку [ a, b ] , позволяет получить приближенную форму тела S посредством набора из n дисков, где i-ый из них имеет объем 2 Vi f( xi ) xi Теперь статический момент (со своим знаком) i-го диска относительно точки CM будет равен Mi( xCM ) Vi , а сумма этих моментов будет приближенно равна нулю, 73 поскольку CM является центром массы. При устремлении к нулю xi это приближенное уравнение для нахождения центра массы можно записать так: > CMequation := Int((x-CM)*Pi*f(x)^2, x=a..b) =0; CMequation := b ( xCM ) f( x )2 d x0 1/60 3 Используя свойства интегралов, можем решить последнее уравнение относительно CM: > sol := solve( CMequation, {CM} ) : sol:=simplify( factor( combine(sol) ) ) ; b 2 f ( x ) x d x 1/60 3 sol := CM b 2 f( x ) d x 1/60 3 Заметьте, что центр массы тела вращения - это то же самое, что и центр массы проволоки, плотность которой в точке х равна площади поперечного сечения. Мы можем определить слово cenmass, которое по функции f и интервалу [a, b] определяет положение центра массы: > cenmass := proc(f,a,b) int(x*f(x)^2, x=a..b)/int(f(x)^2, x=a..b) end: Например, центр массы фигуры, образованной вращением области R под графиком y cos ( x ) для x между 0 и равен: 2 > cenmass(cos, 0, Pi/2); 1 2 1 16 4 4 Теперь можно определить слово drawit для изображения нужной фигуры и изображения ее центра массы: > drawit := proc(f, a, b) local cm, solid; cm := plots[pointplot3d]([evalf(cenmass(f, a, b)), 0, 0], color=red, symbol=box, thickness=3): solid := plots[tubeplot]([x, 0, 0], x=a..b, radius=f(x), numpoints=20, style=wireframe); plots[display]([cm, solid], scaling=constrained); end: Проверим: > drawit(cos+2, 0, 7); 74 Анимируем движение центра массы, происходящее при изменении формы тела: > plots[display]([seq(drawit(2+cos, 0, t), t=1..6)], insequence=true); Упражнение 48. Найти центр массы однородного полусферического тела. Упражнение 49. Однородное тело выполнено в форме параболоида вращающегося вокруг оси у графика y=х2, для x из интервала [0, a] и для некоторого числа a>0. Если центр массы расположен при y=10, то какова величина a? 8 ОБРАТНЫЕ ФУНКЦИИ 8.1 Полезная функция - натуральный логарифм Логарифмическая функция была впервые введена в начале 17 века Джоном Нэпером, чтобы упростить вычисления при умножении и делении чисел. И эта идея очень быстро распространилась по всему миру. Логарифмы Нэпера были определены несколько иным образом, чем это принято в настоящее время. Идея определить логарифм x для x>0 как площадь под кривой 1/x, т.е x 1 ln ( x ) d t , пришла немного позже. Ключевой момент здесь состоит в том, что эта t 1 площадь растет как арифметическая прогрессия, в то время как x растет в геометрической прогрессии. n Рассмотрим последовательность степеней числа 2, an2 , n=1,2, ... Это геометрическая прогрессия (geometric sequence), т.е. отношение последующего члена последовательa n 1 dt , ности к предыдущему постоянно (в этом случае, оно равно 2). Пусть теперь bn t 1 для n = 1,2... Мы говорим, что последовательность bn является арифметической прогрессией (arithmetic sequence), если разность между последующим и предыдущим ее членами равна постоянному числу. Для того, чтобы вычислить эту разность, сначала используем 2 определение: bn1bn 1 ( n1 ) 2 n 1 1 dt dt . Эта разность t t 1 интегралов может быть 75 2 ( n 1 ) записана в виде интеграла n 1 u d t . А теперь сделаем подстановку t n в этот интеt 2 2 2 1 1 du грал. Тогда dt n и интеграл становится равен d uln ( 2 ) . Из этого следует, u 2 1 что bnn ln ( 2 ) , т.е. мы имеем дело с арифметической прогрессией, как и было сказано выше. Упражнение 50. Используйте правило замены переменной, данное выше, для установления других свойств натурального логарифма: а) ln( x y )ln( x )ln( y ) , для всех положительных x и y, b g( b ) 1 б) ln ln( x ) , для всех x>0. Учтите, что f( g( x ) ) D( g )( x ) dx f( u ) du a g( a ) x . Упражнение 51. Примените student[rightsum] для оценки ln(2) Римановыми суммами до 4 десятичных знаков. Задача 21. Какая линия семейства ym ( x1 ) делит область под графиком функции 1 y между 1 и 2 на две области с равными площадями? Изобразите ситуацию граx фически. Решение: Сначала найдем, где прямая пересекает кривую 1/x: > y := m*(x-1); y := m ( x1 ) > b := solve(y=1/x, x); 1 m m24 m 1 m m24 m b := , 2 m 2 m Нам требуется первое решение. Именно оно принадлежит правой ветви функции 1/x. Затем требуется решить уравнение: > eq := Int(1/x-y, x=1..b[1])=1/2*ln(2); 1/2 eq := 1 2 m m 4 m m 1 1 m ( x1 ) d x ln( 2 ) x 2 > m := fsolve(value(eq), m); m := .7575012634 Теперь изобразим диаграмму для того, чтобы понять, все ли правильно: > plot({1/x, y, [[2,0], [2,1/2]]}, x=1..2, scaling = constrained, color=black); 76 Фигура выглядит разрезанной пополам. 2 Задача 22. Найти параболу yx b , которая касается графика функции yln( x ) . Изобразить графики. Решение: Пусть [x1, ln(x1)] будет точкой касания. Тогда ln(x1) равен xl2+ b. Это первое уравнение. > restart; eq1 := x1^2+b = ln(x1); eq1 := x12bln( x1 ) 2 Но производные функций yx b и 1/x при x1 должны быть равны. Это второе уравнение. Двух этих уравнений достаточно для определения x1 и b. > eq2 := 2*x1 = 1/x1; 1 eq2 := 2 x1 x1 Решим эти уравнения: > sol := solve({eq1, eq2}, {x1, b}); 1 sol := { b ln( RootOf( 2 _Z 21 ) ), x1RootOf( 2 _Z 21 ) } 2 Кажется, что мы имеем два значения x1, 1/ 2 и -1/ 2 . Но функция ln х не определена при -1/ 2 , поэтому x1 равен первому числу. > x1 := 1/sqrt(2); 1 x1 := 2 2 Тогда: > b := ln(x1)-1/2; 1 1 b := ln 2 2 2 и графики имеют вид: > plot({ln(x), x^2+b}, x=-2..2, thickness=2); 77 2 Упражнение 52. Найти параболу ya x , которая касается графика функции 1 y . Изобразить эти графики. x Упражнение 53. Найти значения локальных экстремумов функции yln( 10x ( x1 ) ( x2 ) ) . Решения проиллюстрировать. Упражнение 54. Изобразить область, ограниченную графиками функций 2 2 yln( 1x ) и y10x . Найти площадь этой области. 1 Упражнение 55. Прямая xym и график функции y ограничивают область x площадью 10 единиц. Найти значение m и изобразить графики. Задача 23. Прямая y2 x1 не пересекает график функции yln( ln( x ) ) . Так ли это? Найти точку на прямой, которая наиболее близка к указанному графику. Изобразить графики. Решение: Сначала посмотрим на графики. > line := 2*x+1; line := 2 x1 > lnln := ln(ln(x)); lnln := ln( ln( x ) ) > plot( {line,lnln}, x=-5..5, thickness=2); Действительно, они не пересекаются. Функция ln(ln(х)) определена только для x>1 и вогнута вниз, поэтому ее график нигде не пересекает прямую. Кажется, что ближайшая к графику ln(ln(x)) точка прямой расположена около x=1.5. Это должна быть точка, где касательная к графику параллельна заданной прямой. Поэтому производная здесь должна быть равна 2. Проверим наши соображения: > x1:=fsolve(diff(lnln, x)=2, x, 1..1.5); x1 := 1.421529936 Изобразим ситуацию: > plot({line, lnln, -1/2*(x-x1)+subs(x=x1, lnln)}, x=-5..5, scaling=constrained, thickness=2, color=black); 78 8.2 Экспоненциальная функция (экспонента) Функция, обратная к функции натурального логарифма, называется экспоненциальной функцией (exponential function) или просто экспонентой. Она определена в Maple как exp. Ее название обусловлено тем, что она подчиняется «законам экспонент», т.е., ( xy ) ( x ) e e x e y и e 1 . Здесь число e определяется так, что ln ( e )1 . Иными словаex ми, exp(1)=e. Тогда exp(2)=exp(1+1)=exp(1)*exp(1)=е2. Кроме того, exp(1/2)=е(1/2), по2 12 скольку e = =exp(1/2)*exp(1/2)=exp(1/2+1/2 =e, то можно показать, что exp(x)=ех для любого рационального числа x, а поэтому можно определить ех =exp(x) для всех действительных чисел x. С другой стороны, можно показать, что число e является пределом последовательноn 1 сти чисел вида 1 при возрастании n. Мы можем проверить это численно, опредеn лив функцию целочисленного аргумента n, принимающую значения n-го члена указанной последовательности. Упражнение 56. В качестве эксперимента найдите наименьшее значение n, которое дает значение e с точностью до пяти значащих цифр. Указание: Например, можно воспользоваться такими командами: > approxe := n -> evalf((1+1/n)^n); n 1 approxe := nevalf 1 n > approxe(100); 2.704813829 Экспонента возрастает быстрее, чем любая полиномиальная функция. Линейная функция, которая имеет то же значение и ту же производную, как и y=exp(x) при x=0 является касательной к последней с уравнением y=x+1 при x=0. Квадратичная функция, имеющая то же значение, а также первую и вторую производные, как и у функции exp(x) при 1 x2 x=0, - это функция вида 1 + x + 2 . Продолжая рассуждения, можно убедиться, что полином степени n, который имеет то же значение, а также первые n производных те же, что n xi и у экспоненты, можно записать в виде . Для наглядности изобразим несколько таn! i 0 ких функций на одном графике с exp(x). > efun := plot(exp, -1..4, color=black, thickness=2): > pfuns := plot({1+x, 1+x+1/2*x^2, 1+x+x^2/2+x^3/3!, 1+x+x^2/2+x^3/3!+x^4/4!, 1+x+x^2/2+x^3/3!+x^4/4!+x^5/5!}, x=-1..4, color=tan): plots[display]([efun, pfuns]); 79 Как видно из графика, полиномы приближаются к экспоненте, но возрастают не столь быстро. Эти полиномы являются членами ряда Тэйлора, приближающего экспоненциальную функцию, и могут быть выписаны для любой функции, которая имеет производные любого порядка. Упражнение 57. Функции y=х2 и y=2х пересекаются три раза. Найти две точки их пересечения, решив уравнение х2=2х. Затем изобразить эти функции на одном графике, по которому оценить координаты третьей точки пересечения. Экспоненциальную и логарифмическую функции можно применить для определения ( x ln( a ) ) x другой экспоненциальной функции a e , где a>0. х 3 Упражнение 58. Функции 3 и х пересекаются два раза. Найти одну из точек пересечения, решив уравнение 3х=х3. Затем изобразить эти функции на одном графике и оценить из графика координаты второй точки пересечения. Найти значение a между 2 и 3 такое, что ах и ха пересекаются лишь один раз. Нарисовать графики. Задача 24 (Две чашки чая). Предположим, что две чашки чая, первая с температурой 90 0C и вторая - 100 0C, находятся в комнате с температурой 20 0C. Известно, что первая чашка охлаждается от 90 0C до 60 0C спустя 10 минут, за это же время вторая чашка охлаждается в холодильнике до температуры -5 0C. Сколько времени нужно для того, чтобы чашки чая имели одинаковую температуру? Решение: Рассматривая процесс охлаждения, как подчиняющийся закону Ньютона, можно получить, что температура первой чашки изменяется следующим образом: > restart; > f := t -> 20+70*exp(k*t); (k t) f := t2070 e Здесь постоянная k определяется условиями охлаждения чашки до температуры 60 0C в течение 10 минут (т.е. как решение уравнения f(10)=60 для k): > k := solve(f(10)=60, k); 1 4 k := ln 10 7 Предположим, что это же значение k справедливо и для второй чашки. (Почему бы и нет, ведь в обеих чашках находится чай.) Поэтому температура второй чашки изменяется следующим образом: > g := t -> 20 + 80*exp(k*t); (k t) g := t2080 e за первые 10 минут. После этого температура второй чашки меняется так: > h := t -> -5 + (itemp - (-5))*exp(k*t); h := t5( itemp5 ) e (k t) 80 где itemp - температура, с которой началось бы охлаждение второй чашки для того, чтобы охладиться до g(10) 0C, если бы она была в холодильнике с самого начала. Поэтому itemp удовлетворяет второму уравнению. Можно объединить эти два определения в одну функцию, воспользовавшись словом piecewise: > c2 := unapply(piecewise(t<=10, g(t), t>=10, h(t)), t); ( 1/10 ln( 4/7 ) t ) c2 := tpiecewise( t10, 2080 e , 10t, 5( itemp5 ) e Итак, имеем уравнение: > eq := -5 + (itemp +5)*exp(k*10) = g(10); 15 4 460 eq := itemp 7 7 7 Решая его относительно itemp, получим: > itemp := solve(eq, itemp); 475 itemp := 4 Теперь займемся изображением двух кривых для температур: > cup1 := [t, f(t), t=0..20]; ( 1/10 ln( 4/7 ) t ) ) ( 1/10 ln( 4/7 ) t ) cup1 := [ t, 2070 e > cup2 := [t, c2(t), t=0..20]; 2080 e ( 1/10 ln( 4/7 ) t ) cup2 := t, 5495 e ( 1/10 ln( 4/7 ) t ) 4 > plot( {cup1, cup2}, thickness=2 ); , t0 .. 20 ] t10 , t0 .. 20 10t Чашки будут находиться при одинаковой температуре менее, чем через 15 минут. Оценим это значение точнее: > etime := solve(f(t)=c2(t), t); 20 ln 43 etime := 10 4 ln 7 > evalf(etime),` minutes from time 0`; 13.67845330, minutes from time 0 В этот момент времени температура равна: > f(etime)=evalf(f(etime)),` degrees`; 2260 52.55813953, degrees 43 81 8.3 Обратные тригонометрические функции Обратные тригонометрические функции очень широко используются на практике. Так, обратной к функции тангенс является арктангенс (arctan), к функциям синус и косинус - арксинус (arcsin) и арккосинус (arccos) соответственно и т.д. Построим, например, графики функций арктангенс, арксинус и арксеканс, изображая их в виде матрицы графиков: > Digits:=3: plots[display](matrix(1, 3, [[plot(arctan, -10..10, thickness=2), plot(arcsin,-10..10,thickness=2), plot(arcsec,-10..10,thickness=2)]])); Digits := 10: В обратных функциях особенно важно то, что все они имеют алгебраические производные. Поэтому они играют существенную роль в отыскании первообразных функций. Проверим это: > restart; > diff(arctan(x), x); 1 1x2 Изобразим функцию арктангенс и ее производную: > plot({arctan, D(arctan)}, -5..5, thickness=2); 18 3 Задача 25. Найти критические точки функции arctan arctan , для положи x x тельных значений x. Построить график, который демонстрирует некоторые экстремальные значения. Решение: 82 > y := arctan(18/x)-arctan(3/x); 1 1 y := arctan 18 arctan 3 x x > plot(y, x=-20..20); Видно, что исследуемая функция имеет единственный максимум около точки (7,0.8) и симметрично расположенный минимум около (-7,-0.8). Чтобы быть более точными, проверим это: > extr :=solve(diff(y, x), {x}); extr := { x3 6 }, { x3 6 } Итак, имеем максимум при х= 3 6 и минимум при х = 3 6 . Задача 26. Билл, ведет свой красный «Мустанг» на скорости 120 миль/час, направляясь к железнодорожному переезду дороги, ведущей в Канзас. Когда он находится на расстоянии одной мили от переезда, то замечает поезд, движущийся к тому же переезду. Он оценивает скорость поезда в 60 миль/час, а расстояние от локомотива до переезда в одну милю. Длина поезда - около 300 метров. Наблюдая за поездом в течение минуты, он отмечает, что угол зрения в направлении поезда сначала увеличивается, а затем начинает уменьшаться. На каком расстоянии от переезда находился Билл в тот момент времени, когда угол был максимальным? Решение: Сначала нарисуем картинку. В качестве единиц используем метры, минуты и градусы. Тогда расстояние от Билла до переезда t минут спустя после того, как Билл увидел поезд, равнялось y 1762 2 1762 t метров, а расстояние до локомотива было x=y метров. Расстояние до конца поезда от переезда равно x+300 метров. Угол зрения Билла на поезд раx300 x tan( ) вен . Итак, и tan( ) . Таким образом, функция, максимум y y x300 x которой надо найти, задается в виде: angarctan arctan . Запишем: y y > restart; > ang := arctan((x+300)/y)-arctan(x/y); x300 x ang := arctan arctan y y > y := 1762*(1-2*t); x:= 1762-1762*t; ang; y := 17623524 t x := 17621762 t 20621762 t 17621762 t arctan arctan 17623524 t 17623524 t 83 Изобразим нашу функцию: > plot(ang, t=-2..3); Из графика видно, что имеется локальный максимум угла зрения Билла перед тем, как он достигнет переезда, и абсолютный максимум - после того, как он проедет переезд. Для получения значений времени, расстояний и углов проделаем следующее: > sol :=solve(diff(ang, t), t) ; 1 1 1 1 sol := 5202305 , 5202305 2 8810 2 8810 > evalf([sol]); [ .7588940067, .2411059933 ] > asol :=evalf([seq(subs(t=sol[i], ang), i=1..2)]); asol := [ -.2355710897, .0903370978 ] > dsol :=evalf([seq(subs(t=sol[i], [x, y]), i=1..2)]); dsol := [ [ 424.8287602, -912.3424796 ], [ 1337.171240, 912.3424796 ] ] > evalf([seq(convert(asol[i], degrees), i=1..2)]); [ 13.49722921 degrees, 5.175934435 degrees ] Итак, локальный максимум угла зрения Билла составляет около пяти градусов (degrees) спустя приблизительно 0.24 минуты после того, как он увидел поезд и около 912 метров перед тем, как он пересек переезд. Его максимальный угол зрения (около 13.5 градусов) на поезд был около 0.76 минут и 912 метров после того, как Билл пересек переезд. a a dx Упражнение 59. Найти первообразную функции , т.е. 2 2 bc x bc x Упражнение 60. Нижний свободный угол листа книги размерами 20 на 15 сантиметров загибается к корешку и разглаживается так, чтобы линия сгиба была минимальна. Какова при этом величина угла между линией сгиба и нижним краем листа? 9 ТЕХНИКА ИНТЕГРИРОВАНИЯ И ЕЕ ПРИМЕНЕНИЯ 9.1 Задачи символьного интегрирования Для того, чтобы попрактиковаться в интегрировании, вы можете воспользоваться пакетом (student package) из Maple. Сначала загрузим этот пакет, написав > with(student): Затем следует внимательно ознакомиться со словами changevar, intparts и value, уделяя особое внимание примерам. Вот некоторые из них. 84 9.1.1 Замена переменной Интегрирование с помощью замены переменной (by substitution) основано на правиле дифференцирования сложной функции (chain rule). Так, если мы имеем интеграл, который выглядит как f( g( x ) ) g( x ) dx , тогда, меняя переменную g( x ) u , и полагая x du g( x ) dx , мы получим новый, возможно, более простой интеграл f( u ) d u . В x Maple этот приём выполняется с использованием слова changevar из пакета student. Например, нам нужно найти первообразную (antiderivative) > F := Int(1/sqrt(1+sqrt(x)), x); 1 F := 1 x d x Давайте заменим переменную так: sqrt(x)=u: > G := changevar(sqrt(x)=u, F); u G := du 2 1u По-видимому, это нам не поможет. Снова попробуем: 1+sqrt(x)=u. > G := changevar(1+sqrt(x)=u, F); 12 uu 2 G := 2 du u Сейчас, кажется, задача упростилась. Оценим: > G := value(G); 4 G := csgn( 1u ) u ( u3 ) 3 Теперь сделаем обратную подстановку и добавим константу интегрирования: > F := subs(u=sqrt(x), G) + C; ( 1/4 ) 4 F := csgn( 1 x ) x ( x 3 )C 3 Итак, ответ получен. Метод интегрирования заменой переменной обычно используется в случае, когда исходный интеграл близок к табличному, но не совпадает с ним. 9.1.2 Интегрирование по частям Метод интегрирования по частям (integration by parts) основан на правиле дифферен цирования произведения функций. Он обычно записывается в виде u d vuvv d u . Этот метод сводит одну задачу к другой, возможно, более простой. Как только вы решили интегрировать по частям, перед вами встает задача: что принять за u? Например: > F := Int(x^2*arctan(x), x); 2 F := x arctan( x ) d x 2 Нужное нам слово - intparts. Давайте сделаем замену ux : 85 > G := intparts(F, x^2); 1 1 2 G := x2 x arctan( x ) ln( 1x2 ) 2 x x arctan( x ) ln( 1x ) d x 2 2 Видимо, это был плохой выбор. Попробуем так: u arctan( x ) . Тогда > G := intparts(F, arctan(x)); 1 x3 1 3 G := arctan( x ) x 3 1x2 d x 3 Этот результат гораздо лучше. Разделим правую часть на два слагаемых и выберем второе: > H := op(2, G); 1 x3 H := 3 1x2 d x Теперь превратим интеграл (подынтегральное выражение) в правильную дробь, используя слово parfrac. > H:= Int(convert(integrand(H), parfrac, x), x); 1 x H := dx x 33 x2 3 Этот интеграл равен сумме табличных интегралов, поэтому запишем ответ: > H1 := 1/6*x^2 - 1/3*1/2*ln(1+x^2); 1 1 H1 := x2 ln( 1x2 ) 6 6 Давайте проверим, используя слово value: > simplify(value(H-H1)); 1 ln( 3 ) 6 Заметьте, что разность равна константе, что верно для первообразных. Задача правильного выбора (что принять за u?) часто может быть решена при знании правила ETAIL: Если у интеграла есть экспоненциальный множитель (Exponential factor), примите его за u, иначе, если имеется тригонометрический множитель (Trigonometric factor), то пусть он будет u, иначе выберите алгебраический множитель (Algebraic factor) за u, иначе - обратную тригонометрическую функцию (Inverse trig function), и наконец, как последнее средство, - логарифмический множитель (Logarithmic factor). Пусть остальное будет dv. 9.1.3 Тригонометрические подстановки Попытаемся найти первообразную одной из функций: > F := Int(x^3/sqrt(x^2+1), x); x3 F := dx 2 1 x 2 Присутствие здесь x 1 предполагает замену переменной x tan ( t ) . Попробуем: > G := changevar(x=tan(t), F, t); 3 2 G := tan( t ) 1tan( t ) d t 86 Теперь используем тригонометрическое тождество 1tan( t ) sec( t ) : G := subs(sqrt(1+tan(t)^2)=sec(t), G); 3 G := tan( t ) sec( t ) d t Вторая подстановка: G:=subs(tan(t)^3=(sec(t)^2-1)*tan(t), G); 2 G := ( sec( t ) 1 ) tan( t ) sec( t ) d t Сделаем замену переменной H := changevar(sec(t)=u, G); 2 H := u 1 d u Теперь получен табличный интеграл. Вычислим его: H := value(H); 1 H := u 3u 3 Проделаем обратные замены переменных: G := subs(u=sec(t), H); 1 G := sec( t )3sec( t ) 3 F := subs(t = arctan(x), G); 1 F := sec( arctan( x ) )3sec( arctan( x ) ) 3 F := subs(sec(arctan(x))=sqrt(1+x^2), F) + C; ( 3/2 ) 1 F := ( 1x2 ) 1x2 C 3 Проверим наш расчет: F1 := int(x^3/sqrt(x^2+1), x); 1 2 F1 := x2 1x2 1x2 3 3 На первый взгляд между F и F1 заметна разница, но есть ли она? simplify(F-F1); C Да, есть разница, но лишь на константу. 2 > > > > > > > > > 2 9.1.4 Интегрирование рациональных функций Пусть требуется проинтегрировать рациональную функцию > y :=(4*x^2+x -1 )/(x^2*(x-1)*(x^2+1)); 4 x2x1 y := 2 x ( x1 ) ( 1x2 ) Сначала надо превратить ее в совокупность простых дробей (partial fractions): > y := convert(y, parfrac, x); 1 1 32 x y := 2 2 x1 1x2 x Теперь почти все члены суммы могут быть проинтегрированы, за исключением последнего. Запишем: 87 > F := Int(y, x); 1 1 32 x F := dx 2 2 x1 1x2 x Применим слово expand: > F := expand(F); 1 1 x 1 F := d x3 d x 2 dx 2 d x2 2 x 1 x 1 x 1x2 Имеем сумму табличных интегралов. Осталось применить слово value: > F := value(F) + C; 1 F := 2 ln( x1 )ln( x21 )3 arctan( x ) C x В следующих упражнениях для вычисления интегралов примените слова из пакета student. Упражнение 61. Найти площадь области, заключенной между осью x и кривой yx sin( x ) на интервале [ 0, ] . Нарисовать эту область. Затем найти прямую с уравнением xa , которая делит эту область на две равные части, и изобразить ее. 2 Упражнение 62. Найти длину части графика параболы yx от точки O(0,0) до точ2 ки P(10,100). Найти точку Q( a, a ) на графике, которая удалена от точки О на 10 единиц вдоль графика. Нарисовать схему, показывающую точки O, P и Q на графике. Упражнение 63. Найти объем тела, полученного вращением вокруг оси х области, x лежащей между графиком функции ye sin( x ) на интервале [ 0, n ] и осью x. Изобразить график этой функции. Стремится ли этот объем к конечному пределу при возрастании n? 9.2 Задачи численного интегрирования Если вы имеете дело с определенным интегралом, который нужно вычислить с заданной точностью, то нужно воспользоваться подходящей формулой или правилом численного интегрирования, таким как, например, формула трапеций или правило Симпсона. Пакет student содержит слова и для этих правил. Но возможно, вы уже и знаете, что, написав evalf(int(f(x),x=a..b);, вы применяете численный метод для вычисления определенного интеграла. 9.2.1 Формула трапеций Формула трапеций (trapezoid rule) названа так потому, что для аппроксимации интеграла (площади под кривой) используется сумма площадей трапеций. Эта формула в Maple определена словом trapezpoid из упомянутого пакета, например: > student[trapezoid]( f(x), x=a..b, n) ; 1 n1 1 1 ( ba ) 2 a j1 a j ( ba ) b 1 n 2 n Упражнение 64. Получить формулу трапеций непосредственно из определения плоbase ( h1h2 ) щади отдельной трапеции как , где h1 и h2 - высоты трапеции, base - ее 2 основание. 88 Ниже приведена процедура Maple, которая изображает ситуацию при использовании формулы трапеций. Здесь f - интегрируемая функция, а и b - начало и конец интервала интегрирования, n - число подынтервалов разбиения. > drawtrap := proc(f, a, b, n) local dx, div, traps, i, tn, nn, ai, aim1, fai, faim1, clr; if n > 50 then RETURN(`Too many subdivisions..`) fi; dx := evalf((b-a)/n); div := (a, dx, i) -> evalf(a+i*dx); traps := plot(f, a..b, thickness=2, color=black): for i from 1 to n do aim1 := div(a, dx, i-1); ai := div(a, dx, i); faim1 := evalf(f(aim1)); fai := evalf(f(ai)): clr := tan; if faim1*fai <= 0 then clr := yellow fi; if faim1 <= 0 and fai <= 0 then clr := aquamarine fi; traps := traps, plots[polygonplot]([[aim1, 0], [ai, 0], [ai, fai], [aim1, faim1]], color=clr) od; tn := evalf(student[trapezoid](f(x), x=a..b, n)); ### WARNING: semantics of type `string` have changed tn := convert(tn, string); ### WARNING: semantics of type `string` have changed nn := convert(n, string); plots[display]([traps], title=cat(`T`,nn,` = `, tn)); end: Применим эту процедуру для функции sin: > drawtrap(sin, 0, 3*Pi, 8); 1 ( x2 ) e d x , используя Задача 27. Применить student[trapezoid] для оценки 0 от 10 до 50 подынтервалов разбиения. 89 Решение: > for i from 1 to 5 do evalf(student[trapezoid](exp(x^2), x=0..1, 10*i)) od; 1.467174692 1.463783892 1.463155038 1.462934871 1.462832952 Глядя на эту последовательность, можно убедиться, что значение интеграла находится между 1.46 и 1.47. Имеется теорема, которая устанавливает границы ошибки при использовании формулы трапеций. f( x )K1 для всех x Теорема. Если имеется положительное число K1 , такое, что x b из интервала [a,b], тогда модуль ошибки K1 ( ba )2 2n f( x ) d xtrap n a составляет не более чем , где trapn - аппроксимация интеграла по формуле трапеций. 2 (x ) 2 (x ) Например, производная функции e равна 2 x e , и, ясно, что максимум производной на интервале [0,1] лежит при x=1, поэтому мы можем принять K12 e . Для того, чтобы модуль ошибки интегрирования при использовании формулы трапеций с n разбиениями был меньше, чем, скажем, 0.01, надо согласно приведенной теореме выбрать n та2 e 12 ким, чтобы удовлетворялось неравенство 2 n .01 . Решая его, > solve(2*exp(1)*1^2/(2*n) <= 1/100, n); RealRange( , Open( 0 ) ), RealRange( 100 e , ) получим: > evalf(100*exp(1)); 271.8281828 Отсюда видно, что принимая n = 272 мы удовлетворим критерию точности, хотя и придется проделать много вычислений. Упражнение 65. Используя теорему, найти значение n, такое, что если 1 cos( x2x ) d x оценивается по формуле трапеций с n разбиениями, то модуль ошибки 0 составляет не более 1/1000 от точного значения интеграла. Непосредственно убедиться в этом, используя слово trapezoid. 9.2.2 Правило Симпсона Правило Симпсона (Simpson's rule) названо в честь его открывателя, который (Симпсон) предложил его в начале XVIII века. Оно получено интерполяцией квадратичной функции по трем точкам (концам и средине интервала) и использованием аппроксимации подынтегральной функции набором квадратичных. Так, если квадратичную функцию обозначить quad, то quad(a)=f(a), quad(b)=f(b) и quad((a+b)/2)=f((a+b)/2). Используя это, мы можем записать: 90 > restart; > quad := x->f(a) + (f(b)-f(a))/(b-a)*(x-a) + d*(x-a)*(x-b); ( f( b )f( a ) ) ( xa ) quad := xf( a ) d ( xa ) ( xb ) ba и можем определить d, решив уравнение > eq := quad((a+b)/2)= f((a+b)/2); 1 1 ( f( b )f( a ) ) a b 2 1 1 1 1 1 1 2 eq := f( a ) d a b a b f a b ba 2 2 2 2 2 2 Тогда: > d := solve(eq, d); 1 1 f( a )f( b )2 f a b 2 2 d := 2 2 2 b 2 b aa и > quad(x); f( a )f( b )2 f 1 a1 b ( xa ) ( xb ) ( f( b )f( a ) ) ( xa ) 2 2 f( a ) 2 ba b22 b aa 2 Вычислим интеграл от этой функции: > int(quad(x), x=a..b); f( a )f( b )2 f 1 a1 b ( b3a 3 ) 2 2 2 1 2 2 3 2 b 2 b aa f( a )f( b )2 f 1 a1 b a f( a )f( b )2 f 1 a1 b b f( b )f( a ) 2 2 2 2 2 2 ba b22 b aa 2 b22 b aa 2 2 ( b a 2 )f( a ) ( ba )( f( b )f( a ) ) a f( a )f( b )2 f 1 a1 b a b ( ba ) 2 2 2 b22 b aa 2 Теперь упростим результат и представим его в виде произведения сомножителей: > simplify(%); 1 2 1 1 1 1 2 1 1 1 f( a ) a f a b a f( b ) a f( a ) b f a b b f( b ) b 6 3 2 2 6 6 3 2 2 6 > factor(%); 1 1 1 ( ba ) f( a )4 f a b f( b ) 6 2 2 Так выглядит правило Симпсона для одного подынтервала. Правило Симпсона с четным числом n подынтервалов имеется в пакете student. Например, применим его для экспоненты: > for i from 1 to 5 do evalf(student[simpson](exp(x^2),x=0..1,10*i)) od; 91 1.462681400 1.462653625 1.462652118 1.462651864 1.462651794 Как видно, правило Симпсона быстрее приводит к точному результату, чем правило трапеций. Имеется теорема, которая управляет ошибкой этого правила. 4 f( x )K4 для Теорема. Если можно указать положительное число K4 , такое, что x 4 b всех x из интервала [a,b], тогда модуль ошибки f( x ) d xSn составляет не более, чем a K4 ( ba )5 180 n 4 . Эту теорему можно применить для определения такого значения n, что модуль ошиб1 ( x2 ) e dx составляет не боки, возникающей при оценке по правилу Симпсона интеграла 0 лее, чем 1/100. Четвертая производная равна > diff(exp(x^2), x, x, x, x); 2 (x ) 2 (x ) 2 (x ) 12 e 48 x2 e 16 x4 e Имеется максимум при x=1, поэтому можем принять K476 e . Теперь решим нера- венство относительно n: > solve(76*exp(1)*1^5/(180*n^4)<= 1/100, n); ( 1/4 ) ( 1/4 ) ( 1/4 ) ( 1/4 ) 1 1 RealRange , 380 3 (e ) 3 ( e ) , , RealRange 380 3 3 Можем полагать n любым четным числом не меньше, чем > evalf(1/3*380^(1/4)*3^(1/2)*exp(1)^(1/4)); 3.273097124 Мы можем проверить эту оценку, применив разбиение интервала на 4 подынтервала, используя evalf(int) для вычисления значения интеграла с точностью до 10 знаков и полагая это точным значением: > truevalue := evalf(int(exp(x^2), x=0..1)); truevalue := 1.462651746 Оценим приближенное значение: > approxvalue := evalf(student[simpson](exp(x^2), x=0..1, 4)); approxvalue := 1.463710760 и найдем разницу > approxvalue - truevalue; .001059014 Итак, мы видим, что теорема предсказывает правильно. Упражнение 1 66. Используя теорему, найти такое значение n подынтервалов для оцен2 ки интеграла cos( x x ) d x по правилу Симпсона, чтобы модуль ошибки не превосхо дил 10-3 точного0 значения. Использовать student[simpson] для того, чтобы убедиться в правильности такой оценки. Кроме того, используя evalf(int(..)), 92 проверить, что значение n, определяемое теоремой, достаточно для прогноза значения интеграла с заданной точностью. Упражнение 67. Если вы примените правило Симпсона с двумя подынтервалами к кубической функции, то получите точный ответ. Проверьте это утверждение для функции 5 x32 x25 x3 . Докажите сказанное выше, используя теорему, дающую оценку ошибки правила Симпсона. Упражнение 68. Используйте оценку ошибки правила Симпсона для рекомендации о применении этого правила с шестью подынтервалами для аппроксимации ln(3). Примените evalf(int(...)) для вычисления truevalue и проверьте, что при этом фактическая ошибка меньше оценки ошибки. Ниже описана схема решения. Прежде всего, определим функцию и вычислим ее четвертую производную: > f := x -> 1/x; 1 f := x x > f4 := diff(f(x), x, x, x, x); 1 f4 := 24 5 x Эта производная максимальна на левой границе интервала [1, 3], поэтому > K[4] := 24; K4 := 24 Граница ошибки, определяемая теоремой, равна > sbound := K[4]*(3-1)^5/(180*6.^4); sbound := .003292181069 Поэтому ошибка меньше, чем 15.10-3. Упражнение 69. Интеграл sin( x ) d x трудно оценить с точностью до 10-3 с помо0 щью формулы трапеций или правила Симпсона. Во-первых, теорема об оценке ошибки неприменима. Почему? Но, если мы сделаем замену переменной sqrt(sin(x))=u, то мы получим новый интеграл, к которому эту теорему можно применить. Почему? Как много нужно подынтервалов при использовании правила Симпсона для оценки нового интеграла с точностью до 10-3? Это упражнение показывает, что метод замены переменной полезен и при численном интегрировании. Указание: Вот эта замена: > Int(sqrt(sin(x)),x=0..1)=student[changevar] (sqrt(sin(x))=u, Int(sqrt(sin(x)), x=0..1)); sin( x ) d x 0 0 sin( 1 ) 1 2 u2 1u 4 du 9.2 Полиномы Тэйлора Предположим, что n-ая производная функции y f( x ) определена при x a . Тогда n-ый полином Тэйлора (Taylor polynomial) для f при x a определен следующим соотношением: > restart: 93 > p[n](x) = sum((D@@i)(f)(a)/i!*(x-a)^i, i=0..n); n pn( x ) i0 (i) ( D )( f )( a ) ( xa )i i! Остаток ряда Тэйлора (Taylor remainder) определяется как Rn( x ) f( x )pn( x ) . В словаре Maple имеется слово taylor, которое вычисляет полиномы Тэйлора. Предположим, мы хотим найти одинадцатый полином Тэйлора для функции sin(х) при x=0. Тогда запишем: > p11 := taylor(sin(x), x=0, 12); 1 1 5 1 7 1 1 p11 := x x3 x x x9 x11O( x12 ) 6 120 5040 362880 39916800 Вычисленный p11 еще не собственно полином из-за последнего члена, который сигнализирует о точности вычислений. Но его можно превратить в полином словом convert: > p11 := convert(p11, polynom); 1 1 5 1 7 1 1 p11 := x x3 x x x9 x11 6 120 5040 362880 39916800 Полиномы Тэйлора обычно хорошо аппроксимируют выбранную функцию в окрестности точки a. Давайте нарисуем несколько первых полиномов для функции sin(х) при x =0. > sinplot := plot(sin, -Pi..2*Pi, thickness=2): > tays:= plots[display](sinplot): for i from 1 by 2 to 11 do tpl := convert(taylor(sin(x), x=0, i), polynom): tays := tays, plots[display]([sinplot, plot(tpl, x=-Pi..2*Pi, y=-2..2, color=black, title=convert(tpl, string))]) od: > plots[display]([tays], view=[-Pi..2*Pi, -2..2]); Теорема, приведенная ниже, определяет степень аппроксимации функции полиномами Тэйлора. Теорема Тэйлора (об остатке ряда Тэйлора). Если (n+1)-ая производная функции f определена и ограничена по абсолютной величине числом M на интервале от a до x, то остаток ряда Тэйлора (ошибка аппроксимации этой функции n-ым полиномом Тэйлора) ( n 1 ) M xa удовлетворяет соотношению: Rn( x ) . ( n1 )! Эта теорема очень важна при аппроксимации функции рядом (полиномом) Тэйлора, т.к. она позволяет понять, какой полином надо использовать. Вот пример. 94 x Задача 28. Найти второй полином Тэйлора p[2] для f(x)= ln(x)sin( e )+1 при x =1. Изобразить этот полином и функцию f на интервале [0.5, 1.5]. Определить максимальную ошибку при использовании p[2] при аппроксимации f(x) на этом интервале. Решение: > restart: f := x -> ln(x)*sin(exp(x))+1; f := x ln ( x ) sin ( e x ) 1 > fplot := plot(f, .5..1.5, thickness = 2): > p[2] := x -> sum((D@@i)(f)(1.)/i!*(x-1.)^i, i=0..2); (i) 2 ( D )( f )( 1. ) ( x1. )i p2 := x i! i0 > p[2](x); .5892187091.4107812909 x2.683740378 ( x1. )2 > t2 := unapply( convert(taylor(f(x), x=1, 3), polynom), x); 1 t2 := x1sin( e ) ( x1 ) cos( e ) e sin( e ) ( x1 )2 2 > tplot := plot(t2, 1..1.5, color=black): > plots[display]([fplot, tplot]); Для того, чтобы применить теорему о тэйлоровом остатке, мы должны найти верхнюю границу M для третьей производной функции f. Для этого мы, в принципе, можем изобразить эту производную, а затем «на глаз» оценить значение M. Вот как это делается: > plot((D@@3)(f), .5..1.5); Очевидно, можно выбрать M = 75. Итак: > M := 75; M := 75 Тогда остаток R2 = f(x) – p2(x) ограничен числом > M/3!*(1.5-1)^3; 95 1.562500000 Из сравнительного графика функции f и полинома видно, что действительная ошибка составляет не более чем 0.1 на интервале [0.5, 1.5]. Задача 29. Какой полином Тэйлора нужно выбрать для аппроксимации функции sin(х) на интервале от -Pi до Pi с точностью около 10 -6 ? Решение: Вспоминаем, что 1 является предельным значением модуля любой производной интересующей нас функции на любом интервале. Поэтому нужно решить неравенство > ineq := 1/n!*Pi^n <= 1/10^6; n 1 ineq := n! 1000000 для n. Слово solve здесь не очень подходит, т.к. мы имеем дело с факториалом, но зато можно найти наименьшее значение n, организуя циклический расчет: > n := 1: while evalf(1/n!*Pi^n) > 1/10^6 do n := n+1 od: print (`take n to be `, n); take n to be , 17 Проверим: > (seq(evalf( 1/n!*Pi^n), n=15..20)); .00002191535349, .4303069596 10 -5, .7952054018 10 -6, .1387895250 10 -6, .2294842906 10 -7, .3604730807 10 -8 Теперь найдем нужный нам полином Тэйлора и построим его график: > restart; > t17 := convert(taylor(sin(x), x=0, 18), polynom); 1 1 5 1 7 1 1 1 t17 := x x3 x x x9 x11 x13 6 120 5040 362880 39916800 6227020800 1 1 x15 x17 1307674368000 355687428096000 > plot(t17, x=-Pi..Pi); Довольно похоже на функцию sin(х). Упражнение 70. Показать, что cos( x ) можно аппроксимировать с точностью до семи x2 x4 x6 x8 1 знаков после запятой выражением для всех x из интервала 2! 4! 6! 8! , . 4 4 Упражнение 71. Применить taylor и convert(.., polynom) для получения полиномов и построения графиков на определенном выше интервале (упр. 69), первых 96 нескольких полиномов Тэйлора следующих функций. Проанализировать и прокомментировать сходимость полиномов к функциям: f( x )ln ( x ) при x=1, на интервале [-1,3], 1 f( x ) при x=0 на интервале [-2,2], f( x ) arctan ( x ) при x = 0 на интервале [-2..2] . 1x Упражнение 72. Написать процедуру для вычисления sin(x) для произвольного x, используя пятый полином Тейлора. Ограничиться интервалом [0, Pi/4]. Схема решения следующая: Если x отрицателен, заменить x на -х и использовать свойство нечетности функции: sin ( x ) sin ( x ) . Если x больше или равен 2, то заменить x на x-2 и использовать периодичность: sin ( x ) sin ( x 2 ) . Повторить этот шаг до [0, 2]. Если /4<x</2, то использовать тригонометрическое тождество sin ( x )1sin x и аппроксимировать 2 sin x посредством p5 x . Если x и x , то sin ( x ) sin ( x ) . Если 2 2 2 x и x 2 , то sin ( x ) sin ( x ) . Упражнение 73. Найти наименьшее n, такое, что n-ый полином Тэйлора p[n](x) ( 12 ) x для ye при x0 аппроксимирует exp(x) с точностью до 10 для x на интервале [0, 1]. (Возможно, что для этого потребуется установить Digits:=15 или что-то в этом роде). 9.4 Последовательности и ряды 9.4.1 Последовательности Ранее мы уже говорили о последовательностях. Одна из них - последовательность оценок решения некоторого уравнения методом Ньютона. Другая - последовательность оценок интеграла от некоторой функции на интервале, получаемая последовательным разбиением его на все большее число подынтервалов. Это примеры бесконечных последовательностей, сходящиеся (converge), как мы надеемся к ответу, который мы ищем, будь то решение уравнения или значение интеграла. Формально, последовательность чисел (sequence of numbers) определяется как функция f, область определения которой является множеством натуральных чисел. Члены последовательности - значения этой функции. Так, например, десятый член последовательности f - это f(10). Последовательность f сходится к пределу (converges to a limit) L, если каждый интервал, содержащий L, содержит конечное множество членов последовательности. В этом случае мы можем написать lim f( n )L . n Слово limit из словаря Maple может быть использовано для вычисления пределов многих последовательностей, например: > limit((1+1/n)^n, n=infinity); e Следующие теоремы характеризуют свойства сходящихся последовательностей. Теорема: Если an - возрастающая последовательность (т.е., aiai1 для всех i ), то an сходится при условии, что существует верхняя граница общего члена an . 97 Теорема: Если an сходится к L и bn сходится к M , то an bn сходится к LM , anbn сходится к LM , и anbn сходится к LM . Также, если M0 , то an bn сходится к L . M Теорема: Если an - последовательность положительных чисел и bn - последовательность, которая сходится к нулю, то при условии anbn для всех n , an сходится к нулю. Теорема: Если f непрерывна при xL , и an - последовательность, сходящаяся к L , то последовательность f( an ) сходится к f( L ) . 9.4.2 Периодические точки функций Пусть задана функция f и a - точка внутри ее области определения. Если любое значение f также принадлежит ее области определения, то мы можем организовать последовательность итераций (sequence of iterates) для расчета значений a следующим образом: a1f( a ) , a2f( a1 ) , и в общем, an1f( an ) для каждого натурального n. Если n такое натуральное число, что ana , но aia для всех натуральных i < n, то a называется периодической точкой периода n для функции f. Точки с периодом n=1 называются неподвижными или фиксированными точками (fixed points). Неподвижные точки можно обнаружить, заметив, где пересекаются графики y f( x ) и y x . Например, функция cos(х) имеет одну неподвижную точку, в чем нетрудно убедиться: > plot({cos(x), x}, x=-Pi..Pi); Для того, чтобы быть более точными, используем fsolve: > fix := fsolve(cos(x)=x, x, 0..Pi); fix := .7390851332 Притягивающая точка (attracting fixed point) - это неподвижная точка с таким свойством, что для точек b, близких к a, > limit(b[n], n=infinity) = a; lim bna n где b1b и bnf( bn1 ) для n 2, 3 ... Отталкивающая точка (repelling fixed point) - это неподвижная точка с таким свойством, что для точек b, близких, но неравных a, limit(b[n], n=infinity) <> a; 98 lim bna n где b1b и bnf( bn1 ) для n 2, 3 , ... . Вот простая процедура для исследования периодических и неподвижных точек функции: > iterate := proc(f, n, x) local a, i, s; a := evalf(x); s := a; for i to n do a := f(a); s := s, a od end: Например, для того, чтобы исследовать является ли неподвижная точка функции cos(х) притягивающей или нет, мы можем итерировать эту функцию в точке близкой к неподвижной. Используем неподвижную точку функции cos(х): > fix := fsolve(cos(x)=x, x); fix := .7390851332 и организуем итерации: > iterate(cos, 10, fix-1), fix; -.2609148668, .9661543793, .5684675409, .8427269503, .6654297419, .7866515363, .7062199575, .7608204115, .7242705678, .7489829351, .7323817612, .7390851332 Похоже, что неподвижная точка является притягивающей. Если же мы посмотрим на неподвижные точки функции 2x(1-x), > f := x-> 2*x*(1-x); f := x2 x ( 1x ) > fix := fsolve(f(x)=x, x); fix := 0, .5000000000 и организуем итерации около первой из них (слева) > iterate(f, 10, fix[1]-.2); -.2, -.48, -1.4208, -6.87894528, -108.3976669, -23716.90372, -.1125030478 10 10, -.2531387156 10 19, -.1281584187 10 38, -.3284916056 10 75, -.2158134698 10 150 и справа > iterate(f, 10, fix[1]+.1); .1, .18, .2952, .41611392, .4859262512, .4996038592, .4999996862, .5000000000, .5000000000, .5000000000, .5000000000 и около второй (справа) > iterate(f, 10, fix[2]+.4); .9000000000, .1800000000, .2952000000, .4161139200, .4859262512, .4996038592, .4999996862, .5000000000, .5000000000, .5000000000, .5000000000 то убедимся, что 0 - отталкивающая неподвижная точка, а 0.5 - притягивающая. Определим специальное слово для визуализации viterate, показывающее, куда мы движемся при итерациях. Мы должны будем ввести start- точку начала итераций, domain - область определения и range - область значений для задания графического окна. > viterate := proc(f, n, start, domain, range) local a, i, s, gra, gpl, fpl, ipl; a := evalf(start); gra := [a, f(a)]; for i to n do a := f(a); gra := gra, [a, a], [a, f(a)]; od: gpl := plot([gra], color=red); 99 fpl := plot(f, domain, color=black); ipl := plot(x->x, domain, color=blue); print(plots[display]([gpl, fpl, ipl], view=[domain, range])); end: Проверим: > viterate(x->2*x*(1-x), 10, .8, -1..1, -1..1); Получился прекрасный инструмент для визуализации исследований неподвижных и периодических точек различных функций. Упражнение 74. Примените iterate или viterate для исследования большего числа начальных точек вблизи неподвижной точки функции cos(х). Сможете ли вы теперь быть уверены, что это отталкивающая неподвижная точка? Схема решения: > fx := fsolve(cos(x)=x, x); fx := .7390851332 > viterate(cos, 10, .1, -1..2, -1..1); Упражнение 75. Найдите периодические точки порядка 2 для функции y2 x ( 1x ) . Замечание: Периодическими точками порядка 2 для f будут неподвижные точки для (2) f , которые не являются неподвижными точками для f. Классифицируйте их как отталкивающие, притягивающие или нейтральные. Задача 30. Пусть an является последовательностью положительных чисел, сходящейся к нулю. Представьте, что вы, стартуя из начала координат, движетесь к востоку на a1 километров, затем поворачиваете на север и проходите a2 км, затем - на запад a3 км, и т.д., циклически меняя направление и проходя последовательность an . Где вы закончите движение? Как далеко вы уйдете вдоль по этой траектории? Ответьте на эти вопросы для по1 1 следовательностей и n . n 2 100 Решение: Обозначим точку конца пути через [x, y]. Тогда x= a1a3a5a7 ... , знакопеременная сумма нечетных членов последовательности an , а y - знакопеременная сумма четных членов той же последовательности. Итак, для последовательности > a := n-> 1/n; 1 a := n n > x = sum((-1)^n*a(2*n+1), n=0..infinity); 1 x 4 > y = sum((-1)^n*a(2*(n+1)), n=0..infinity); 1 y ln( 2 ) 2 а для последовательности > a := n-> 1/2^n; 1 a := n n 2 > x = sum((-1)^n*a(2*n+1), n=0..infinity); 2 x 5 > y = sum((-1)^n*a(2*(n+1)), n=0..infinity); 1 y 5 Общая длина пути вдоль траектории движения (distance) является суммой всех отрезков пути. Поэтому, для последовательности > a := n->1/n; 1 a := n n > 'distance' = sum(a(n), n=1..infinity); distance эта величина равна бесконечности! Это очень удивительно, поскольку всякий раз после поворота мы проходим меньший путь, чем перед этим. Напротив, для последовательности > a := n->1/2^n; 1 a := n n 2 > 'distance' = sum(a(n), n=1..infinity); distance1 эта величина равна всего лишь единице. Задача 31. Предположим, мы хотим нарисовать траектории описанного выше движения. Вот процедура, которая поможет сделать это. Примените ее для рисования траекто1 рий путешественника, использующего в своих странствиях последовательности an и n 1 an n . 2 > cycle := proc(a, m) local path, i, dir, x, y, pt, ed; 101 x := evalf(sum((-1)^n*a(2*n+1), n=0..infinity)); y := evalf(sum((-1)^n*a(2*(n+1)), n=0..infinity)); path := [0, 0]; dir := 1, 0; for i from 1 to m do path := path, [path[i][1]+dir[1]*a(i), path[i][2]+dir[2]*a(i)]; dir := -dir[2], dir[1]; od; pt := plot([path], scaling=constrained, color=red, ness=2); ed := plot({[x, y]}, style=point, symbol=box): plots[display]([pt,ed],title=cat("end at",convert([x,y],string))); end: Решение: Для последовательности 1/n (15 шагов - отрезков пути): > cycle(n->1/n, 15); thick- Для другой последовательности (то же число шагов): > cycle(n->1/2^n, 15); 9.4.3 Ряды Определение: Ряд (series) an состоит как бы из двух последовательностей: после- n 1 n довательности an членов ряда и последовательности Sn ai частичных сумм ряда. i1 102 Если последовательность частичных сумм сходится к пределу L, то говорят, что ряд схо дится к L и пишут anL . n 1 Предположим, вы как-то установили, либо непосредственно, либо с помощью некоего алгоритма, что ряд сходится к числу L. Как нам вычислить это число с заданной точностью? Не удивительно, что Maple может суммировать большое число рядов. Например, для Maple не составляет труда вычислить сумму геометрического ряда (geometric series): > restart; > Sum(a*r^n, n=0..infinity)=sum(a*r^n, n=0..infinity); a a rn r1 n 0 Maple знает, что гармонический ряд (harmonic series) расходится: > sum(1/n, n=1..infinity); Maple также знает, как вычислить суммы сходящихся степенных рядов (p-series) с показателем степени p. Например, для p=3 имеем: > Sum(1/n^3, n=1..infinity)=sum(1/n^3, n=1..infinity); 1 n3 ( 3 ) n 1 Здесь мы получили дзета-функцию Римана (Riemann Zeta function), которая определена для всех p>1 как сумма соответствующего степенного ряда. Поэтому, например, в рассмотренном выше случае имеем: > Zeta(3)=Zeta(3.); ( 3 )1.202056903 Если ряд сходится достаточно быстро, то вы можете непосредственно взглянуть на последовательность частичных сумм и сделать вывод о точности вычислений. Давайте посмотрим насколько быстро сходится рассмотренный выше степенной ряд с p=3 к значению Zeta(3): > for n from 10 by 100 to 300 do Sum(1/i^3, i=1..n)=evalf(sum(1/i^3, i=1..n)) od; 10 1 i 3 1.197531986 i1 210 1 1.202045619 3 i1 i Итак, сумма первых 110 членов ряда совпадает с точным результатом до четырех знаков после запятой. Тем не менее, в общем случае, глядя на первые несколько значений частичных сумм, нельзя быть уверенным в том, сходится ряд или расходится. Например, посмотрим на частичные суммы гармонического ряда: > seq(evalf(sum(1/i,i=1..100*n)),n=1..5); n:='n': 5.187377518, 5.878030948, 6.282663880, 6.569929691, 6.792823430 Да... Трудно судить о сходимости или расходимости этого ряда. Упражнения 75. В каждой из приведенных ниже задач требуется определить: сходится ряд или расходится. Мотивируйте ваш ответ для каждого случая. Для сходящегося ряда получите оценку его суммы с точностью до двух десятичных знаков, используя psums 103 или другое слово, придуманое вами. Можете проверить ряд суммированием с помощью слова sum, если Maple сможет с этим справиться. Рассмотрим несколько примеров 1 1) 2 n 1 ( 32 n ) Этот ряд сходится, что подтверждается сравнением со степенным рядом при p=2: 1 n 2 . Каждая частичная сумма его ограничена сверху значением ( 2 ) и частичные n 1 суммы образуют возрастающую последовательность, поэтому, как мы знаем, эта последовательность сходится. Проверяя, что нам ответит Maple, > sum(1/(3+2*n)^2, n=1..infinity)= evalf(sum(1/(3+2*n)^2, n=1..infinity)); 10 1 2.122589440 9 8 получим точную сумму. Проверим несколько частичных сумм: > seq(evalf(sum(1/(3+2*i)^2, i=1..100*n)), n=1..5); n:='n': .1201384783, .1213518178, .1217616252, .1219675488, .1220914312 Ряд сходится. 1 n ln ( n )2 2) n 2 1 Функция является убывающей для n>1 (проверьте, вычислив производную), n ln ( n ) 2 поэтому в этом случае можем применить интегральную оценку: > int(1/(n*(ln (n))^2), n=1..infinity); Поскольку интеграл расходится, то и ряд расходится. n 54 n 31 3) 9 4 n 0 2 n n 2 Этот ряд сходится, что подтверждается сравнением с рядом n6 . Оценим его n9 сумму: > evalf(int(( n^5+4*n^3+1)/ (2*n^9+n^4+2 ), n=1..infinity)); .4309605111 1 4) sin 4 n n 1 Этот ряд сходится, что ясно из сравнения его со степенным рядом при p=4. Оценим его сумму: > evalf(sum(sin(1/(n^4)), n=1..infinity)); .9237532120 1 5) 1 n 0 3 ( 2 n1 ) Этот ряд расходится, поскольку показатель степени p < 1 . 104 А теперь продолжите решать самостоятельно: 6) ne n 1 n 0 2 ( n ) 12 n 13 n . 9.4.4 Две необычные кривые Кривая-Снежинка (Snowflake Curve) впервые была описана Кохом как возможное решение задачи о непрерывной кривой, которая не имеет касательной ни в одной своей точке. Эта кривая определяется как предел последовательности кривых, порождаемых процедурой snowflake, приведенной ниже. Выполните все слова-процедуры под этим текстом и вы поймете, о чем идет речь. Первое слово выполняет базовую операцию над каждым сегментом, который мы полагаем множеством типа список, содержащим свои конечные точки. Оно заменяет упомянутый сегмент длиной d последовательностью четырех сегментов длиной d/3, полученных следующим образом. Начинаем с левого конца сегмента и перемещаемся на расстояние d/3 вдоль него, поворачиваем влево на 60 градусов и перемещаемся на такое же расстояние. Поворачиваем вправо на 60 градусов и проходим тот же путь, затем поворачиваем влево на 60 градусов и проходим расстояние d/3 единицы вдоль этого сегмента до его правого конца. Заметьте, что результирующий путь имеет три точки, где касательная не существует. > basic := proc(p1, p2) local dx, dy, p3, p4, p5; dx := (p2[1]-p1[1])/3.; dy := (p2[2]-p1[2])/3.; p3 := [p1[1]+dx, p1[2]+dy]; p4 := [p1[1]+2*dx, p1[2]+2*dy]; p5 := [p1[1]+1.5*dx-sqrt(3.)/2*dy, p1[2]+1.5*dy+sqrt(3.)/2.*dx]; p3, p5, p4, p2; end: Итак, например, если мы введем точки [0,0], [1,0] в basic, то получим такую последовательность чисел: > basic([0,0], [1,0]); [ .3333333333, 0 ], [ .5000000000, .2886751347 ], [ .6666666666, 0 ], [ 1, 0 ] Заметьте, что левая граничная точка исходного сегмента исчезла из этого списка. Это сделано по определенным причинам, которые станут ясны ниже, при определении и программировании слова flake. Слово flake берет список точек, которые представляют собой последовательность сегментов (отрезков), расположенных друг за другом, и возвращает список, содержащий в четыре раза больше сегментов в виде отрезков, где каждый сегмент в исходном списке заменен четырьмя посредством слова basic. > flake := proc(fl) local i, curve; curve := fl[1]; for i from 1 to nops(fl)-1 do curve := curve , basic( fl[i], fl[i+1] ); od end: 105 Теперь вместо точки получаем равносторонний треугольник: > curve := [[0,0], [1/2,1/2*sqrt(3)], [1,0], [0,0]]; 1 1 curve := [ 0, 0 ], , 3 , [ 1, 0 ], [ 0, 0 ] 2 2 Для изображения второго шага запишем: > plot([flake(curve)], scaling=constrained); А теперь можем определить n-ый шаг нашей кривой: > snowflake := proc(n) local i, curve, ti; curve := [[0,0], [1/2,1/2*sqrt(3)], [1,0], [0,0]]; for i from 2 to n do curve := [flake(curve)] od; ti := cat(n, `th stage of the snowflake curve`); plot(curve, color=black, style = LINE, axes = NONE, scaling = CONSTRAINED, title = ti) end: Сделаем, например, четыре шага: > snowflake(4); Вот анимация процесса роста кривой в виде снежинки. Кстати, различить можно лишь около пяти кадров. > plots[display]([seq(snowflake(i), i=1..5)], insequence=true, axes=none, scaling=constrained); 106 Ответим на вопрос: какова длина этой кривой? Для того, чтобы вычислить длину заметим, что на первом шаге длина составляет s1 3 единицы; на втором шаге имеем дли1 s( n1 ) s1 4 s1 ну s2s1 , или ; в общем, на n-ом шаге: sns( n1 ) или 3 3 3 ( n 1 ) 4 s1 . Итак, длина кривой на n-ом шаге стремится к бесконечности при возраста 3 нии n. Это говорит о том, что рассматриваемая кривая является бесконечно длинной. Давид Гильберт (David Hilbert) в 1891 году описал непрерывную кривую, длина которой измерялась линейной мерой в квадрате, например, в квадратных метрах (заполняющая пространство)! Это противоречило здравому смыслу того времени, согласно которому длина должна измеряться в линейных единицах, например, в метрах, но не в квадратных метрах. Ниже приводится слово-процедура Maple, которая изображает приближение (аппроксимацию) Пеано упомянутой кривой Гильберта, покрывающей собой плоское пространство. Подход к определению процедуры peano (см. ниже) подобен использованному при определении snowflake (см. выше). > basic := proc(p1, p2, p3) local dx, dy, p4, p5, p6, p7, p8, p9; p4 := .5*(p1+p2); p9 := .5*(p2+p3); p5 := p4+(p2-p9); p6 := p2+(p2-p9); p7 := p2+(p4-p1); p8 := p9+(p4-p1); p4, p5, p6, p2, p7, p8, p9, p3 ; end: > peano := proc(fl) local i, cur; cur := [ fl[1] ] ; for i from 1 by 2 to nops(fl)-2 do cur := [op(cur), basic( fl[i], fl[i+1], fl[i+2] )] od; > end: > fl := [[0,0], [1,1], [2,0]]; fl := [ [ 0, 0 ], [ 1, 1 ], [ 2, 0 ] ] Выполним четыре шага построения кривой, называемой кривой Пеано: > for i from 1 to 4 do fl := peano(fl) od: 107 ti := cat(4, `th stage of Peano's curve`): plot(fl, style=LINE, axes=NONE, title=ti,scaling=CONSTRAINED); 9.5 Дифференциальные уравнения 9.5.1 Терминология y( x )f( x ) или y'(x)=f(x), x где f является некоторой известной функцией аргумента x, а y - неизвестная функция от x. Уравнение решается посредством операции вычисления первообразной (antidifferentiation). Для этого применяется слово int. Например, для того, чтобы решить уравнение y'(x)= x^2*cos(x), нужно написать > y := int(x^2*cos(x), x) + C; y := x2 sin( x )2 sin( x )2 x cos( x )C Константа (постоянная) интегрирования C может быть определена, если известно хотя бы одно значение функции. Так, если y(3)=10, то можно получить значение C при решении уравнения: > Csol := solve(subs(x=3, y=10), {C}); Csol := { C7 sin( 3 )6 cos( 3 )10 } а затем подставить это значение в решение: > y := subs(Csol, y); y := x2 sin( x )2 sin( x )2 x cos( x )7 sin( 3 )6 cos( 3 )10 Изобразим найденное решение: > plot(y, x=-6..6); Простейшее дифференциальное уравнение имеет форму Теорема о единственности решения приведена ниже. Теорема: Если две функции имеют одинаковую производную на некотором интервале, то они отличаются на константу. 108 Дифференциальное уравнение (differential equation) - это уравнение, которое выражает связь между неизвестной функцией y и одной или более ее производными. Решением дифференциального уравнения является функция, удовлетворяющая ему тождественно. Задача с начальными значениями (Initial Value Problem или IVP) - это дифференциальное уравнение с некоторыми начальными условиями. Решением такой задачи является функция, удовлетворяющая как самому уравнению, так и начальным значениям. Порядок (order) дифференциального уравнения - это натуральное число n, показывающее наивысший порядок производной в рассматриваемом уравнении. Мы остановимся на уравнениях первого порядка вида y'=f(x,y). К этим уравнениям приводят многие интересные задачи. Слово Maple dsolve, получая на входе дифференциальное уравнение и, возможно, несколько начальных условий, предпринимает попытку решить уравнение. Для того чтобы проиллюстрировать, как работает dsolve , попробуем решить приведенное выше дифференциальное уравнение. > restart; Запишем дифференциальное уравнение > diffeq := diff(y(x), x)=x^2*cos(x); diffeq := y( x )x2 cos( x ) x и применим к нему dsolve: > dsolve(diffeq, y(x)); y( x )x2 sin( x )2 sin( x )2 x cos( x )_C1 Заметьте, что появилась константа интегрирования. Если мы учтем начальные условия, то dsolve определит эту константу: > inits := y(3) = 10; inits := y( 3 )10 > sol := dsolve({diffeq, inits}, y(x)); sol := y( x )x2 sin( x )2 sin( x )2 x cos( x )7 sin( 3 )6 cos( 3 )10 Теперь, для того, чтобы изобразить решение, мы должны изобразить лишь правую часть (rhs - right hand side) sol: > plot(rhs(sol), x=-6..6); или можем превратить sol в функцию словом unapply: > f := unapply(rhs(sol), x); f := xx2 sin( x )2 sin( x )2 x cos( x )7 sin( 3 )6 cos( 3 )10 В Maple имеется полезный пакет с названием DEtools. > with(DEtools); 109 [ DEnormal, DEplot, DEplot3d , DEplot_polygon, DFactor, Dchangevar, GCRD, LCLM , PDEchangecoords, RiemannPsols, abelsol, adjoint, autonomous, bernoullisol, buildsol, buildsym, canoni, chinisol, clairautsol, constcoeffsols, convertAlg, convertsys, dalembertsol, de2diffop , dfieldplot , diffop2de , eigenring, endomorphism_charpoly, equinv, eta_k, eulersols, exactsol, expsols, exterior_power, formal_sol, gen_exp, generate_ic, genhomosol, hamilton_eqs, indicialeq , infgen, integrate_sols, intfactor, kovacicsols, leftdivision , liesol, line_int, linearsol, matrixDE, matrix_riccati, moser_reduce, mult, newton_polygon, odeadvisor , odepde , parametricsol, phaseportrait, poincare, polysols, ratsols, reduceOrder, regular_parts, regularsp, riccati_system, riccatisol, rightdivision , separablesol, super_reduce, symgen, symmetric_power, symmetric_product, symtest, transinv, translate, untranslate, varparam, zoom ] Познакомиться с этими словами можно посредством системы Help. Рассмотрим одно из них. Слово dfieldplot очень подходит для качественного анализа поведения решения дифференциального уравнения y' = f(x,y). Например, для рассмотренного выше уравнения запишем > dfieldplot(diffeq, [y(x)], x=-6..6, y=-10..40, title=`The direction field of y' = x^2*cos(x).`); Глядя на график поля направлений, вы можете вообразить, как ведут себя кривые - решения этого уравнения. Другая характеристика решений дифференциального уравнения интегральная кривая. Еще одно понятие: изоклина (isocline) - это кривая, которая соединяет те точки поля направлений, где направления совпадают (угол наклона касательных одинаков). Например, изоклины рассмотренного выше уравнения являются вертикальными прямыми. Допустим, вам необходимо построить график поля направлений вручную. Тогда эта работа будет гораздо легче, если сначала нанести на график несколько изоклин. 9.5.2 Задачи, приводящие к уравнениям первого порядка Задача 32 (о баке с раствором). В баке находится 50 литров чистой воды. Неожиданно в бак начинает поступать струя раствора соли с концентрацией 1/4 кг/л со скоростью 3 л/мин; при этом раствор мгновенно перемешивается. Смесь вытекает из бака со скоростью 3 л/мин так, что в баке всегда находится 50 литров раствора. Как меняется со временем содержание соли в баке? Решение: Прежде, чем думать о дифференциальном уравнении, неплохо бы сообразить как меняется количество соли в баке с течением времени. 110 Пусть A(t) будет количество соли в баке в момент времени t. Тогда A(0)=0 и с возрастанием t до бесконечности A(t) возрастает до величины 50*1/4 кг. Мы не знаем явную зависимость A(t), но можем сказать, какова скорость изменения A(t), а это и порождает необходимое нам дифференциальное уравнение. Одним словом, скорость изменения A(t) равна скорости поступления соли минус скорость ее выноса из бака. Скорость поступления соли - величина постоянная и равна 3*1/4 кг/мин. Скорость выноса соли - величина возрастающая: в любой момент времени t концентрация соли в баке равна A(t)/50 кг/л, поэтому соль выносится из бака со скоростью 3* A(t)/50 кг/мин. Это дает нам дифференциальное уравнение, которое управляет количеством соли в баке: > diffeq := diff(A(t), t) = 3/4 - 3*A(t)/50; 3 3 diffeq := A( t ) A( t ) t 4 50 Начальное значение: A(0)=0. Поэтому мы получим единственное решение с помощью dsolve. > sol := dsolve({diffeq, A(0)=0}, A(t)); 25 25 ( 3/50 t ) sol := A( t ) e 2 2 Изобразим решение в виде графика: > plot(rhs(sol), t=0..100); Можно превратить sol в функцию, что позволит ответить на любой возникающий вопрос. > A := unapply(rhs(sol), t); 25 25 ( 3/50 t ) A := t e 2 2 Например, каково количество соли в баке через одну минуту? Ответ: > A(1.), `кг`; .72794333, кг Сколько времени потребуется для того, чтобы количество соли в баке стало 10 кг? Ответ: > solve(A(t)=10, t); 50 ln( 5 ) 3 > evalf(%), `минут`; 26.82396521, минут Мы можем решить рассмотренное дифференциальное уравнение вручную, поскольку оно является уравнением с разделяющимися переменными - сепарабельным (separable equation). Иными словами, оно имеет форму y'=f(x)*g(y). Такие уравнения всегда интегрируются. Стоит лишь переписать такое уравнение в форме y'/g(y)=f(x) и проинтегрировать 111 обе части. Если повезет, то получите выражение y(x). Это - явная форма решения. Иногда же не удается получить выражение вида y(x). Тогда говорят о неявной форме решения уравнения. В нашем случае: > restart; > diffeq := diff(A(t), t) = 3/4 - 3*A(t)/50; 3 3 diffeq := A( t ) A( t ) t 4 50 3 3A Перепишем уравнение в виде A'= 3/4-3/50*A=f(t)g(A), где f(t =1 и g( A ) . То4 50 гда первообразная функции f(t)=1 есть t+C, а первообразную от A'/g(A) мы можем получить подстановкой. Интегрируя обе части уравнения, получим: > eq := int(1/(3/4-3/50*A), A)= int(1, t)+C; 50 3 3 eq := ln A tC 3 4 50 Для получения константы интегрирования воспользуемся начальным значением A=0 при t=0: > Csol := solve(subs({A=0, t=0}, eq), {C}); 50 3 Csol := { C ln } 3 4 > assign(Csol); Теперь разрешим уравнение относительно A и превратим его в функцию: > A := unapply(solve(eq, A), t); ( 3/50 t ) 25 e 1 A := t 2 e ( 3/50 t ) Вот мы и справились без dsolve! Упражнение 76. Предположим, что в баке образовалась течь при t=0, в результате из бака вытекает дополнительно 1/2 л/мин раствора. Как это повлияет на функцию A(t)? Проведите соответствующие рассуждения. Запишите новое дифференциальное уравнение, управляющее процессом. Является ли оно сепарабельным? Решите его с помощью dsolve и изобразите решение на подходящем интервале времени. Каково максимальное количество соли в баке и в какой момент времени оно реализуется? Задача 33 (Радиоактивный распад: метод определения дат с помощью C14). Было обнаружено, что кусочек угля, найденный в Стоун Хэндже (Stone Henge), содержит Углерод 14 (Carbon 14) в концентрации, которая позволяет проходить 8.2 распадов в минуту на грамм. Такой же уголь, получаемый из дерева в настоящий момент времени, как известно, обеспечивает 13.5 распадов в минуту на грамм. Известно также, что период полураспада С14 составляет 5568 лет. Полагая, что дерево сгорело при создании Стоун Хэнджа, оценить возраст этого сооружения, т.е. дату его постройки. Решение: Закон радиоактивного распада был открыт экспериментальным путем. Он заключается в том, что радиоактивные материалы распадаются, превращаясь в нерадиоактивные, со скоростью, которая пропорциональна количеству имеющегося радиоактивного материала. Выведем дифференциальное уравнение этого процесса, полагая константу распада k величиной положительной. > diffeq := diff(decay(t), t) = -k*decay(t); diffeq := decay( t )k decay( t ) t 112 Один грамм угля в тот момент времени (t=0), когда сооружался Стоун Хэндж, содержал достаточно углерода С14 для того, чтобы обеспечить 13.5 распадов в минуту, а сейчас при t=T имеет такое количество, которое обеспечивает лишь 8.2 распадов в минуту. Будем использовать число распадов в минуту как меру количества С14 в одном грамме угля. В связи с этим, начальные условия имеют вид: > conds := decay(0)=13.5; conds := decay( 0 )13.5 В принципе, можно решить задачу вручную, но воспользуемся dsolve: > soln := dsolve({diffeq, conds}, decay(t)); soln := decay( t )13.50000000 e Превратим правую часть в функцию: > decay := unapply(rhs(soln), t); ( k t ) ( k t ) decay := t13.50000000 e Определим константу распада k. Это можно сделать, используя информацию о периоде полураспада. Каждые 5568 лет количество С14 в грамме угля уменьшается вдвое, а поэтому и число распадов в минуту уменьшается вдвое. Итак: > k := solve(decay(5568)=1/2*decay(0), k); k := .0001244876402 Теперь мы можем использовать результат современных измерений (8.2 распадов в минуту на грамм) для оценки возраста Стоун Хэнджа: > age_of_Stone_Henge := solve(decay(t)=8.2, t); age_of_Stone_Henge := 4004.859682 Итак, Стоун Хэндж был построен почти тогда же, когда и создан мир (согласно вычислениям епископа Ушера). Упражнение 77. Решите полученное выше дифференциальное уравнение вручную, используя то, что оно сепарабельно. 9.5.3 Логистическая кривая Логистическая кривая или кривая логистического роста (logistic growth) возникает в задаче об изменении численности населения некоторой страны, когда считается, что скорость этого изменения пропорциональна произведению численности имеющегося населения в данный момент времени на разницу между предельным и имеющимся значениями численности населения. Этот процесс описывается дифференциальным уравнением, где p(t) - численность населения, k - константа пропорциональности, а C - предельное значение численности населения. Запишем это уравнение: > restart: > deq := diff(p(t), t)=k*p(t)*(C-p(t)); deq := p( t )k p( t ) ( Cp( t ) ) t Видно, что это уравнение сепарабельно и может быть решено символически: > sol := dsolve(deq, p(t)); C sol := p( t ) ( k C t ) 1e _C1 C Довольно странный способ записи решения. Тем не менее, давайте превратим его в функцию, заменив при этом константу C1*C на C1, что не меняет сути дела. > p := t-> C/(1+C1*exp(-k*C*t)); 113 p := t C ( k C t ) 1C1 e Глядя на эту функцию, видим, что при t стремящемся к бесконечности, p(t) стремится к C. Если мы хотим моделировать изменение населения с помощью логистического уравнения, то нам нужно иметь данные о его численности в три различные моменты времени для того, чтобы иметь три уравнения для определения трех параметров k, C и C1. Предположим, что в результате переписи имеем: p(0)=10000, p(10)=20000 и p(20)=30000. Выглядит как линейная зависимость, разве нет? А как логистическая кривая приблизит эти данные? Запишем уравнения: > eq1 := p(0) = 10000; C eq1 := 10000 1C1 > eq2 := p(10) = 20000; C eq2 := 20000 ( 10 k C ) 1C1 e > eq3 := p(20) = 30000; eq3 := Теперь найдем значения параметров > sln :=solve({eq1, eq2, eq3}, {C, C1, k}); 1 sln := { C40000, C13, k ln( 3 ) } 400000 превратим решение в функцию > f := unapply(subs(sln, p(t)), t); 1 f := t40000 ( 1/10 ln( 3 ) t ) 13 e и нарисуем получившуюся логистическую кривую: > plot([40000, f], 0..70, color=black); Где находится точка перегиба (inflection point)? В общем случае, она находится в точке > solve(diff(p(t), t, t), t); 1 ln C1 kC 114 Для рассматриваемого случая получим значение: > solve(diff(f(t), t, t), t); 10 Что произойдет с нашей кривой при изменении численности населения в точке t=20? Введем параметр p20 для численности населения при t=20 и снова найдем решение. > eq3 := p(20) = p20; C eq3 := p20 ( 20 k C ) 1C1 e > sln := solve({eq1, eq2, eq3}, {C, C1, k}); 1 , p2040000 1 20000p20 1 20000p20 k ln ln p20 , 4000000000 p20 100000 p20 p20 C1 } p2040000 sln := { C400000000 Нетрудно видеть, что p20 должен быть больше, чем 20000 и меньше, чем 40000. Опять перейдем к функции, на этот раз с двумя переменными t и p20: > f := unapply(subs(sln, p(t)), t, p20); f := ( t, p20 )400000000 1 p20 e ( p2040000 ) 1 1/4000000000 ln 20000p20 p20 1/100000 ln 20000p20 p20 p20 400000000 p20 40000 p2040000 Теперь можно получить анимацию процесса изменения кривой численности населения при изменении значений параметра p20 в полученном выше диапазоне. > plots[animate](f(t, p20), t=0..150, p20=21000..39000, color=red); Заметили, где появляется точка перегиба? Что она характеризует? ЗАКЛЮЧЕНИЕ В пособии рассмотрены технологии решения задач с использованием интерактивной системы компьютерной математики Maple. Описаны правила общения с пакетом. 115 СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 1. Дьяконов В.П. Математическая система Maple V R3/R4/R5. –М.:Солон,1998. 2. Манзон Б.И. Maple V Power Edition. –М.:Филинъ, 1998. 3. Прохоров Г В Колбеев В В Желнов К И Леденев М А "Математический пакет Maple V Release 4 Руководство пользователя" -Калуга: Облиздат, 1998. 4. Материалы сайтов: www.maplesoft.com, www-math.math.rwth-aachen.de . 116 СОДЕРЖАНИЕ ВВЕДЕНИЕ ……………….…………………………………………………………………… 3 1 КОНЦЕПЦИИ Maple ………………………………………………………………… 3 1.1 Четыре свойства Maple ………………………………………………………… 4 1.2 Рабочий лист ..…………………………………………………………………… 6 1.3 Познакомимся с языком ………………………………………………………… 6 1.4 Эксперимент …………………………………………………………………….. 6 2 ОСНОВЫ Maple ……………………………………………………………………… 7 2.1 Арифметика ……………………………………………………………………… 7 2.2 Выражения, имена, операторы и присвоения ………………………………… 8 2.3 Функции ………………………………………………………………………… 9 2.3.1 Кусочно определенные функции ……………………………………… 11 2.3.2 Композиция функций ………………………………………………….. 12 2.3.3 Встроеные функции Maple и операции с функциями ………………. 13 2.4 Maple как графический калькулятор …………………………………………… 13 2.5 Типы данных ……………………………………………………………………… 14 2.5.1 Последовательность выражений ……………………………………… 15 2.5.2 Множество типа list ………………………………………………… 15 2.5.3 Множества типа set ……………………………………………………18 2.5.4 Множества типов table и array ……………………………………19 2.6 Операторы Maple для управления вычислениями ………………………………20 2.7 Краткий словарь Maple …………………………………………………………. 22 2.8 Задание ваших собственных слов ……………………………………………….. 24 2.9 Использование Пакетов Maple ………………………………………………….. 26 2.10 Анимация (мультипликация) …………………………………………………… 27 2.11 Как избежать ошибок …………………………………………………………… 29 3 РЕШЕНИЕ ЗАДАЧ. ВВЕДЕНИЕ …………………………………………………… 31 3.1 Что такое задача? …………………………………………………………………. 31 3.1.1 Этапы решения задачи …………………………………………………. 32 3.1.2 Задача о бассейне для плавания ………………………………………. 32 3.2 Четыре метода решения уравнений …………………………………………… 33 3.2.1 Метод проб и ошибок ……………………………………………………33 3.2.2 Вручную, как бы с карандашом и бумагой …………………………… 33 3.2.3 Графический метод решения ………………………………………… 34 3.2.4 Метод с использованием слова fsolve ……………………………… 34 3.3 Еще немного о графиках …………………………………………………………. 35 3.4 Введение параметра ……………………………………………………………… 36 3.5 Ваши собственные слова в Maple ……………………………………………… 37 3.5.1 Создание процедур ……………………………………………………… 37 3.5.2 Визуальная проверка ответа …………………………………………… 39 4 ЕЩЕ ЗАДАЧИ…………………………………………………………………….……. 41 4.1 Задача о биллиардном шаре ……………………………………………………... 41 4.2 Вариация на предыдущую тему ………………………………………………… 42 4.3 Задача о баке с водой …………………………………………………………… 43 4.4 Задача о лестнице ………………………………………………………………… 44 4.5 Еще задача о лестнице …………………………………………………………… 45 4.6 Вариация на предыдущую тему ……… ………………………………………….47 117 5 ДИФФЕРЕНЦИРОВАНИЕ И ЕГО ПРИМЕНЕНИЕ ………………………………… 47 5.1 Определяем производные ……………………………………………………….. 48 5.2 Пакет student ………………………………………………………………….. 48 5.3 Метод Ньютона …………………………………………………………………… 50 5.4 Производные и графики функций ………………………………………………. 51 5.5 Неявное дифференцирование ……………………………………………………. 53 5.6 Задачи на максимум и минимум ………………………………………………….54 6 ЕЩЕ ЗАДАЧИ НА МАКСИМУМ И МИНИМУМ…………………………………… 56 6.1 Неожиданные (max-min) – задачи ……………………………………………… 56 6.2 Разные задачи ………………………………………………………………………58 7 ИНТЕГРИРОВАНИЕ………………………………………………………………….. 63 7.1 Суммирование …………………………………………………………………….. 63 7.1.1 Использование слов Sum и sum ……………………………………… 63 7.1.2 Римановы суммы и пакет student …………………………………... 64 7.1.3 Две задачи о площадях ………………………………………………… 64 7.2 Использование слов int и Int ………………………………………………… 66 7.3 Нахождение центра массы тела ………………………………………………… 71 7.3.1 Центр массы проволоки ………………………………………………… 71 7.3.2 Центр массы тела вращения …………………………………………… 72 8 ОБРАТНЫЕ ФУНКЦИИ ……………………………………………………………………74 8.1 Полезная функция - натуральный логарифм ………………………………… 74 8.2 Экспоненциальная функция (экспонента) ……………………………………… 78 8.3 Обратные тригонометрические функции ……………………………………… 81 9 ТЕХНИКА ИНТЕГРИРОВАНИЯ И ЕЕ ПРИМЕНЕНИЯ ……………………………… 83 9.1 Задачи символьного интегрирования …………………………………………… 83 9.1.1 Замена переменной …………………………………………………… 84 9.1.2 Интегрирование по частям …………………………………………… 84 9.1.3 Тригонометрические подстановки ………………………………………85 9.1.4 Интегрирование рациональных функций …………………………….. 86 9.2 Задачи численного интегрирования ………………………………………………87 9.2.1 Формула трапеций ……………………………………………………… 87 9.2.2 Правило Симпсона ………………………………………………………89 9.3 Полиномы Тэйлора ………………………………………………………………. 92 9.4 Последовательности и ряды ………………………………………………………96 9.4.1 Последовательности …………………………………………………… 96 9.4.2 Периодические точки функций ……………………………………… 97 9.4.3 Ряды …………………………………………………………………… 101 9.4.4 Две необычные кривые ……………………………………………… 104 9.5 Дифференциальные уравнения ………………………………………………… 107 9.5.1 Терминология ……………………………………………………………107 9.5.2 Задачи, приводящие к уравнениям первого порядка ……………… 109 9.5.3 Логистическая кривая ………………………………………………… 112 ЗАКЛЮЧЕНИЕ ……………………………………………………………………………… 114 СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ ………………………………………... 115 118 Спиридонов Фёдор Фёдорович Смирнов Виталий Васильевич Баранов Евгений Юрьевич Решение задач с помощью Maple V Учебное пособие Редактор Идт Л.И. Технический редактор Малыгина Ю.Н. Подписано в печать 06.07.2001. Формат 61х86 /8 Усл. п. л. 14,33 Уч. - изд. л. 14,74 Печать – ризография, множительно-копировальный аппарат «RISO TR - 1510». Тираж 100 экз. Заказ 2001- 56 Издательство Алтайского государственного технического университета 656099, г. Барнаул, пр. Ленина, 46 Оригинал-макет подготовлен ВЦ БТИ АлтГТУ Отпечатано на ВЦ БТИ АлтГТУ 659305, г. Бийск, ул. Трофимова, 29. 119 Ф.Ф. Спиридонов, В.В. Смирнов, Е.Ю. Баранов РЕШЕНИЕ ЗАДАЧ С ПОМОЩЬЮ Maple V Учебное пособие Барнаул 2001 120