File: phi0_plot.py

package info (click to toggle)
codec2 0.9.2-4
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 113,072 kB
  • sloc: ansic: 412,877; python: 4,004; sh: 1,540; objc: 817; asm: 683; makefile: 588
file content (80 lines) | stat: -rwxr-xr-x 1,658 bytes parent folder | download | duplicates (2)
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
#!/usr/bin/python3

""" Plot phi0, and (later) anaylze approximations

"""

import numpy as np
import matplotlib.pyplot as plt

import math
import itertools
import sys

def impl_reference(x):
    if (x< 9.08e-5 ): r = 10
    else:
        z = math.exp(x)
        r = math.log( (z+1) / (z-1) )
    return(r)

####
# Table T1

t1_tbl = []  # A list of tuples (x, r)
t1_adj = 0.50  # Offset ratio for step of 1, estimate

def t1_loop(upper, lower, step):
  for i in range((int)(upper * step), (int)(lower * step), -1):
    x = i / step
    z = math.exp(x + (t1_adj / step))
    r = math.log((z+1)/(z-1))
    t1_tbl.append( (x, r) )
    print(x, r)

# 9:5 step 1
t1_loop(9, 4.999, 2)

# 5:1 step 1/16
t1_loop(4.999, 0.999, 16)

# 1/(2^0.5), 1/(2^1), 1/(2^1.5), ...
for i in range(1, 28):
    e = (2 ** (i/2))
    x = 1.0 / e
    z = math.exp(x + (0.19 / e))
    r = math.log((z+1)/(z-1))
    t1_tbl.append( (x, r) )

def impl_t1(x):
    if (x > 10): return(0)
    else:
        for t in t1_tbl:
            if (x > t[0]): return(t[1])
    return(10)



##########################
# Plot, scanning from 10 to 0
x_vals = np.logspace(1, -4, 2000, endpoint=False)
ref_vals = []
t1_vals = []
for x in x_vals:
    ref_vals.append(impl_reference(x))
    t1_vals.append(impl_t1(x))

# Sum errors
errsum = errsum2 = 0
for i in range(len(ref_vals)):
    error = t1_vals[i] - ref_vals[i]
    errsum += error
    errsum2 += error * error
print("Net error {}".format(errsum))
print("avg error {}".format(errsum/len(ref_vals)))
print("rms error {}".format(math.sqrt(errsum2/len(ref_vals))))

plt.xscale('log')
plt.plot(x_vals, ref_vals, 'g', x_vals, t1_vals, 'r')
plt.show()