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

Система аналитических вычислений MAXIMA для физиков-теоретиков

.pdf
Скачиваний:
0
Добавлен:
15.08.2026
Размер:
995 Кб
Скачать

28. СПЕЦИАЛЬНЫЕ ФУНКЦИИ

121

присоединенные функции Лежандра 1-го и 2-го рода индексов «n,m» assoc_legendre_p(n,m,x) assoc_legendre_q(n,m,x)

полиномы Чебышева 1-го и 2-го рода индекса «n» chebyshev_t(n,x) chebyshev_u(n,x)

полиномы Лягерра индекса «n» и обобщенные полиномы Лягерра индексов «n,a»

laguerre(n,x) gen_laguerre(n,a,x)

полиномы Эрмита индекса «n» hermite(n,x)

полиномы Якоби индексов «n,a,b» jacobi_p(n,a,b,x)

полиномы Гегенбауэра индексов «n,a» ultraspherical(n,a,x);

Кроме того, определены две «справочные» функции:

Функция orthopoly_recur

печатает рекурсивную формулу для полиномов. Ее первый аргумент — имя функции, вычисляющей полиномы, второй — список, составленный из имен индексов и имени переменной. Порядок имен такой же, как при вызове функции.

orthopoly_recur(chebyshev_t,[k,z]);

Tk+1(z) = 2 Tk(z) z - Tk-1(z)

Функция orthopoly_weight

печатает список, составленный из веса, нижней границы интервала и верхней границы интервала, на котором определены полиномы. Ее первый аргумент — имя функции, вычисляющей полиномы, второй — список, составленный из имен индексов и имени переменной. Порядок имен такой же, как при вызове функции.

orthopoly_weight(chebyshev_t,[n,x]);

[

1

, - 1, 1]

sqrt(1 - x2)

Семейство эллиптических функций.

122

MAXIMA ДЛЯ ФИЗИКОВ-ТЕОРЕТИКОВ

Определены обычные эллиптические функции Якоби:

jacobi_sn(x,m) jacobi_cn(x,m) jacobi_dn(x,m)

Кроме того, определены явно избыточные функции:

jacobi_ns(x,m)

jacobi_nc(x,m)

jacobi_nd(x,m)

ns(x, m) = 1/sn(x, m),

nc(x, m) = 1/cn(x, m),

nd(x, m) = 1/dn(x, m)

jacobi_sc(x,m)

jacobi_sd(x,m)

 

sc(x, m) = sn(x, m)/cn(x, m),

sd(x, m) = sn(x, m)/dn(x, m)

jacobi_cs(x,m)

jacobi_cd(x,m)

 

cs(x, m) = cn(x, m)/sn(x, m),

cd(x, m) = cn(x, m)/dn(x, m)

jacobi_ds(x,m)

jacobi_dc(x,m)

 

ds(x, m) = dn(x, m)/sn(x, m),

dc(x, m) = dn(x, m)/cn(x, m)

Кроме того, определены функции, обратные ко всем перечисленным:

inverse_jacobi_sn(x,m) inverse_jacobi_cn(x,m) inverse_jacobi_dn(x,m)

inverse_jacobi_ns(x,m) inverse_jacobi_nc(x,m) inverse_jacobi_nd(x,m)

inverse_jacobi_sc(x,m) inverse_jacobi_sd(x,m) inverse_jacobi_cs(x,m) inverse_jacobi_cd(x,m) inverse_jacobi_ds(x,m) inverse_jacobi_dc(x,m)

Кроме того, определены эллиптические интегралы:

elliptic_kc(m)

elliptic_ec(m)

π/2

 

1 m sin2 x dx

π/2

kc(m) =

 

ec(m) =

 

1 − m sin2 x dx

 

 

 

1

 

 

 

 

0

 

 

 

 

0

 

 

 

 

 

 

 

 

Наконец, определены неполные эллиптические функции:

elliptic_f(x,m) elliptic_e(x,m)

ϕ

1

 

 

ϕ

 

1 − m sin2 x dx

f (ϕ, m) =

 

m sin2 x dx e(ϕ, m) =

 

 

 

 

 

1

 

 

 

0

 

 

 

 

0

 

 

 

 

 

 

 

 

elliptic_eu(x,m) elliptic_pi(n,x,m)

