1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
"""Some plots for Laguerre Polynomials."""
import os
from pathlib import Path
import matplotlib.pyplot as plt
import numpy as np
import scipy.special as ss
def get_ticks(start, end, step=1):
ticks = np.arange(start, end, step)
return ticks[ticks != 0]
N = 1000
step = 5
t = np.linspace(-1.05, 10.5, N)[:, None]
root = str(Path(__file__).parent)
img_path = f"{root}/../images"
os.makedirs(img_path, exist_ok=True)
# fig = plt.figure(num=1, clear=True, tight_layout=True, figsize=(5.5, 3.7))
# ax = fig.add_subplot(axes_class=AxesZero)
fig, ax = plt.subplots(num=1, clear=True, constrained_layout=True, figsize=(6, 4))
for n in np.arange(0, 8):
k = np.arange(0, n + 1)[None]
L = np.sum((-1) ** k * ss.binom(n, k) / ss.factorial(k) * t ** k, -1)
ax.plot(t, L, label=f"n={n}")
ax.set_xticks(get_ticks(int(t[0]), t[-1]), minor=True)
ax.set_xticks(get_ticks(0, t[-1], step))
ax.set_xlim(t[0], t[-1] + 0.1 * (t[1] - t[0]))
ax.set_xlabel(r"$x$", x=1.0, labelpad=-10, rotation=0, fontsize="large")
ylim = 13
ax.set_yticks(np.arange(-ylim, ylim), minor=True)
ax.set_yticks(np.arange(-step * (ylim // step), ylim, step))
ax.set_ylim(-ylim, ylim)
ax.set_ylabel(r"$y$", y=0.95, labelpad=-18, rotation=0, fontsize="large")
ax.legend(ncol=2, loc=(0.125, 0.01), fontsize="large")
# set the x-spine
ax.spines[["left", "bottom"]].set_position("zero")
ax.spines[["right", "top"]].set_visible(False)
ax.xaxis.set_ticks_position("bottom")
hlx = 0.4
dx = t[-1, 0] - t[0, 0]
dy = 2 * ylim
hly = dy / dx * hlx
dps = fig.dpi_scale_trans.inverted()
bbox = ax.get_window_extent().transformed(dps)
width, height = bbox.width, bbox.height
# manual arrowhead width and length
hw = 1.0 / 60.0 * dy
hl = 1.0 / 30.0 * dx
lw = 0.5 # axis line width
ohg = 0.0 # arrow overhang
# compute matching arrowhead length and width
yhw = hw / dy * dx * height / width
yhl = hl / dx * dy * width / height
# draw x and y axis
ax.arrow(
t[-1, 0] - hl,
0,
hl,
0.0,
fc="k",
ec="k",
lw=lw,
head_width=hw,
head_length=hl,
overhang=ohg,
length_includes_head=True,
clip_on=False,
)
ax.arrow(
0,
ylim - yhl,
0.0,
yhl,
fc="k",
ec="k",
lw=lw,
head_width=yhw,
head_length=yhl,
overhang=ohg,
length_includes_head=True,
clip_on=False,
)
fig.savefig(f"{img_path}/laguerre_polynomes.pdf")
|