Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методы аналитических вычислений

.pdf
Скачиваний:
15
Добавлен:
03.05.2015
Размер:
645.65 Кб
Скачать

> f := x -> x^2;

Первая строка определяет f как сокращенное обозначение выражения x2; вторая строка определяет f как функцию от x. После определения f таким образом, f(x) действует так, как и надлежит:

> f(3), f(10), f(x), f(y), f(a + b);

Предупреждение: Команда f(x) := x^2 делает четыре символа слева сокращенным обозначением для трех символов справа; такая команда не определяет функцию!

Авот пример векторно-значной функции двух переменных:

>h := (x,y) -> linalg[vector] ([x^2-y^2,2*x*y]): h(u,v);

[u2 v2, 2 u v]

Функции часто оказываются более полезными, чем выражения. Однако, многие команды Maple (например, diff) предполагают, что на их входе будет выражение.

Если ввести

> f:= x -> x^2, diff(f,x);

то такая команда не сработает; однако,

> diff(f(x),x);

будет работать, поскольку результатом f(x) является x2; работает также

> diff(f(y),y);

выдавая 2y . [Между прочим, имеется вариант дифференцирования для "функции"; введите

?D для получения дополнительной информации].

Когда функция "прилагается" ("applied") к переменной, то в результате получается выражение. Чтобы превратить выражение в функцию, воспользуйтесь командой unapply:

> f := unapply(x^3, x); f(3);

Эта команда часто используется в связи с solve, например:

> soln := solve( y = x^2 - a, x);

Имеются два решения, к которым можно обратиться как к soln[1] и soln[2] (обратите внимание на квадратные скобки). Предположим, что вы хотите использовать второе из этих выражений, чтобы определить функцию; это делается следующим образом:

21

>g := unapply(soln[2], a);

>g(x); g(4);

УПРАЖНЕНИЯ:

*Поэкспериментируйте со "стрелочным обозначением" для создания функций.

*Поэкспериментируйте с выражениями и командой unapply для создания функций.

Процедуры

Функции являются частным случаем процедур. Процедура - это совокупность команд, подобная "подпрограмме" в некоторых компьютерных языках.

Функция, определенная выше как f := x -> x^2; это то же, что и

> f := proc(x) x^2 end;

Процедуры полезны для более сложных работ, которые могут охватывать много строк, учитывать выбор из многих различных случаев, или выполнять много действий. Рассмотрим еще один короткий пример процедуры:

> sqroot := proc(x)

#Вычисляет квадратный корень по методу Ньютона local xstart, xnew, i;

xstart := 1.;

for i from 1 to 100 do

xnew := ( xstart + x/xstart )/2;

print(xnew);

if abs(xnew - xstart)/xnew < 10^(-4) then RETURN() fi; xstart := xnew;

od;

end:

Заметим, что для получения нескольких строк после одного приглашения к вводу ">" следует воспользоваться Shift+Enter.

22

После создания этой процедуры, она дает:

> sqroot(2);

1.500000000

1.416666667

1.414215687

1.414213563

УПРАЖНЕНИЯ:

*Напишите процедуру bigger, такую, чтобы команда bigger(n,m); печатала true если n больше чем m, и false, если n меньше чем m.

*Напишите процедуру squaresum, вычисляющую сумму квадратов первых 100 натураль-

ных чисел (т.е., 1+4+9+...+10000).

*Сравните вашу squaresum(100) с sum(n^2, n=1 .. 100).

*Видоизмените вашу процедуру squaresum так, чтобы вычислять сумму первых N квадратов, где N это любое натуральное число.

8. ПОИСК И УСТРАНЕНИЕ ОШИБОК

Хотя на первых порах ошибки в работе с Maple могут очень вас смущать, вы быстро приобретете опыт, необходимый для того, чтобы понимать и исправлять их. Приведем список наиболее распространенных ошибок и способов их устранения.

1.Оканчивается ли оператор точкой с запятой или двоеточием?

2.Сбалансированы ли круглые скобки, фигурные скобки, квадратные скобки и т.д.? Набор символов наподобие {x, y} хорош, но x, y} может привести к ошибке.

3.Не пытаетесь ли вы использовать что-либо в качестве переменной, которой вы уже присвоили значение? Чтобы "очистить" переменную x, скажите unassign('x') или x:='x'. Вы можете очистить сразу несколько переменных, например, unassign('x', 'y'). Вам не придется перезагружать какие-либо пакеты. Помните, что переменная, которой присвоено значение, не может более работать как переменная. Чтобы отобразить значение простой переменной, введите ее имя с последующей точкой с запятой, например, > x;

