Дьяконов В.П. Maple 9.5 и 10 в математике, физике и образовании (1185901), страница 84
Текст из файла (страница 84)
Обычно применяемый для указания пути знак ! в строках Мар1е-языка используется как знак продолжения строки. Поэтому надо использовать либо двойной знак%, либо знак l. В нашем примере файл записан в корнь диска С. Лучше поместить библиотечный файл в другую папку (например, в библиотеку, уже имеющуюся в составе системы), указав полный путь до нее.
После всего этого надо убедиться в том, что библиотечный файл записан. После этого можно сразу и считать его. Для этого вначале следует командой гев!аП устранить ранее введенные определения процедур: > геаСагс; С помощью команды уу(!)) можно убедиться в том, что этих определений уже нет: > еьсь(ву11Ь); вгхос, (хп расвап:-рехроста) ву11ь ьа пос а раскаче После этого командой геа() надо загрузить библиотечный файл: > сеас)( с:lву1~Ь.в')ю Имя файла надо указывать по правилам, указанным для команды ване. Если все выполнено пунктуально, то команда )н(!П должна показать наличие в вашей библиотеке списка процедур П, 12 и (8: > ньСЬ(ву11Ы; (11, 12, Йз) И, наконец, можно вновь опробовать работу процедур, которые теперь введены из загруженной библиотеки: > 11(х)( $!п(х) +соз(х) > а) вр11ту(Г2 (у) ) к > ЙЗ(0): > Гз(1.): ,84!4709848 Описанный выше способ создания своей библиотеки вполне устроит большинство пользователей.
Однако есть более сложный и более «продвинутый» способ ввода своей библиотеки в состав уже имеющейся. Для реализации этого Мар!е имеет следующие операции записи в библиотеку процедур в1, в2, ... и считывания их из файлов (1)е1, б!е2, ...: ване11Ь(в1, а2, ..., вп, й11епаве) теас)11Ь(й, Н1е1, Н1е2, ...) С помощью специального оператора п)аке))е(р можно задать стандартное справочное описание новых процедур: ва)сеЬе1р (и, й, Ь) где и — название темы, 1 — имя текстового файла. содержащего текст справки (файл готовится как документ Мар(е) и Ь вЂ” имя библиотеки. Системная перемен- 627 10.6. Проераммирование символьных операций ная 1)Ьпап)е хранит имя директории библиотечных файлов.
Йля регистрации со- зданной справки надо исполнить команду вида 11Ьпаае: =11Ьпаве, ' /гпу11Ь С деталями применения этих операторов можно ознакомиться в справочной системе. К созданию своих библиотечных процедур надо относиться достаточно осторожно. Их применение лишает ваши Мар!е-программы совместимости со стандартной версий Мар!е. Если вы используете одну-две процедуры, проше поместить ил в те документы, в которых они действительно нужны.
Иначе вы будете вынуждены к каждой своей программе прикладывать еше и библиотеку процедур. Она нередко оказывается большей по размеру, чем файл самого документа. Не всегда практично прицеплять маленький файл документа к большой библиотеке, большинство процедур которой, скорее всего, для данного документа попросту не нужны. Особенно рискованно изменять стандартную библиотеку Мар!е 9.5/10.
Впрочем, идти на это или нет — дело каждого пользователя. Разумеется, если вы готовы создать серьезную библиотеку своих процедур, то ее надо записать, тшательно хранить и подробно документировать. 10.6. Программирование символьных операций 10.6.1. Реализация итераций Ньютона в символьном виде Найти достаточно простую и наглядную задачу, решение которой отсугствует в системе Мар!е 9.5/10, не очень просто. Поэтому для демонстрации решения задачи с применением аналитических методов воспользуемся примером, ставшим классическим — реализуем итерационный метод Ньютона при решении нелинейного уравнения видящих) = О.
Как известно, метод Ньютона сводится к итерационным вычислениям по следуюшей формуле (файл р9): х;,) = х, + Яхт'(х,). Реализуюшая его процедура выглядит довольно просто: > геасагс: и1:=ргсс(ехрг,х) 1оса1 1сег; 1еег:=х-ехрг/О1ГГ(ехрг,х) ппарр1у () еег, х) епе; лч: = ргос(ехрг, х) 1оса1 ггег, пег: = х — ехрг(())й'(ехрг, х); опарр!у(пег, х) евй ргос Для получения итерационной формулы в аналитическом виде здесь используется функция цпарр!у. Теперь, если задать решаемое уравнение, то можно получить искомое аналитическое выражение: > ехрг:=а1п(х)"2-0.5) елрг:= я)п(х)1 — .5 > Г:=И1(ехрг,х); Г:=х -+ х-— 1 з(п(х)1 — .5 2 яп(х) сох(х) Глава 10. 'Типовые средства программирования Далее, задав начальное приближение для х в виде х = хе, можно получить результаты вычислений для ряда итераций: > хО: 0.2г хР:= .2 > Со 8 По хО:=Г(хО);сею хО:= 1.382611210 хО:= .117460944 хР:= 2.206529505 хО:= 2.360830634 хО:= 2.356194357 хО:= 2.356194490 хР ."= 2.356194490 хО ."= 2.356! 94490 Нетрудно заметить, что, испытав скачок в начале решения, значения х довольно быстро сходятся к конечному результату, дающему корень заданной функции.
Последние три итерации дают одно и то же значение х. Заметим, что этот метод дает только одно решение, даже если корней несколько. Вычислить другие корни в таком случае можно, изменив начальное условие. Можно попробовать с помощью полученной процедуры получить решение и для другой функции: > ехрг:=1п(х"2]-0.5; ехрг: = 1п(хг) — .5 > г:=нт(ехрх,х); р:= х -+ х --(!п(х') — 5)х 1 2 » хО:=0.2; хО:= 2 > со 8 бо хОг=в(хО)(об) хО:= .55718875825 хО:= 1.034437603 хО:= !.258023119 хО:= 1.283760340 хО:= 1.284025389 хО:= 1.284025417 хО:= 1.284025416 хО:= 1.2840254!7 629 10.6. Программирование символьных олераций Здесь итерационная формула имеет (и вполне естественно) уже другов вид, но сходимость к корню также обеспечивается за несколько итераций.
Возможна и иная форма задания итерационной процедуры с применением оператора дифференцирования (3 и заданием исходной функции также в виде процедуры (файл р9): > Н1: рсос(Г::рсосеоосе) > (х->х)-е«а)(г)уо(е«а1(Г))с > епб; ))11: = ргпс(1':: ргосениге) (х -+ х) -ета!(1)/(3 (ета1(1 )) епв ргос > Ч:=х->х-сое(х)ю 8."=х-+ х-сов(х) > ат:=мт(д) х -+ х — сов(х) х -+ 1+йп(х) > хо:=О.т; хО:= .1 > Со б Оо хО:=51(хО) ос)ю хО>» .9137633858 хд:= . 7446642419 хО:= .73909!9660 хО:= . 7390851333 хО:= .7390851332 хО:= .7390851332 Вообще говоря, в программных процедурах можно использовать любые операторы и функции, присущие Мар!е-языку, в том числе и те, которые реализуют символьные вычисления. Это открывает широкий простор для разработки новых процедур и функций, обеспечивающих выполнение символьных операций.
10.6.2. Вычисление интеграла по известной формуле Рассмотрим следующий пример (файл р9): > ? пе (е" х*х" и, х) =Ьпе (е" х*х" и, х); е*х" «(х=-(-1) )п(е) (х" (-1)" 1п(е)" и Г(п) ( — х 1п(е)) » ("ын) п п ( ) — х" (-1)" )п(е)" е -х" (-1)" !п(е)" и (-х )п(е) ) Г( и, -х !п(е))) Ранние версии системы Мар1е не брали этот интеграл, поскольку он не имеет аналитического представления через обычные функции. Мар!е блестяще вычисляет этот «крепкий орешек», но полученное выражение довольно сложно. Из математики известно, что такой интеграл может быть представлен в следующем виде: ~ х"е"Ых = !е"~(-1)""— са (! ма ю ° вс оюнг.
ю.рил о у е у Используя эту формулу, мы можем создать простую процедуру для численного и аналитического вычисления данного интеграла: > ?псЕхриоповьа1:=рхоо (п::апусл1пд,х::паве) 1оса1 33 и ! *ехр (х) *пав[ ((-1) " (п-1) *х"3) /1 !, 1=0 ..п); еиаг 1п(ЕхрМопо4п(а1: = ргос(п:: апу(е(пЕ, х:: лате) !Оса) (; П!хЕХР(Х) хзОП)((-!)" (П вЂ” 1) и Х" 1/1), (' = — .. П) ев() ргос Проверим ее в работе: > 1псехрноповта1 (3, х]; 6 е" -1+х — — Х3 + — х) ! ! 2 6 > 1пСЕхриоповха1(5,х) 120 е" -1+х — — х + — х — — х + — х3 1 2 ! 3 1 4 2 6 24 120 > тпСЕхриопов3а1(п,х) п )(х()'"'(-! — п)Г(1+ п,х) +(-1)"(! + п)!(-х)') "' + х('"'Г(2 4 п)) (! + п)!( — Х)п "1 Результат в аналитическом виде довольно прост для данного интеграла с конкретным значением и.
Более того, мы получили несколько иной результат и для п в общем случае. Но точен ли он? Для ответа на этот вопрос продифференцируем полученное выражение: > саге (ъ, х) г х (-1)" (1+ п)!(-х)п'")(1+ п) х(' "'(1+ п)Г(2 + п) Х х (-х)('"') — п! Результат дифференцирования выглядит куда сложнее, чем вычисленный интеграл. Однако с помощью функции в!гпр!!(у в Мар1е 9 он упрощается к подынтегральной функции: > а3вр11Гу(%)( е» х' Мар!е 9.5 выдал более замысловатое выражение: (-1)" е' (-х)" Это говорит о том, что задача вычисления заданного интеграла в аналитической форме действительно решена. А что касается громоздкости результатов, так 631 1О.б. Программирование символьных операций ведь системы, подобные Мар!е, для того и созданы, чтобы облегчить нам работу с громоздкими вычислениями — в том числе аналитическими.
10.6.3. Вложенные процедуры и интегрирование по частям Теперь мы подошли к важному моменту, о котором читатель наверняка уже давно догадался — в составляемых пользователям процедурах можно использовать ранее составленные им (или кем-то еше) другие процедуры! Таким образом, Мар1е-язык позволяет реализовать процедуры, вложенные друг в друга. Для иллюстрации применения вложенных процедур рассмотрим операцию интегрирования по частям. Пусть нам надо вычислить интеграл ) р(х)е'дх, где р(х) — выражение, представляющее полином. Вначале подготовим процедуру (п(ЕхрМопоп)(аЯ, реализуюшую вычисление уже рассмотренного ранее интеграла, но рекурсивным способом (файл р9): > тпгЕхрмопов1а1к:=ргос(п:."поппео1пг,х::паве) 1оса1 1;1Г п=О гьеп КЕТОКИ(ехр(х)) Г1( х"п*ехр (х) -п*1пГЕхрмоповьа1К(п-1,х); епбг 1п(Ехрйопот(а(Я: = ргое(т: поппее !и(, х:: пате) !оса! й 1Г и = О Г))ев й ЕТ() й)Ч(ехр(х)) епй 11; х" и х ехр* х) — и х 1п(ЕхрМопоп)!а( к(п — 1, х) епй рюс Проверим ее в работе: > 1пгЕхрмоповеа1К (4, х); х4 е" — 4 хз е" + 12 х) е" — 24 х е" + 24 е' > со11еое (Ъ, ехр (х) ) (хг -4х) +12х) -24х+24)е" Теперь составим процедуру лля вычисления по частям нашего интеграла: > 1пГЕхрро1уповьа1:=ргос(р::ро1упов,х::паве) 1оса1 1, геап1Г; Н() ИАКНХНС: беогее(с,х) пои гееогпв -1пГ1пггу геаи1г:=абб(соегг(р,х,г)*1пгехрмопов1а1К(г,х),1=0..беогее(р,х))г со11есг (геао1г, ехр (х) ); епб; 1п(Ехрро(упит(а1: = ргос(р:: ро(упот, х:: паве) 1Оса) („ гели(П гели(г:= ай($(сое(Т(р, х, 1) х (п(ЕхрМопоп)!а)К((, х), ! = О ..