28. СПЕЦИАЛЬНЫЕ ФУНКЦИИ

123

 

 

sn(x,m)

 

 

 

 

 

 

 

 

eu(x, m) =

 

 

 

t2

2

 

dt

 

 

1

 

 

 

 

 

 

 

 

1

 

mt

 

 

 

 

 

 

 

0

 

 

 

 

 

 

 

 

ϕ

 

 

 

1

 

 

 

 

 

 

p i(n, ϕ, m) =

 

 

 

 

 

 

 

dx

 

 

 

 

 

 

 

 

 

 

1

n sin2 x

1

m sin2 x

0

 

 

 

 

 

 

 

124

MAXIMA ДЛЯ ФИЗИКОВ-ТЕОРЕТИКОВ

29. Транслятор и компилятор в MAXIM’е

Если Вы определили какую-либо функцию, то Вы можете заметно ускорить ее выполнение, если оттранслируете или откомпилируете ее. Ускорение происходит потому, что без трансляции или компиляции каждый очередной вызов функции вынуждает MAXIM’у заново выполнять те действия, которые входят в определение функции, т. е. при каждом вызове происходит анализ («parsing») соответствующего выражения на уровне синтаксиса MAXIM’ы, что выполняется довольно медленно.

Функция translate

транслирует функцию MAXIM’ы на язык LISP.

f(x):=1+x+x^2+x^3+x^4+x^5+x^6+x^7$

translate(f);

[f]

После этого функция (как правило) начинает считаться быстрее.

Функция compile

сначала транслирует функцию MAXIM’ы на язык LISP, а затем компилирует эту функцию LISP’а до двоичных кодов и загружает их в память.

(%i9) compile(f);

Compiling /tmp/gazonk_1636_0.lsp.

End of Pass 1.

End of Pass 2.

OPTIMIZE levels: Safety=2, Space=3, Speed=3

Finished compiling /tmp/gazonk_1636_0.lsp.

(%o92) [f]

После этого функция (как правило) начинает считаться еще быстрее, чем после трансляции.

Следует иметь в виду, что как при трансляции, так и при компиляции MAXIMA старается оптимизировать функцию по скорости, не заботясь об аккуратности. Поэтому при работе с большими по объему функциями могут возникнуть чудеса. В этом случае следует отказаться от трансляции или компиляции либо переписать функцию.

29. ТРАНСЛЯТОР И КОМПИЛЯТОР В MAXIM’Е

125

Выигрыш во времени существенным образом зависит от типа машины, от вида функции, от того, декларирован ли тип функции и ее аргумента при определении функции, от типа аргумента, с которым вызывается функция.

Если предполагается использовать функцию только для работы с действительными числами (например, для вычисления определенного интеграла с помощью функции «romberg» или поиска корня с помощью функций «find_root» и «newton»), то обязательно следует декларировать тип аргумента и самой функции как «float». Это во много раз усилит эффект от трансляции или компиляции.

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

Были определены четыре разные функции, вычисляющие одно и то же выражение:

f1(x):=1+x+x^2+x^3+x^4+x^5+x^6+x^7+x^8+x^9$

f2(x):=block([s],s:1,for i:1 thru 9 do s:s+x^i,s)$

f3(x):=block([],mode_declare([function(f),x],float),

1+x+x^2+x^3+x^4+x^5+x^6+x^7+x^8+x^9)$

f4(x):=block([s],mode_declare([function(f),x,s],float),

s:1, for i:1 thru 9 do s:s+x^i,s)$

Форму записи двух последних функций («f3» и «f4») следует воспринимать аксиоматически.

Далее каждая из этих функций вызывалась с аналитическим аргументом «s» (кроме «f3» и «f4», для которых аналитический аргумент невозможен), целочисленным аргументом «7» и вещественным аргументом «0.3».

После этого все четыре функции были оттранслированы ([t]) и эксперимент был повторен.

Наконец, все четыре функции были откомпилированы ([c]) и эксперимент снова был повторен.

Ниже приведены соответствующие (условные) времена исполнения функций.

Приведенные цифры дают весьма богатый материал для анализа. Во-первых, хорошо заметно, насколько трудоемкой оказывается

процедура упрощения. Функция «f1» задана в виде явной формулы, и ее

126

 

 

MAXIMA ДЛЯ ФИЗИКОВ-ТЕОРЕТИКОВ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