4.Если дело кажется безнадежно запутанным, дайте команду > restart; После этого вам придется перезагрузить все необходимые пакеты.

5.Не используете ли вы функцию, когда было вызвано выражение, или наоборот? Помните, ff:=x^2+y^2 определяет выражение, тогда как f:=(x,y)->x^2+y^2 определяет функцию. Имеет смысл сказать f(1,3), но нет никакого смысла говорить ff(1,3).

23

6.Не используете ли вы = когда требуется := ? Помните, что первое это проверка на равенство, в то время как второе присваивает значение переменной.

7.Различаете ли вы три вида кавычек? Это: " (двойная кавычка), ' (одинарная кавычка – апостроф), и ` (обратная кавычка).

8.В операторах цикла, do должно быть сбалансировано последующим od. В условных операторах, if должно быть сбалансировано последующим fi.

9. Определение процедуры, которое начинается с

proc(…), должно завершаться

последующим end. После proc(…) точка с запятой не ставится!

10.Если вы используете функцию из пакета, загрузите сначала пакет. Так, чтобы использовать matrix, загрузите linalg; чтобы использовать display, загрузите plots. Вы загрузите linalg командой with(linalg).

11.Не путайте unassign с unapply.

12.Не забывайте использовать ? для получения подробной справки о функции Maple, например, ?plot для получения информации о plot, или просто ? для получения общей информации.

9. ЗАДАНИЯ И УПРАЖНЕНИЯ

1.

Упростите выражение

4 + 2 3 .

 

1

17 1 x9 )dx .

2.

Вычислите (9 1 x17

 

0

 

3.Вычислите первую и вторую производные от sin x cos x по x.

4.Дан многочлен: y(x) = x3 - 4x2 + 4x - 1 . Найдите корни этого многочлена и все его локальные минимумы и максимумы. Проконтролируйте это решение, построив график функции y(x).

5.Дано f = x2 - 4. Вычислите интегралы от f и 1/f по x. Проверьте правильность результа-

тов путем их дифференцирования.

6.

Вычислите следующие интегралы:

et dt

и

 

et2 dt .

 

 

0

 

 

0

 

 

1000

 

 

1

 

7.

Вычислите следующие суммы:

k

и

 

.

 

2

 

 

k =1

 

k =1

k

8. Получите формулу для суммы первых n натуральных чисел, а также для суммы квадра-

n

n

тов первых n натуральных чисел, т.е. вычислите и упростите суммы: k

и k 2 .

k =1

k =1

24

9.

Дана функция h(x) =1 x +sin x. Определите эту функцию в Maple и вычислите значе-

ние функции h при x = 2.0; затем постройте график этой функции в области [-5,5].

10.

Введите в Maple следующую матрицу A:

 

 

 

 

a

0

 

 

 

5

 

A =

1

1

1 .

 

 

a

0

 

 

 

0

 

1. Вычислите характеристический многочлен для A.

 

Указание: Воспользуйтесь командами charmat и det в пакете линейной алгебры

 

linalg.

 

 

 

 

2. Вычислите собственные значения матрицы A.

 

Указание: Воспользуйтесь командами solve

и factor, чтобы найти корни характе-

ристического многочлена.

11. Воспользуйтесь командой solve для решения линейной системы:

4x 5y =11,

2x + y = 9.

12. Найдите разложение функции sin(x) в ряд Тейлора до членов порядка 6 в точке x = 0, используя команду taylor. Затем с помощью команды convert преобразуйте полученное выражение в многочлен (без остаточного члена). Для наглядного представления о точности такой аппроксимации постройте одновременно графики sin(x) и полученного многочлена 6-

й степени при x [0,4].

12a. Повторите такие же операции для разложения sin(x) в ряд Тейлора до членов порядка 10.

13.Решите задачи NN 12, 12a, но с использованием команды series (и стандартной переменной Order, определяющей порядок разложения.

14.Используйте команду limit, чтобы найти пределы функции:

a)

f (x) =

x2 2x +1

,

при x1.

x4 +3x3 7x2 + x + 2

 

f (x) =

2x + 3

 

 

b)

7x +5 , при x→ ∞.

 

Теперь рассмотрим задания, связанные с дифференциальными уравнениями. Для решения дифференциальных уравнений можно, в частности, использовать команду дифференцирования diff и команду – "решатель ОДУ" dsolve.

25

15. Решите систему ОДУ:

x'(t) = −x(t) + ay(t ), y'(t ) = bx(t ) y(t ).

при начальных условиях x(0) = 1, y'(0) = 0. 16. Решите ОДУ 2-го порядка:

a)y(x) + y"(x) = ex

