-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnumeric_methods_lab4.py
106 lines (90 loc) · 2.15 KB
/
numeric_methods_lab4.py
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
101
102
103
104
105
106
from matplotlib import pyplot as plt
import numpy
def f(x):
return numpy.tan(x / 2)
a = -1.
b = 2
N = 20
h = (b - a) / N
xF = []
yF = []
for i in range(N + 1):
xF.append(a + i * h)
yF.append(f(xF[i]))
def rectangles(eps, N):
r1 = (b - a) / N
n1 = N
r2 = r1 / 2
n2 = N * 2
result1 = 0
result2 = 0
for i in range(n1):
result1 += r1 * f(a + (i + 1 / 2) * r1)
for i in range(n2):
result2 += r2 * f(a + (i + 1 / 2) * r2)
if abs(result1 - result2) / (2 ** 2 - 1) > eps:
return rectangles(eps, N * 2)
return result1
def trapezes(eps):
n = N
r = h
count = 0
while r ** 2 > eps:
r /= 2
n *= 2
count += 1
result = (r / 2) * (f(a) + f(b))
for i in range(1, n):
result += r * f(a + r * i)
return result, count, n
def simpson(eps):
n = N
r = h
count = 0
while r ** 4 > eps:
r /= 2
n *= 2
count += 1
result = f(a) + f(b) + 4 * f(a + r / 2)
for i in range(1, n):
result += 2 * f(a + i * r) + 4 * f(a + (i + 1 / 2) * r)
result *= r / 6
return result, count, n
def gauss4():
t1 = t4 = 0.861136
t2 = t3 = 0.339981
t4 *= -1
t3 *= -1
c1 = c4 = 0.347855
c2 = c3 = 0.652145
result = c1 * f((b + a) / 2 + (b - a) * t1 / 2) + c2 * f((b + a) / 2 + (b - a) * t2 / 2)
result += c3 * f((b + a) / 2 + (b - a) * t3 / 2) + c4 * f((b + a) / 2 + (b - a) * t4 / 2)
result *= (b - a) / 2
return result
def gauss5():
t1 = t5 = 0.90618
t2 = t4 = 0.538469
t3 = 0
t5 *= -1
t4 *= -1
c1 = c5 = 0.23693
c2 = c4 = 0.47863
c3 = 0.56889
result = c1 * f((b + a) / 2 + (b - a) * t1 / 2) + c2 * f((b + a) / 2 + (b - a) * t2 / 2)
result += c3 * f((b + a) / 2 + (b - a) * t3 / 2) + c4 * f((b + a) / 2 + (b - a) * t4 / 2)
result += c5 * f((b + a) / 2 + (b - a) * t5 / 2)
result *= (b - a) / 2
return result
eps = 0.0000001
print("Rectangles")
print(rectangles(eps, 20))
print("Trapezes")
print(trapezes(eps))
print("Simpson`s")
print(simpson(eps))
print("Gauss n = 4")
print(gauss4())
print("Gauss n = 5")
print(gauss5())
plt.plot(xF, yF)
plt.show()