s

7

 

0.3

[t] s

[t] 7

[t] 0.3

[c] s

[c] 7

[c] 0.3

 

 

f1

8.75

4.75

 

4.22

7.32

3.52

3.04

6.98

3.25

2.75

 

 

f2

17.73

12.44

 

12.03

9.11

4.80

4.09

7.83

3.20

2.67

 

 

f3

 

5.39

 

4.87

 

2.72

2.17

 

1.67

1.23

 

 

f4

 

13.30

 

12.75

 

3.45

2.91

 

2.47

1.94

 

вычисление сводится к однократной подстановке, в то время как функция «f2» требует упрощения на каждом обороте цикла, что фатально сказывается на скорости ее вычисления. Зато и эффект от трансляции или компиляции для неявных функций типа «f2» оказывается гораздо заметнее.

Во-вторых, заметно, что экономия времени для «более простых» числовых аргументов (по сравнению с символьными аргументами) оказывается не такой уж радикальной, хотя и довольно существенной. Это связано с тем, что числа все равно рассматриваются как элемент аналитического выражения, хотя упрощение аналитического выражения, составленного исключительно из чисел, идет быстрее.

В-третьих, заметно, что для функций, которые декларированы как вещественные функции от вещественных аргументов, вычисление от целочисленного аргумента идет медленнее, чем от вещественного аргумента.

В-четвертых, очень хорошо видно, что если Вы не выполняете компиляцию для вещественной функции, то Вы рискуете замедлить ее вычисление более чем в 6 раз.

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

127

30. Задачи и упражнения

Задача 1.

Классические ортогональные полиномы.

Вычислить первые 20 полиномов (n = 0, . . . , 19), пользуясь формулой Родрига, рекуррентной формулой, производящей функцией и гипергеометрической функцией (или вырожденной гипергеометрической функцией). Сравнить полученные ответы. Сравнить эффективность приведенных формул (по времени счета).

Гипергеометрическая функция определяется как

 

ab x1

(a)2(b)2 x2

(a)3(b)3 x3

F (a, b, c, x) = 1 +

 

 

 

+

 

 

 

+

 

 

 

+ · · · ,

c

1!

(c)2

2!

(c)3

3!

а вырожденная гипергеометрическая функция определяется как

Φ(a, c, x) = 1 +

a x1

(a)2 x2

(a)3 x3

 

 

 

+

 

 

 

+

 

 

 

+ · · · ,

c

1!

(c)2

2!

(c)3

3!

где (a)n = a(a + 1)(a + 2) · · · (a + n − 1).

Вариант 1

Полиномы Лежандра.

Pn (x) = (1)n n (1 − x2)n 2nn! x

(n + 1)Pn+1 = (2n + 1)xPn − nPn−1

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Pn(x)zn =

 

 

 

 

 

 

n=0

 

1

 

2xz + z

 

 

 

 

 

 

 

 

 

 

P = F

n, n + 1, 1,

1 − x

.

2

n

 

 

 

 

 

 

 

128

MAXIMA ДЛЯ ФИЗИКОВ-ТЕОРЕТИКОВ

Вариант 2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Полиномы Чебышева 1-го рода.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(1)n

 

 

 

 

 

 

 

 

 

(1

 

 

 

 

 

 

T

(x) =

 

 

 

1

 

 

x2n

 

 

x2)n−1/2

2n(1/2)n

 

n

 

 

 

 

 

 

 

 

 

x

 

 

 

 

 

 

 

 

 

 

 

Tn+1 = 2xTn − Tn−1

 

 

 

 

 

 

 

 

 

 

 

1 + 2

Tn(x)zn =

 

 

1 − z2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

2xz + z2

 

 

 

 

 

 

 

 

n=0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

T

n

= F

n, n, 1/2,

1 − x

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

Вариант 3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Полиномы Чебышева 2-го рода.

 

 

 

 

 

 

 

 

 

 

 

 

 

U

(x) =

(1)n(n + 1)

 

 

 

 

1

 

 

 

n

(1

x2)n+1/2

2n+1(1/2)n+1

 

 

 

 

 

 

 

 

n

 

 

 

 

 

1 − x2

x

 

 

 

 

 

 

 

 

 

 

Un+1 = 2xUn − Un−1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Un(x)zn

 