при начальных условиях y(0) = 1, y'(0) = 0.

б) y"(t) + 5 y'(t) + 6 y(t) = 0

при начальных условиях y(0) = 0, y'(0) = 1.

Примечание: Команда дифференцирования для функции имеет вид D, для выражений эта команда имеет вид diff.

17. Решите ОДУ 4-го порядка: 106 yIV(x) = δ(x-2) - δ(x-4)

при граничных условиях на y(x) и y"(x):

y(0) = 0,

y"(0) = 0,

y(5) = 0,

y"(5) = 0.

Дельта-функция Дирака δ(x) в Maple записывается как Dirac(x).

Решение этой краевой задачи сохраните под именем "soln", а затем постройте график найденной функции для x = 0..5.

18.Решите систему двух ДУ 2-го порядка: y"(x) = z(x),

z"(x) = y(x),

не вводя дополнительных условий. Maple создаст соответствующие константы C1,...,C4.

Общие указания к NN 15-18:

1.Проверьте правильность найденных вами решений дифференциальных уравнений путем их подстановки в уравнения.

2.Попробуйте поработать с пакетом "DEtools"

26

ПРИЛОЖЕНИЕ 1.

Maple V Release 5: КРАТКАЯ СПРАВКА

Символы и сокращения

 

 

Символ

Описание

Пример

 

:=

присваивание

f := x^2/y^3;

 

;

 

завершение команды; результат отобра-

int := ( x^2, x );

 

 

 

жается

 

 

:

 

завершение команды: результат не ото-

int := ( x^2, x ):

 

 

 

бражается

 

 

..

 

определение диапазона или интервала

plot ( t*exp(-2*t), t=0..3 );

 

 

 

 

 

 

{

}

ограничитель множества (множество это

{ y, x, y };

 

 

 

неупорядоченный список)

 

 

[

]

ограничитель списка (списки упорядо-

{ y, x, y };

 

 

 

чены)

 

 

%

ссылка на предыдущий результат (знак

Int( exp(x^2), x=0..1 ):

 

 

 

процента)

% = evalf( % );

 

 

 

Примечание: В предыдущих версиях это

 

 

 

 

был знак " (кавычки)

 

 

 

 

 

 

 

"

"

ограничитель строки (двойные кавычки)

plot( sin(10*x) + 3*sin(x), x=0..2*Pi,

 

(см. ?strings)

Примечание: Появился в Release 5

title="An interesting plot"

 

` `

ограничитель имени (обратные апост-

`A name` := `This is a name`;

 

(см. ?names)

рофы)

 

 

'

'

отмена присваивания (апострофы)

x := 'x';

 

(см. ?uneval)

 

 

 

->

определение отображения (функции)

f := ( x, y ) -> x^2*sin(x-y);

 

 

 

 

f( Pi/2,0 );

 

@

оператор композиции

( cos@arcsin )(x);

 

@@

повторный оператор композиции

( D@@2 ) ( ln );

 

$

 

формирование последовательности вы-

( i^2+1 ) $ i=1..5;

 

 

 

ражений

diff( exp(a*x), x$4 );

Математические операции, функции и константы

 

 

 

 

 

 

 

 

Символ

Описание

Пример

 

+, -, *, /, ^

сложение, вычитание, умножение, деле-

3*x(-4) + x/Pi;

 

 

 

ние, возведение в степень

 

 

sin, cos, tan,

тригонометрические функции

sin( theta-Pi/6 ) – sec( theta^2 );

 

cot, sec, csc

 

 

 

arcsin, arccos,

обратные тригонометрические функции

arctan( 2*x );

 

arctan, arccot,

 

 

 

arcsec, arccsc

 

 

 

exp

экспоненциальная функция

exp( 2*x );

 

ln

натуральный логарифм

ln( x*y/2 );

 

log10

обычный логарифм (по основанию 10)

log10( 1000 );

 

abs

абсолютное значение

abs( (-3)^5 );

 

sqrt

квадратный корень

sqrt( 24 );

 

!

 

факториал

k!;

 

=, <>, <, <=, >,

равенства и неравенства

diff( y(x), x ) + x*y(x) = F(x);

 

>=

Примечание: E больше не существует,

exp(Pi) > Pi^exp(1);

 

 

 

пользуйтесь exp(1)

 

 

Pi, I

π, i (математические константы)

Exp( Pi*I );

 

 

 

Примечание: Maple чувствителен к ре-

 

 

 

 

гистру клавиатуры

 

 

infinity

Бесконечность ( )

Int( x^(-2), x=1..infinity );

27

Команды

Команда

Описание

Пример

restart

отмена всех определений Maple

restart;

with

загрузка пакета Maple

with( Detools ); with( plots );

help

отображение интерактивной справки

?DEplot

 

Maple

 

limit

вычисление предела

limit( sin(a*x)/x, x=0 );

diff

вычисление производной выражения

diff( a*x*exp(b*x^2)*cos(c*y), x );

int

определенное или неопределенное

int( sqrt(x), x=0..Pi );

 

интегрирование

 

Limit

инертная (отложенная) форма limit

Limit( sin(a*x)/x, x=0 );

Diff

инертная (отложенная) форма diff

Diff( a*x*exp(b*x^2)*cos(c*y), x );

Int

инертная (отложенная) форма int

Int( sqrt(x), x=0..Pi );

value

вычисление инертного выражения

G := Int( exp(–x^2), x );

 

(обычно используется с Limit, Diff или

value( G );

 

Int)

 

plot

создание 2-мерного графика функций

plot( u^3, u=0..1, title="cubic" );

 

 

plot( [sin(x), cos(x)], x=0..Pi );

plot3d

создание 3-мерного графика функций

plot3d(sin(x)*cos(y),x=0..4*Pi,y=0..Pi);

display

отображение графических структур

with( plots ):

 

(в пакете plots)

F:=plot( exp(x), x=0..3, style=line );

 

 

G:=plot( 1/x, x=0..3, style=point );

 

 

display( [F,G], title=”2 curves” );

solve

решение уравнений или неравенств

solve( x^4 – 5*x^2 + 6*x = 2, { x } );

fsolve

решение с использованием арифметики с

fsolve( t/10 + t*exp(-2*t) = 1, t );

 

плавающей запятой

 

dsolve

решение обыкновенных дифференци-

dsolve( diff(y(x),x)-y(x)=1, y(x) );

 

альных уравнений; список возможных

 

 

опций см. в ?dsolve

 

odeplot

создание 2D и 3D графиков из решений,

with( plots ):

 

полученных при помощи dsolve

S:=diff(x(t),t)=-y(t),diff(y(t),t)=x(t):

 

type=numeric); другие опции см. в

IC:=x(0)=1,y(0)=1:

 

?odeplot (в пакете plots)

P:=dsolve({S,IC}, {x(t),y(t)}, numeric):

 

 

odeplot(P, [ [t,x(t)], [t,y(t)] ], 0..Pi);

 

 

odeplot(P, [x(t),y(t)], 0..Pi);

DEplot

создание графика, связанного с ОДУ или

ODE := diff( y(x),x ) = 2*x*y(x);

 

системой ОДУ; дополнительная инфор-

DEplot( ODE, [y(x)], x=-2..2,

 

мация в ?Deplot (в пакете DEtools)

y=-1..1, arrows=SMALL );

D

дифференциальный оператор (часто ис-

ODE := diff(y(x),x$2) + y(x) = 1;

 

пользуется при записи производных в

IC := y(0)=1, D(y)(0)=1;

 

начальных условиях для dsolve)

dsolve( { ODE, IC }, y(x) );

subs

подстановка значений в выражение

subs( x=r^(1/3), 3*x*ln(x^3) );

simplify

применение правил упрощения для вы-

simplify( exp( a+ln(b*exp(c)) ) );

 

ражений

 

factor

разложение многочлена на множители

factor( (x^3-y^3) / (x^4-y^4) );

convert

преобразует выражение к другому виду

convert( x^3 / (x^2-1), parfrac, x );

collect

собирает коэффициенты при

collect( (x+1)^3*(x+2)^2, x );

 

одинаковых степенях

 

rhs

правая часть уравнения

rhs( y = a*x^2 + b );

lhs

левая часть уравнения

lhs( y = a*x^2 + b );

numer

извлекает числитель выражения

numer( (x+1)^3 / (x+2)^2 );

denom

извлекает знаменатель выражения

denom( (x+1)^3 / (x+2)^2 );

evalf

вычисляет значение с использованием

evalf( exp( Pi^2 ) );

 

арифметики с плавающей запятой

 

evalc

вычисляет значение комплексного

evalc( exp( alpha+I*omega ) );

 

выражения (возвращает значение в виде

 

 

a+I*b)

 

28

evalb

вычисляет значение логического выра-

evalb( evalf( exp(Pi) > Pi^exp(1) ) );

 

жения (возвращает true или false)

 

assign

выполняет присваивания (часто исполь-

S:=solve( {x+y=1, 2*x+y=3}, {x,y} );

 

зуется с solve или dsolve)

assign( S ); x; y;

seq

создает последовательность

sec( [0,i], i=-3..3 );

for while

оператор повторения; см. синтаксис