=

 

 

 

2xz + z2

 

 

 

 

 

 

 

n=0

 

 

 

 

1

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

U

 

= (n + 1)F

 

 

 

n, n + 2, 3/2,

1 − x

.

 

 

 

 

 

 

Вариант 4

Полиномы Гегенбауэра индекса λ = 2.

Gλ

(x) =

 

(1)n(2λ)n

(1

x2)1/2−λn

(1

x2)n+λ−1/2

,

2nn!(λ + 1/2)n

n

 

 

 

x

 

 

 

 

 

(n + 1)Gnλ+1 = 2(n + λ)xGnλ (n − 1 + 2λ)Gnλ1,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Gnλ (x)zn = (1 2xz + z2)−λ,

 

 

 

 

 

 

n=0

 

 

 

2

 

 

n

 

n!

 

 

 

 

 

Gλ

=

(2λ)n

F

 

 

n, n + 2λ, λ + 1/2,

1 − x

.

 

 

 

 

 

 

 

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

129

Вариант 5

 

 

 

 

 

 

 

 

 

 

Полиномы Якоби индексов α = 1, β = 0.

 

 

 

 

 

P α,β (x) =

(1)n

(1

x)−α(1 + x)−β n

(1

x)n+α(1 + x)n+β

,

2nn!

n

 

x

 

 

α,β

 

 

2(n + 1)(n + α + β + 1)(2n + α + β)P

=

 

 

 

 

 

 

 

 

 

n+1

 

 

= (2n + α + β + 1){(2n + α + β)(2n + α + β + 2)x + α2 − β2}Pnα,β − −2(n + α)(n + β)(2n + α + β + 2)Pnα,β1,

Pnα,β (x)zn =

n=0

= 2α+β (1 2xz + z2)1/2(1 − z + 1 2xz + z2)−α×

 

×(1 + z +

1 2xz + z2

)−β ,

2

n

n!

 

 

 

P α,β (x) =

(α + 1)n

F

 

n, n + α + β + 1, α + 1,

1 − x

.

 

 

 

Вариант 6

Полиномы Эрмита.

Hn(x) = (1)n exp(x2)xn exp(−x2) ,

Hn+1 = 2xHn 2nHn−1,

Hn(x)zn /n! = exp(2xz − z2)

n=0

H2m = (1)m(2m)! Φ(−m, 1/2, x2), m!

H2m+1 = (1)m(2m + 1)! 2xΦ(−m, 3/2, x2). m!

130

MAXIMA ДЛЯ ФИЗИКОВ-ТЕОРЕТИКОВ

Вариант 7

Полиномы Лягерра индекса α = 1.

n (

α

n!

 

x

α

 

Lα

x) =

1

exp(x)x

 

α

n

exp(

x)xn+α

 

 

 

 

(n + 1)Ln+1 = (α + 2n + 1 − x)Ln (n + α)L

 

 

 

exp(xz/(z − 1))

Ln(x)αzn =

 

 

 

 

(1

z)α+1

n=0

 

 

 

 

 

 

Lnα =

(α + 1)n

Φ(−n, α + 1, x).

n!

 

α

n−1

** *

Эта задача является чисто тренировочной. Тем не менее она позволяет: во-первых получить первые навыки работы с MAXIM’ой на сравнительно простом примере, во-вторых, продемонстрировать отличие MAXIM’ы от алгоритмических языков (при выполнении этой задачи с неизбежностью возникает стандартная ошибка — попытка определить функцию p(n,x), что было бы вполне естественно для языка «С»; при использовании MAXIM’ы следует, разумеется, определять массив p[n]), в-третьих, продемонстрировать, что речь идет об аналитических вычислениях (при выполнении этой задачи нередко ответы, полученные разными способами, выписываются на бумажке и сравниваются, вместо того чтобы использовать саму MAXIM’у для их сравнения).

Задача 2.

Автоматическая генерация программы на языке «C».

Написать программу, которая создает файл, который является программой на языке «C», работающей под компилятором gcc. Ручная правка (за исключением, если это покажется неизбежным, стирания первой пары строк в файле) полученного файла не допускается. Программа должна определять две функции:

double f(double x) — исходная функция; double T(double x) — ряд Тейлора;

и сравнивать результат разложения функции

1

f (x) = 5 + sin(x)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]