tot := 0;

do od

do for

for i from 11 by 2 while i < 100 do

 

 

tot := tot + i^2

 

 

od;

assume

информирует Maple о дополнительных

assume( t > 0 );

 

свойствах объектов

 

about

проверяет предположения об объектах

about( t );

 

Maple

 

ПРИЛОЖЕНИЕ 2.

ПОСТРОЕНИЕ СПЛАЙН-ПОВЕРХНОСТИ СРЕДСТВАМИ Maple V

В качестве примера, иллюстрирующего возможность использования системы Maple V при решении сложных содержательных проблем, рассмотрим задачу построения и визуализации сплайн-поверхности, восстанавливающей функцию двух переменных по ее значениям в конечном числе произвольных точек плоскости (см., например: Сплайн-поверхности: Методическая разработка. Сост. В.О. Ашкеназы. - Тверь: Тверской гос. ун-т, 1993).

Если функция двух переменных f (x, y) задана своими значениями в конечном числе то-

чек:

{(xi , yi ), fi = f (xi , yi ); i =1, N },

то ее можно интерполировать сплайн-поверхностью Sp (x, y) , которая является решением вариационной задачи

 

2Sp

2

 

2Sp

 

2

 

2Sp

2

 

 

J 2 (Sp)=

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

2

 

 

 

 

 

x

 

 

+ 2

 

 

 

+

y

 

 

 

dx dy min,

 

 

 

 

 

 

 

x y

 

 

 

 

 

 

−∞ −∞

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Sp (xi , yi )= fi , i =1, N.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Это решение имеет достаточно простой вид:

 

 

 

 

N

 

 

(x, y)ln ri2 (x, y)+ kN +1 + kN +2 x + kN +3 y ,

 

Sp (x, y)= ki ri2

 

 

 

 

i =1

 

 

 

 

 

 

 

где r2 (x, y)= (x x

)2

+ (y y

)2 .

 

 

 

 

 

i

i

 

 

i

 

 

 

 

 

 

 

Коэффициенты

ki ,

i =

 

 

значения

которых и

определяют сплайн-поверхность

1, N + 3,

Sp (x, y), находятся из решения системы N`+3 линейных алгебраических уравнений:

 

 

 

 

Sp (x j , y j )= f j ,

j =

 

;

 

 

 

 

 

1, N

 

 

 

 

N

 

 

N

 

N

 

 

 

 

 

 

 

 

 

 

 

 

 

ki = 0; xi ki = 0; yi ki

= 0;

 

 

 

 

i=1

 

 

i=1

 

i=1

 

29

Решение существует и является единственным, если N 3 и среди N точек (xi , yi ) най-

дутся три точки, не лежащие на одной прямой.

 

 

 

 

 

Погрешности восполнения функции

f (x, y) сплайн-поверхностью Sp (x, y) можно оце-

нить нормами:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

δ2 =

 

 

 

ϕ f

 

 

 

 

L 2(Ω)

=

1

 

 

∫∫

(f (x, y)ϕ(x, y))2 dxdy

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ω

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ω

 

 

 

 

 

средняя квадратическая погрешность;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

δ=

 

 

 

ϕ f

 

 

 

 

C (Ω) =

sup

 

f (x, y)ϕ(x, y)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(x, y ) Ω

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

максимальная абсолютная погрешность.

А теперь запишем соответствующую программу на языке Maple V Release 5.

Построение сплайн-поверхности*

Начнем с того, что зададим некоторую тестовую функцию:

>restart;

>f: = (x,y) -> x^2 + y^2;

Вызовем необходимые для дальнейшей работы пакеты linalg и plots :

> with (linalg): with (plots):

Warning, new definition for norm Warning, new definition for trace

Опишем процедуру ввода случайной последовательности N точек в квадрате 1 < x, y 1 :

> Vv := proc (N) local p,pt,i; p := rand (-100..100);

pt := [seq (p(i)/100., i = 1..2*N)]; matrix (N, 2, pt);

end:

Теперь зададим N=10 и получим соответствующий двумерный массив T, содержащий координаты десяти узлов интерполяции:

>N := 10:

>T := Vv(N):

Сформируем матрицу MM системы линейных алгебраических уравнений для вычисления коэффициентов сплайн-поверхности:

> Ro := proc (x1,x2,y1,y2) local r; r := (x1-x2)^2 + (y1-y2)^2;

if r = 0 then 0 else r*ln(r) fi end:

>M := matrix (N, N, []):

>i := 1:

>while i <= N do M [i, i] := 0;

* Первоначальный вариант этой Maple-программы был разработан Соколовой Н.А. в 1998 г.

30